【问题标题】:Sargable query versus function, SQL ServerSargable 查询与函数,SQL Server
【发布时间】:2018-12-14 16:02:50
【问题描述】:

我一直认为在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

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

提前致谢。

【问题讨论】:

    标签: sql-server performance sql-server-2008 tsql


    【解决方案1】:

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

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

    【讨论】:

    • 感谢@Tim,我将运行一些新测试并在名称列上添加索引。
    • 将表大小调整为 600k 行并添加了非聚集索引。第一个查询运行了 20 秒,第二个查询运行了 5 秒。此外,逻辑读取的主要区别。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多