2012-03-11 8 views
5
LV_id number; 
Cursor CR_test Is 
    select t.id 
    from table1 t 
    where t.foo = p_foo 
    order by t.creation_date; 

Open CR_test; 
Fetch CR_test 
Into LV_id; 
Close CR_test; 

か、この1:plsql - 最初の行を取得する - どちらが良いですか?

select x.id 
from(select t.id 
    from table1 t 
    where t.foo=p_foo 
    order by t.creation_date) x 
where rownum = 1 

はどちらも上記同様の結果を作るが、私は1つが、より効率的であるかについて知られている必要があります!

答えて

7

これはトム・カイトのモットーです:可能なすべての場合は、単一のSQL文でそれを行う必要があります


これを単一のSQL文で実行できない場合は、PL/SQLで実行します。
PL/SQLで実行できない場合は、Javaストアド・プロシージャを試してください。
Javaで実行できない場合は、Cの外部プロシージャで実行します。
あなたがC外部ルーチンでそれを行うことができない場合、あなたは真剣に、あなたがそれを行うために必要されている理由について考えたいかもしれません...このケースで見つけるために

http://tkyte.blogspot.com/2006/10/slow-by-slow.html

3

最も簡単な方法はにありますあなたの質問をテストしてください。

これを自分でテストしてください。テーブルのインデックスとデータによって、テーブルで異なる結果が生じることがあります。分析機能DENSE_RANKを使用してより良い方法があるように任意のインデックスなし

、それが見えます:

SELECT MIN(id) KEEP (DENSE_RANK FIRST ORDER BY creation_date) 
INTO lv_id 
FROM table1 
WHERE foo = p_foo; 

私は(いくつかのこのブロックを実行し、クエリによって消費される時間をテストするには、次のコードを使用しました回、結果)が変化してもよい:

DECLARE 
    p_foo table1.foo%TYPE := 'A'; 
    lv_id table1.id%TYPE; 
    t  TIMESTAMP := SYSTIMESTAMP; 
BEGIN 
    FOR i IN 1 .. 100 LOOP 
    -- Query here 
    END LOOP; 
    dbms_output.put_line(SYSTIMESTAMP - t); 
END; 


1.483秒

  • DENSE_RANKを使用:クエリを使用
    2.241秒

  • ROWNUM有する:最初の行をフェッチカーソルを使用

    1. 、:結果
      1.168 s

  • +0

    +1非常に良い統計解析 –

    関連する問題