2012-03-11 19 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; 

o esta otra:plsql - obtener la primera fila - ¿cuál es mejor?

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

Tanto arriba, establecieron resultado similar pero necesito sabe acerca de cuál es más eficiente!

Respuesta

7

Este es el mantra de Tom Kyte:

debe hacerlo en una sola instrucción SQL, si es posible.
Si no puede hacerlo en una sola instrucción de SQL, hágalo en PL/SQL.
Si no puede hacerlo en PL/SQL, intente con un Procedimiento almacenado de Java.
Si no puede hacerlo en Java, hágalo en un procedimiento externo C.
Si no puede hacerlo de una rutina externa C, es posible que desee pensar seriamente acerca de qué es lo que necesita hacer es ...

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

3

La manera más fácil de averiguar en este caso es de prueba tus consultas

Asegúrese de probar esto usted mismo, los índices y los datos en su tabla pueden producir resultados diferentes con su tabla.

Sin ningún índice, parece que hay un método mejor uso de la función analítica DENSE_RANK:

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

que utiliza el código siguiente para probar el tiempo consumido por sus consultas (ejecutar este bloque de varias veces, los resultados pueden variar):

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; 

Resultados:

  1. Utilizando el cursor, ir a buscar la primera fila:
    2.241 s

  2. Usando consulta con ROWNUM:
    1.483 s

  3. Uso DENSE_RANK:
    1.168 s

+0

+1 para muy buen análisis con estática –

Cuestiones relacionadas