小编pan*_*nts的帖子

LIKE'%...'如何寻求索引?

我希望这两个SELECTs具有相同的执行计划和性能.由于有一个领先的通配符LIKE,我希望进行索引扫描.当我运行它并查看计划时,第一个SELECT按预期运行(使用扫描).但第二个SELECT计划显示索引搜索,并且运行速度提高了20倍.

码:

-- Uses index scan, as expected:
SELECT 1
    FROM AccountAction
    WHERE AccountNumber LIKE '%441025586401'

-- Uses index seek somehow, and runs much faster:
declare @empty VARCHAR(30) = ''
SELECT 1
    FROM AccountAction
    WHERE AccountNumber LIKE '%441025586401' + @empty
Run Code Online (Sandbox Code Playgroud)

题:

当模式以通配符开头时,SQL Server如何使用索引查找?

奖金问题:

为什么连接空字符串会改变/改进执行计划?

细节:

  • 有一个非聚集索引 Accounts.AccountNumber
  • 还有其他索引,但搜索和扫描都在索引上.
  • Accounts.AccountNumber列可以为空varchar(30)
  • 服务器是SQL Server 2012

表和索引定义:

CREATE TABLE [updatable].[AccountAction](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [AccountNumber] [varchar](30) NULL,
    [Utility] [varchar](9) …
Run Code Online (Sandbox Code Playgroud)

sql wildcard sql-execution-plan sql-server-2012 sql-like

8
推荐指数
1
解决办法
3534
查看次数