SELECT (MIN) vs ORDER BY ASC WITH FOR UPDATE

У меня есть таблица test1 (первичный ключ TXID, STATE, NEXTRUN, TARGET) и я хочу получить строку с минимальным NEXTRUN для состояния (передается в качестве входных данных).

Table Data:
-----------
TXID    STATE   NEXTRUN TARGET
2   KA  2   ANY
1   TN  1   ANY
3   KA  2   ANY
4   TN  3   A
5   KA  1   ANY

Запрос 1 с MIN():

SELECT *
  FROM test1
 WHERE NEXTRUN = (SELECT MIN(NEXTRUN)
                    FROM test1
                   WHERE TARGET = 'ANY'
                     AND STATE = 'KA')
   AND TARGET = 'ANY'
   AND STATE = 'KA'
   FOR UPDATE

План объяснения показывает (2 TABLE ACCESS FULL)

Запрос 2 с ORDER BY и ROWNUM:

SELECT *
  FROM TEST1
 WHERE TXID = (SELECT TXID
                 FROM (SELECT *
                         FROM TEST1
                        WHERE STATE = 'KA'
                          AND TARGET = 'ANY'
                        ORDER BY NEXTRUN ASC)
                WHERE ROWNUM = 1)
   FOR UPDATE

План объяснения:

(1 TABLE ACCESS FULL , 1 TABLE ACCESS BY INDEX ROWID

Какой из запросов лучше с точки зрения предотвращения взаимоблокировок и производительности? Запрос вызывается из нескольких потоков (соединений). Иногда я вижу взаимоблокировку в первом случае (где 2 TABLE ACCESS FULL). Поэтому я пытаюсь с запросом 2.


person user3544223    schedule 18.04.2014    source источник
comment
Похоже, ваш вопрос не попадает в категорию Проблема XY. Может быть, стоит переосмыслить это с точки зрения реальной проблемы, которая у вас есть? Потому что ИМХО корень вашей проблемы не в самих запросах, а в дизайне таблиц, индексах и т.д.   -  person Yaroslav Shabalin    schedule 18.04.2014
comment
Это все еще довольно близко к вашему предыдущему вопросу. Проверьте мое новое обновление, оно может решить вашу проблему. Лучше обновить существующий вопрос, чем задать новый, иначе на этом сайте будет еще больше вопросов без ответов.   -  person Jon Heller    schedule 19.04.2014