plsql - получить первый ряд - какой из них лучше? - PullRequest
5 голосов
/ 11 марта 2012
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;

или этот:

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

Оба приведенных выше результата дают схожий результат, но мне нужно знать, какой из них более эффективен!

Ответы [ 2 ]

7 голосов
/ 11 марта 2012

Это мантра Тома Кайта:

Вы должны сделать это в одном операторе SQL, если это вообще возможно.
Если вы не можете сделать это в одном операторе SQL, то делайте это в PL / SQL.
Если вы не можете сделать это в PL / SQL, попробуйте хранимую процедуру Java.
Если вы не можете сделать это в Java, сделайте это во внешней процедуре C.
Если вы не можете сделать это во внешней подпрограмме C, вы можете серьезно подумать о том, почему вам нужно это сделать ...

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

3 голосов
/ 11 марта 2012

Самый простой способ выяснить это - проверить ваши запросы.

Убедитесь, что проверили это самостоятельно, индексы и данные в вашей таблице могут дать разные результаты с вашей таблицей.

Без индекса, похоже, есть лучший подход с использованием аналитической функции 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. Использование курсора, выборка первой строки:
    2,241 с

  2. Использование запроса с ROWNUM:
    1,483 с

  3. Использование DENSE_RANK:
    1,168 с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...