0

テーブル 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を試しています。

4

0 に答える 0