我希望这两个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.AccountNumberAccounts.AccountNumber列可以为空varchar(30)表和索引定义:
CREATE TABLE [updatable].[AccountAction](
[ID] [int] IDENTITY(1,1) NOT NULL,
[AccountNumber] [varchar](30) NULL,
[Utility] [varchar](9) …Run Code Online (Sandbox Code Playgroud)