解读执行计划

5 index sql-server

我需要一些帮助来分析一些简单的 t-sql 执行计划。我有一个包含以下 3 列的表 [User]:

Id(主键),用户名(nvarchar(50)),名字(nvarchar(50))

我为 Username 列创建了一个唯一的非聚集索引

按名字过滤的查询的执行计划:

select * from [User] where FirstName ='John'
Run Code Online (Sandbox Code Playgroud)

显示总成本为 0,0033095 的聚集索引扫描

另一个按用户名过滤的查询的执行计划:

select * from [User] where Username = 'johndoe'
Run Code Online (Sandbox Code Playgroud)

显示了一个嵌套循环,它包含一个索引搜索,然后是一个聚集索引搜索,总成本为 0,00657038!这是上一个查询成本的两倍,我不明白!

有一个与 Username 列相关联的索引,而没有与 FirstName 相关联的索引,我希望第二个查询更快。

小智 7

对于这样的事情,总成本几乎总是不可靠的

我会用STATISTICS IOSTATISTICS TIME代替

运行两个查询并查看读取的差异

SET STATISTICS IO ON
select * from [User] where FirstName ='John'
select * from [User] where Username = 'johndoe
SET STATISTICS IO OFF
Run Code Online (Sandbox Code Playgroud)

你也可以用这个来查看时间

SET STATISTICS TIME ON
select * from [User] where FirstName ='John'
select * from [User] where Username = 'johndoe'
SET STATISTICS TIME OFF
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 6

完全符合预期... :-)

第一个将是直接聚类/PK 扫描

第二个将是对 UserName 列的索引查找,然后是对聚集索引的键/书签查找。

您通常会将 UserName 上的索引设为覆盖索引……SELECT *无论如何,这通常毫无意义。

相关的问题:


Eri*_*ikE 4

从你的问题我了解到你的桌子相对较小。当您在表中放入更多行时,您会发现书签查找几乎保持不变,并且扫描所需的时间越来越长。最终,扫描的成本将比书签查找高出许多倍。

正如 SQLMenace 所说,执行计划成本通常是不可靠的。使用查询分析器或 SET STATISTICS 查看每个查询实际消耗的资源。

最后,确保更新表上的统计信息,否则引擎可能会对按什么顺序使用哪些索引或表做出错误的选择。