改善しようとしている非常に遅くて単純なクエリがあります。その目的は、ユニットで初めて失敗した日付を取得することであり、次のとおりです。
select unit_id, min(fail_Date) fail_Date
from failures
having min(fail_date) between '24-aug-2012' and '25-aug-2012'
group by unit_id
Unit_idは一意ではないことが推測されるかもしれませんが、これは障害が発生したユニットを識別するための外部キーです。この表には、同じユニットが複数回障害が発生した場合の複数のレコードがあります。
これが最善の方法ではないことはわかっていますが、テーブルを制御することはできず、そのまま使用する必要があります。
このテーブルには、fail_dateとunit_idのインデックスがあります。
それにもかかわらず、このクエリには10秒かかります。どうすれば高速化できるのでしょうか?しかし、それから私は値を照会するためにこの方法に来ました、そしてそれは0.03秒しかかかりません:
with fail_dates as
(select unit_id, fail_date
from failures
where fail_date between '24-aug-2012' and '25-aug-2012')
select f.unit_id, min(f.fail_Date) fail_Date
from fail_dates
inner join failures f
on fail_dates.unit_id= f.unit_id
group by f.unit_id,fail_dates.fail_date
having min(f.fail_Date) = fail_dates.fail_date
どちらもまったく同じレコードを返しますが、2番目のレコードは10倍高速です。私の質問は、この2つのクエリは本当に同等ですか?そして、なぜ2番目の方がはるかに速いのですか?
ありがとう!