2010-07-12 89 views
3
declare @name varchar(156) 
set @name ='sara' 
--Query 1: 
SELECT [PNAME] FROM [tbltest] where [PNAME] like '%'[email protected]+'%' 

--Query 2: 
SELECT [PNAME] FROM [tbltest] where [PNAME] like '%sara%' 

假设[tbltest]的[PNAME]列中存在NoneClustered Index。 当运行查询,Excution计划显示索引寻求查询1和索引扫描查询2. 我预计Excution Paln显示索引扫描对于这两个查询,但由于使用第一个查询中的参数,它显示索引查找。 那么我该怎么做? 在这两个查询中,我们在另一侧使用'%',并且知道在这种状态下,sql不考虑索引 ,但为什么在第一个查询计划显示索引查找? 谢谢Sql Excution Plan显示对于相同输入的不同结果

回答

0

如果您对表和正在使用的索引执行DBCC SHOW_STATISTICS,请在输出的第一行中查找“String Index = YES”。在第一个查询中,您可能会看到计算的标量值 - 查看LikeRangeStart的查询计划('%'+ @ name +'% “)。索引搜索是针对这些值而非针对%sara%的索引扫描。

这是如何工作我不知道。为什么SQL Server不够聪明将'sara'转换为常量,并以与我不知道相同的方式执行查询。但我认为这就是发生了什么。

针对%sara%,它执行索引扫描,读取整个索引。针对%+ @ name +%,它会创建RangeStart/RangeEnd/RangeInfo计算值,并使用它们以某种方式执行索引查找,以利用附加字符串统计信息。

0

我认为迈克是否在正确的轨道上是否击中索引。您关于成本的后续行动可能需要更多了解您的数据在表格中的分布情况。我看过一些实例,因为需要两个磁盘读取操作,因此索引成本更高。要理解为什么,您必须知道您的数据如何在索引中分布,有多少记录适合页面,以及您的缓存方案是什么。

我会说,调整带有前导%的查询可能很困难。数据库将需要完全遍历您的索引(或表),并击中每个节点寻找包含“sara”的值。根据您的需要,您可能需要考虑全文搜索(即使用此查询中的参数值,因为它是作为应用程序用户的输入提供的)。

1

查询一个使用参数,查询2个常量。

如果更改常量值,则查询2的计划将不会重用。

计划1的查询可以是。在这种情况下,SQL Server(简单地)将其选项打开以重用计划。

AKA:查询是不是相同。

如果force parameterisation,那么你应该做两个查询运行像查询1.不过我没试过...

相关问题