我有一个非常缓慢和简单的查询,我正在尝试改进,它的目的是获取第一次失败的单元的日期,如下所示:
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
它们都返回完全相同的记录,但是第二个记录要快 10 倍,现在我的问题是,这两个查询真的等效吗?为什么第二个要快得多?
谢谢你!