データベース
Table1
Id
Table2Id
...
Table2
Id
StartTime
Duration //in hours
クエリ
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and starttime + Duration/24 > :endtime
現在、このクエリの実行には約 2 秒かかっていますが、これは長すぎます。id 列にはインデックスがあり、Start_time+duration/24 には関数インデックスがあります。Sql Developer では、クエリ プランはインデックスが使用されていないことを示しています。このクエリは、テストの開始時間と終了時間に対して 475 行を返します。テーブル 2 には最大 80 万行あります テーブル 1 には最大 20 万行あります
期間/24 の計算がクエリから削除され、静的な値に置き換えられた場合、クエリ時間は半分に短縮されます。これはまったく同じデータを取得するわけではありませんが、除算にはコストがかかると思われます。
(starttime + duration/24) が設定された Table2 に endtime 列を追加することもテストしました。この列は、単一の更新によって事前設定されました。本番環境で使用する場合は、更新トリガーを介して設定します。
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and endtime > :endtime
このクエリは約 600 ミリ秒で実行され、結合にはインデックスが使用されます。冗長データを含む列が追加されるため、理想的とは言えません。
このクエリを高速化する方法はありますか?