日期:2014-05-17  浏览次数:20529 次

增加一个int字段竟然让整个SQL语句的执行时间翻了几倍
本帖最后由 robake 于 2013-01-16 14:09:36 编辑
数据库:SQL2008
有下边的SQL语句:

select a.VirusNameID1,a.DateTime ,b.Name,d.ID as SpywareExclusionId,
0 as t--,VirusTypeID
 FROM VSDetections.dbo.VS_Detections365 a 
 Left join VSDetections.dbo.VS_VirusNames b ON b.Id=a.VirusNameID1 
Left join VirusScanProd.dbo.MyCIOVirusName d ON d.VirusName=b.Name
Where MID =ANY 
 (Select ID From VirusScanProd.dbo.MyCIOMachine 
Where ContactID=46) 
 --and VirusTypeID =ANY (Select VirusTypeID from VSDetections.dbo.MyCIOVirusTypeLookup 
Where Category=2)
--and VirusTypeID>=20207


目前的SQL语句在查询分析器中执行的时间非常快,可以忽略为0,但若加上显示字段VirusTypeID后或是起用条件and VirusTypeID =ANY (Select VirusTypeID from VSDetections.dbo.MyCIOVirusTypeLookup Where Category=2),整个执行时间竟然达到了15秒。


看了下数据库结构,VirusTypeID没有建索引,是int字段。

请教高手,怎样调整SQL语句,才能使性能不至于太差。

PS:VSDetections.dbo.VS_Detections365这张表里共有270万行记录。
sql 数据库

------解决方案--------------------
2008的执行计划应该会有一个missing index(英文版)/丢失索引 这个绿色的字,先按照它的建议加上试试