我正在通过查询SCCM数据库在我们的网络中寻找特定的软件。我的问题是,由于各种原因,有时我可以按程序名称搜索,有时我需要搜索特定的EXE。
当我运行下面的查询时,如果where子句包含AND,它是否需要13秒才能运行,但如果将AND替换为OR,它将运行几天而没有结果。我认为它这样做是因为我没有正确地加入到桌子上。我该如何解决这个问题?
select vrs.Name0
FROM v_r_system as vrs
join v_GS_INSTALLED_SOFTWARE as VIS on VIS.resourceid = vrs.resourceid
join v_GS_SoftwareFile as sf on SF.resourceid = vrs.resourceid
where
VIS.productname0 LIKE '%office%' AND SF.Filename LIKE 'Office2007%'
GROUP BY vrs.Name0
谢谢!
您的LIKE
子句在字符串开头包含一个通配符匹配:
LIKE '%office%'
这可以防止SQL Server在该列上使用索引,从而导致查询运行缓慢。理想情况下,您应该更改您的查询,以便您的LIKE
子句在开始时不使用通配符。
在WHERE
子句包含AND
的情况下,它首先基于Filename
子句进行查询(它能够在这里使用索引,因此这相对较快),然后根据productname0
子句过滤此减少的行集。但是,当您使用OR
时,它并不局限于仅返回与Filename
子句匹配的行,因此它必须搜索整个表,检查是否每个productname0
字段都匹配。
这是一篇很好的微软文章http://msdn.microsoft.com/en-us/library/ms172984.aspx关于改进索引。请参阅带有过滤子句的索引一节(重申前面的答案)
您是否尝试过沿着这些行而不是类似的查询?
…where product name in ('Microsoft Office 2000','Microsoft Office xyz','Whateverelse')