Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用LIKE关键字了解索引性能_Sql_Sql Server - Fatal编程技术网

Sql 使用LIKE关键字了解索引性能

Sql 使用LIKE关键字了解索引性能,sql,sql-server,Sql,Sql Server,我正在使用来自Microsoft的AdventureWorks2017数据库 我已经做了以下工作: create index idx_CarrierTrackingNumber on [Sales].[SalesOrderDetail] (CarrierTrackingNumber); go -------------------------------------------------------------------------------- select CarrierTr

我正在使用来自Microsoft的AdventureWorks2017数据库

我已经做了以下工作:

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仍然会做它想做的事情。