首页 > 解决方案 > Sargable 查询与函数,SQL Server

问题描述

我一直认为LIKE 'Z%'WHERE子句中使用的查询是 sargable,而使用的查询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

查询一:8秒

SELECT * 
FROM #Person 
WHERE LEFT (Lastname, 1) = 'Z'
GO 100

查询 2:8 秒

SELECT *  
FROM #Person 
WHERE LastName LIKE 'Z%'
GO 100

这里的性能没有区别。在这种情况下,我对 sargability 的理解是否有问题?

提前致谢。

标签: sql-serverperformancesql-server-2008tsql

解决方案


Sargability 与数据库在列上使用索引的能力有关。但是在您的示例中,该LastName列没有索引,因此这确实是一个有争议的问题。此外,您测试的数据集非常小,即使LastName有索引,SQL Server 也很可能决定不使用该索引。

如果您使用更大的数据集,在 上添加索引LastName,并在索引有助于查询的地方添加一些数据,我希望您会看到不同。


推荐阅读