我一直认为在WHERE
子句中使用LIKE 'Z%'
的查询是可优化的,而使用LEFT (ColA, 1) = 'Z'
的查询则不是。
所以我做了一个小测试。
CREATE TABLE #Person (ID INT IDENTITY, LastName VARCHAR (50))
CREATE CLUSTERED INDEX i_PersonID ON #Person (ID)
GO
INSERT INTO #Person
VALUES ('Peters'), ('Michaels'), ('Richarson'), ('Stevens'),
('Wade'), ('Zachery')
GO 10000
查询 1:8 秒
SELECT *
FROM #Person
WHERE LEFT (Lastname, 1) = 'Z'
GO 100
查询 2:8 秒
SELECT *
FROM #Person
WHERE LastName LIKE 'Z%'
GO 100
这里的性能没有区别。在这种情况下,我对可变量性的理解是否错误的测试有问题吗?
提前谢谢。
可优化性与数据库在列上使用索引的能力有关。 但是在您的示例中,LastName
列没有索引,因此这确实是一个有争议的问题。 此外,您测试的数据集非常小,即使LastName
确实有索引,SQL Server 也可能决定无论如何都不使用该索引。
如果您使用较大的数据集,在LastName
上添加索引,并在索引有助于查询的地方添加一些数据,我希望您会看到差异。