У меня есть таблица 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.