SQL 服务器执行计划索引查找

SQL Server execution plan Index seek

我试图改进 2 个与索引几乎相同的查询。我在第一个查询中看到 Table 扫描并创建了一个索引以使其成为索引查找,当我看到第二个查询时,SQL 服务器指示创建一个索引等于我最后创建的索引更改仅列顺序,但在执行计划中 SQL 服务器引擎已经在 table.

上执行索引查找

我的问题是:

如果 SQL 服务器执行计划已经是一个索引查找,我应该为这个查询创建另一个索引,我应该删除我创建的索引并替换为另一个索引,还是应该忽略以下建议SQL服务器给?

没有具体细节就无法回答。这不是猜谜游戏。请 post 确切的 table 结构、table 大小、您添加的索引和您的执行计划。

您添加了 an 索引并不意味着您添加了 best 索引。执行计划使用索引查找的事实也不意味着该计划是 最佳。错误的索引列顺序和部分谓词匹配将在前导列上显示为 'seek',这将是次优的,并且 SQL 将继续推荐更好的索引(即,正是您描述的症状) .

请阅读Understanding how SQL Server executes a query and How to analyse SQL Server performance

I saw a Table Scan in the first query and created an index to make that an Index Seek

All Seeks are not good,All Scans are not bad..

假设您有一个客户 table,有 10 个客户,每个客户有 1000 个订单,现在订单中的总行 table 是 10000 行..

要为每个客户获得前 1 个订单,如果您的查询正在对订单进行扫描 table,这可能很糟糕,因为搜索只会花费您 10 次搜索..

你必须理解数据并了解为什么优化器选择这个计划以及你如何让优化器选择你需要的计划..Itzik Ben-Gan 给出了惊人的 examples in this tutorial and there is a video on SQL Bits

Craig Freedman 进一步讨论了查找和扫描部分,并详细介绍了为什么 optimiser 由于随机读取、数据密度

可能会选择扫描而不是查找