Sql 使用LIKE关键字了解索引性能
我正在使用来自Microsoft的AdventureWorks2017数据库 我已经做了以下工作:Sql 使用LIKE关键字了解索引性能,sql,sql-server,Sql,Sql Server,我正在使用来自Microsoft的AdventureWorks2017数据库 我已经做了以下工作: create index idx_CarrierTrackingNumber on [Sales].[SalesOrderDetail] (CarrierTrackingNumber); go -------------------------------------------------------------------------------- select CarrierTr
create index idx_CarrierTrackingNumber on [Sales].[SalesOrderDetail] (CarrierTrackingNumber);
go
--------------------------------------------------------------------------------
select
CarrierTrackingNumber
from
[Sales].[SalesOrderDetail]
where
CarrierTrackingNumber like '%4';
go
当我去看执行计划时,它显示了以下内容:
create index idx_CarrierTrackingNumber on [Sales].[SalesOrderDetail] (CarrierTrackingNumber);
go
--------------------------------------------------------------------------------
select
CarrierTrackingNumber
from
[Sales].[SalesOrderDetail]
where
CarrierTrackingNumber like '%4';
go
是否应该使用表扫描而不是索引扫描,因为我的LIKE
搜索中的第一个字符是通配符
编辑#1:添加了我为什么相信这一点
我在读一本书,书上写着:
相反的情况也是可能的:类似的表达式以
通配符。这样一个类似的表达不能作为一种访问
谓语如果没有,数据库必须扫描整个表
提供访问谓词的其他条件
我是否误解了作者所说的内容?为什么?所有需要的信息都在索引中。无需靠近表。如果它是
CarrierTrackingNumber(如'4')
或CarrierTrackingNumber(如'4%')
,则它将是一个索引搜索。不过,它仍然可以通过索引扫描使用索引来回答查询,因为表中没有其他列。我添加了更多上下文,请参见“编辑#1”。这是一个过于简单的视图。。。SQL Server将根据需要交替使用索引或表(事实上,请检查表/索引/堆的定义-它们没有您想象的那么不同)。本质上,作者所说的是需要扫描,因此不能从索引的排序顺序中获益,但在这种情况下,它可以将更少的数据加载到内存中以完成相同的任务。明白了,从wildcharacter开始是一种不好的做法,但SQL Server仍然会做它想做的事情。