我需要一些帮助来分析一些简单的 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 IO
和STATISTICS 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)
完全符合预期... :-)
第一个将是直接聚类/PK 扫描
第二个将是对 UserName 列的索引查找,然后是对聚集索引的键/书签查找。
您通常会将 UserName 上的索引设为覆盖索引……SELECT *
无论如何,这通常毫无意义。
相关的问题:
从你的问题我了解到你的桌子相对较小。当您在表中放入更多行时,您会发现书签查找几乎保持不变,并且扫描所需的时间越来越长。最终,扫描的成本将比书签查找高出许多倍。
正如 SQLMenace 所说,执行计划成本通常是不可靠的。使用查询分析器或 SET STATISTICS 查看每个查询实际消耗的资源。
最后,确保更新表上的统计信息,否则引擎可能会对按什么顺序使用哪些索引或表做出错误的选择。
归档时间: |
|
查看次数: |
163 次 |
最近记录: |