在对语句进行参数化时,我在 SQL Server 2005 上遇到了针对堆表的意外表扫描LIKE
......但是当与变量相同的值被硬编码时,预期的索引查找就会发生。
这个问题只发生在这种特定情况下......所以我对如何解决这个问题并不感到困惑,我对为什么会发生这种情况感到困惑。
以下 T-SQL 应该会在 SQL Server 2005 上重现该问题:
IF (OBJECT_ID('tempdb.dbo.#tblTest') IS NOT NULL)
DROP TABLE dbo.#tblTest
GO
CREATE TABLE dbo.#tblTest (
ID INT IDENTITY(1, 1),
SerialNumber VARCHAR(50)
)
GO
-- Populate the table with 10,000 rows
SET NOCOUNT ON
DECLARE @i INT
SET @i = 0
WHILE @i < 10000
BEGIN
INSERT INTO dbo.#tblTest VALUES(CAST(@i AS VARCHAR(10)))
SET @i = @i + 1
END
GO
-- To recreate the issue, the table must be a heap.
ALTER TABLE dbo.#tblTest ADD CONSTRAINT PK_tblTest PRIMARY KEY NONCLUSTERED (ID)
GO
-- Create a (non-covering) index on serial number.
CREATE NONCLUSTERED INDEX IX_tblTest_SerialNumber ON dbo.#tblTest (SerialNumber)
GO
DECLARE @Criteria VARCHAR(50)
SET @Criteria = '1234%'
-- This produces a Table Scan.
SELECT *
FROM dbo.#tblTest
WHERE SerialNumber LIKE @Criteria
-- This produces an Index Seek
SELECT *
FROM dbo.#tblTest
WHERE SerialNumber LIKE '1234%'
Paul White 的这篇文章似乎与我密切相关,但结论/解释与我的具体问题不符。
任何见解表示赞赏。