Estou experimentando uma verificação de tabela inesperada no SQL Server 2005 em uma tabela heap ao parametrizar uma LIKE
instrução... mas quando o mesmo valor da variável é codificado, a busca de índice esperada ocorre.
O problema só acontece neste cenário específico ... então não estou confuso sobre como resolver o problema, estou confuso sobre por que isso está acontecendo.
O seguinte T-SQL deve recriar o problema no 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%'
Fui direcionado para este artigo de Paul White, que parece muito relacionado , mas as conclusões/explicações não correspondem ao meu problema específico.
Qualquer visão é apreciada.