plsql-获取第一行-哪一行更好?

plsql-获取第一行-哪一行更好?,sql,oracle,plsql,Sql,Oracle,Plsql,或者这个: 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; 以上两种方法的效果相似,但我需要知道哪一种更有效 这是汤姆·凯特的咒语: 如果可能的话,您应该在一条SQL语句中执行此操作。 如果不能在单个SQL

或者这个:

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;

以上两种方法的效果相似,但我需要知道哪一种更有效

这是汤姆·凯特的咒语:

如果可能的话,您应该在一条SQL语句中执行此操作。
如果不能在单个SQL语句中执行,请在PL/SQL中执行。
如果不能在PL/SQL中执行此操作,请尝试使用Java存储过程。
如果不能在Java中执行,请在C外部过程中执行。
如果您不能在C外部例程中执行此操作,您可能需要认真思考为什么需要执行此操作


在这种情况下,最简单的方法是测试您的查询

请确保自己进行测试,表中的索引和数据可能会与表产生不同的结果。

在没有任何索引的情况下,似乎有更好的方法使用分析函数:


我使用以下代码测试查询所花费的时间(执行此块数次,结果可能会有所不同):


结果:

  • 使用光标,获取第一行:
    2.241秒

  • 使用带有
    ROWNUM
    的查询:
    1.483秒

  • 使用
    densite\u-RANK

    1.168秒

  • select x.id
    from(select t.id
         from table1 t
         where t.foo=p_foo
         order by t.creation_date) x
    where rownum = 1
    
    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;