我通过查询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
谢谢!
答案 0 :(得分:1)
您的LIKE
子句在字符串的开头包含通配符匹配:
LIKE '%office%'
这可以防止SQL Server在此列上使用索引,从而导致查询运行缓慢。理想情况下,您应该更改查询,以便LIKE
子句在开始时不使用通配符。
如果WHERE
子句首先包含基于AND
子句的Filename
查询(它可以在这里使用索引,因此这相对较快)并且然后根据您的productname0
子句过滤此减少的行集。当您使用OR
时,它不仅限于返回与您的Filename
子句匹配的行,因此它必须搜索整个表,检查每个productname0
字段是否匹配
答案 1 :(得分:1)
这是一篇关于改进索引的微软文章http://msdn.microsoft.com/en-us/library/ms172984.aspx。请参阅带有过滤器子句的索引部分(重申上一个答案。)
您是否尝试过这些行而不是类似的查询?
...('Microsoft Office 2000','Microsoft Office xyz','Whateverelse')中的产品名称