テーブル 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
MIN() を使用したクエリ 1:
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)
ORDER BY と ROWNUM を使用したクエリ 2:
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を試しています。