我需要一些帮助来分析一些简单的 t-sql 执行计划。我有一个包含以下 3 列的表 [User]:
Id(主键),用户名(nvarchar(50)),名字(nvarchar(50))
我为用户名列创建了一个唯一的非聚集索引
按 FirstName 过滤查询的执行计划:
select * from [User] where FirstName ='John'
显示总成本为 0,0033095 的聚簇索引扫描
另一个按用户名过滤的查询的执行计划:
select * from [User] where Username = 'johndoe'
显示了一个嵌套循环,其中包含一个索引查找,然后是一个聚集索引查找,总成本为 0,00657038!这是之前查询成本的两倍,我不明白!
有一个与 Username 列关联的索引,没有与 FirstName 关联的索引,我希望第二个查询更快。
对于这样的事情,总成本几乎总是不可靠的
我会用
STATISTICS IO
andSTATISTICS TIME
代替运行两个查询并查看读取的差异
你也可以用这个看时间
完全符合预期... :-)
第一个将是直接的集群/PK 扫描
第二个将是对 UserName 列的索引查找,然后是对聚集索引的键/书签查找。
您通常会将 UserName 上的索引设为覆盖索引……
SELECT *
无论如何,这通常毫无意义。相关问题:
根据您的问题,我了解到您的桌子相对较小。当您在表中放置更多行时,您会发现书签查找保持大致相同,并且扫描时间越来越长。最终扫描的成本将比书签查找多很多倍。
正如 SQLMenace 所说,执行计划成本通常是不可靠的。使用 Query Profiler 或 SET STATISTICS 查看每个查询实际消耗了哪些资源。
最后,确保表上的统计信息已更新,否则引擎可能会在以何种顺序使用哪些索引或表方面做出糟糕的选择。