1

次のようなOracleのクエリがあります。

  SELECT 
    t1.tid, t1.column1, t1.column2
  FROM 
    table1 t1
    JOIN 
    log_table lg ON t1.tid = lg.tid
  WHERE
    t1.insert_date > lg.date_of_insert
    AND lg.log_id = (SELECT MAX(log_for_last.log_id) FROM log_table log_for_last WHERE lg.tid = log_for_last.tid)
    AND t1.insert_date = (SELECT MAX(t1_last_date.insert_date) FROM table1 t1_last_date WHERE t1_last_date.tid = t1.tid);

しかし、完了するまでに多くの時間がかかります。問題は次の行にあります。

 AND t1.insert_date = (SELECT MAX(t1_last_date.insert_date) FROM table1 t1_last_date WHERE t1_last_date.tid = t1.tid);

t1.tidは一意である必要があります。このクエリを最適化するにはどうすればよいですか?

編集:

私は次のことを試みましたが、それは私にSQLエラーを与えます: ORA-00904: "RN": 無効な識別子エラー:

SELECT 
   t1.tid, t1.column1, t1.column2,
   ROW_NUMBER() OVER (ORDER BY t1.insert_date DESC) rn
FROM 
   table1 t1
   JOIN 
   log_table lg ON t1.tid = lg.tid
WHERE
   t1.insert_date > lg.date_of_insert
   AND lg.log_id = (SELECT MAX(log_for_last.log_id) FROM log_table log_for_last WHERE lg.tid = log_for_last.tid)
   AND rn = 1

前もって感謝します

4

2 に答える 2

4

私は次のように問題を解決しました:

 SELECT *
 FROM
 (
     SELECT 
        t1.tid, t1.column1, t1.column2,
        ROW_NUMBER() OVER (PARTITION BY t1.tid ORDER BY t1.insert_date DESC) rn
     FROM 
        table1 t1
     JOIN 
        log_table lg ON t1.tid = lg.tid
     WHERE
        t1.insert_date > lg.date_of_insert
       AND lg.log_id = (SELECT MAX(log_for_last.log_id) FROM log_table log_for_last WHERE lg.tid = log_for_last.tid)
)
WHERE rn = 1

他の人のお役に立てば幸いです。

于 2012-08-01T06:28:40.977 に答える
0

その行が(各行で評価される以外に)非常に時間がかかる理由を特定できますか。クエリの計画を見て、時間がどこに向かっているのかを確認することをお勧めします。パフォーマンスを高速化するために新しいインデックスが必要な場合や、微妙な書き直しでうまくいく場合があります。

実行計画を確認するのに助けが必要な場合は、以下から始めることをお勧めします。

SQL * Plus FAQ-SQL * PlusからSQLステートメントをどのようにトレース(および説明)しますか?

于 2012-08-01T05:52:13.327 に答える