2010-08-10 57 views
3

我有以下的sql语句,我需要更快。 有500k行,我是'HARDWARE_ID'的索引,但这仍需要一秒钟才能完成。sql:如何改进这个陈述

有没有人有任何想法?

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

我发现下面的指数也有很大的帮助......

CREATE INDEX ON DM_IX4 DEVICE_MONITOR(DM_ID,HARDWARE_ID);

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

感谢您的帮助。

+0

您是否也有DM_ID的索引? – 2010-08-10 12:36:20

回答

2

为DM_ID的指数应为ASC创建

的问题可能是这个,你发现非常快的比赛形式HARDWARE_ID,但随后这些记录必须排序来从他们max和这个操作时间耗时。

尝试比较这声明:

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工作更快

如果创建了索引和查询还是慢腾腾比,你可以更新统计数据。但其他查询可能只会工作得更慢。

如果可以代替*仅使用您真正需要的列

0

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

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

1

考虑将'*'更改为您需要的属性列表。很多时候,这可以让你大幅提高速度。

+0

完全同意你的看法。这可能会为您提供最大的性能提升。 – 2010-08-10 12:56:37