sql:如何改进这个语句

时间:2010-08-10 12:32:22

标签: sql ibatis

我有以下sql语句,我需要更快。 有500k行,我是'HARDWARE_ID'的索引,但这仍然需要一秒钟才能执行。

有没有人有任何想法?

    select 
        * 
    from 
        DEVICE_MONITOR DM 
    where 
            DM.DM_ID = (
        select 
            max(DM_ID)
        from 
            DEVICE_MONITOR  
        where
            HARDWARE_ID=#value#
    ) 

我发现以下索引也是一个很好的帮助...

在DEVICE_MONITOR上创建索引DM_IX4(DM_ID,HARDWARE_ID);

在我的测试中,它将运行时间从26秒降低到20秒。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

DM_ID的索引应创建为asc

问题可能在于你发现了非常快速的匹配形式HARDWARE_ID,但是那些记录必须排序以从中获取最大值并且此操作非常耗时。

尝试比较这些陈述:

1    #result = select max(DM_ID) from DEVICE_MONITOR where HARDWARE_ID=#value#

2    select * from  DEVICE_MONITOR DM where DM.DM_ID = #result

查询1是问题,因为您将看到2正在更快地运行

如果创建了索引,并且查询仍然运行缓慢,则可以更新统计信息。但其他查询可能只会更慢。

如果可能而不是*仅使用您真正需要的列

答案 1 :(得分:1)

考虑将“*”更改为仅需要的属性列表。通常情况下,这可以大大提高你的速度。

答案 2 :(得分:0)

如果您在DM_ID上有聚簇索引,那么这看起来就像是最快的查询。

编辑:Ack。丹尼尔有正确的答案。错过了。