我试图改进2个与索引几乎相同的查询。我在第一个查询中看到了一个表扫描,并创建了一个索引,使其成为一个索引查找,当我看到第二个查询时,SQL Server指示创建索引等于我创建的最后一个更改列的顺序但是在执行中计划SQL Server引擎已经在桌面上进行索引搜索。
我的问题是:
如果SQL Server执行计划已经是索引,我应该为此查询创建另一个索引,是应该删除我创建的索引并替换为另一个索引,还是应该忽略SQL Server提供的建议?
答案 0 :(得分:2)
如果没有具体细节,就无法回答。这不是猜谜游戏。请发布确切的表格结构,表格大小,您添加的索引以及您拥有的执行计划。
您添加 索引这一事实并不意味着您添加了最佳索引。执行计划使用索引查找的事实也不意味着该计划是最优。错误的索引列顺序和部分谓词匹配将在前导列上显示为“seek”,它将是次优的,并且SQL将继续推荐更好的索引(即,完全是您描述的症状)。
请阅读Understanding how SQL Server executes a query和How to analyse SQL Server performance。
答案 1 :(得分:0)
我在第一个查询中看到了一个表扫描并创建了一个索引来使其成为一个索引搜索
所有寻求者都不好,所有扫描都不错......
想象一下,你有一个客户表,其中10个客户各有1000个订单,现在订单表中的总行数是10000行..
要获得每个客户的前1个订单,如果您的查询正在扫描订单表,那可能会很糟糕,因为执行搜索只会花费您10次搜索..
您必须了解数据,并了解优化程序选择此计划的原因以及如何使优化程序选择您需要的计划.Itzik Ben-Gan给出了惊人的examples in this tutoria l并且有video on SQL Bits
进一步的Craig Freedman讨论了寻找和扫描的部分,并详细介绍了为什么optimiser可能选择Scan over Seek由于随机读取,数据密度