【问题标题】:SQL Server execution plan Index seekSQL Server 执行计划索引查找
【发布时间】:2016-07-12 13:20:18
【问题描述】:

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

我的问题是:

如果 SQL Server 执行计划已经是一个索引搜索,我应该为此查询创建另一个索引,我应该删除我创建的索引并用另一个索引替换,还是应该忽略 SQL Server 提供的建议?

【问题讨论】:

  • 添加第一个索引后查询 2 是否以可接受的速度运行?
  • @Simon 是的,它运行

标签: sql-server sql-execution-plan


【解决方案1】:

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

您添加了 一个 索引的事实并不意味着您添加了 最佳 索引。执行计划使用索引查找这一事实也不意味着该计划是最优。错误的索引列顺序和部分谓词匹配将表现为在前导列上“寻找”,这将是次优的,SQL 将继续推荐更好的索引(即完全符合您描述的症状)。

请阅读Understanding how SQL Server executes a queryHow to analyse SQL Server performance

【讨论】:

  • 我知道原因是一个索引搜索,并不意味着它是完美的,但我认为这已经很好了,为什么我应该创建其他索引只是为了更好一点?
【解决方案2】:

我在第一个查询中看到了表扫描,并创建了一个索引以使其成为索引搜索

All Seeks 都不好,All Scans 还不错..

假设您有一个客户表,其中有 10 个客户,每个客户有 1000 个订单,现在订单表中的总行数为 10000 行..

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

您必须了解数据并了解优化器选择此计划的原因以及在选择所需计划时如何使优化器..Itzik Ben-Gan 给出了惊人的examples in this tutorial 并且有一个video on SQL Bits

Craig Freedman 进一步讨论了搜索和扫描部分,并详细说明了为什么 optimiser 由于随机读取、数据密度而可能选择扫描而不是搜索

【讨论】:

  • 谢谢,我会看到你发布的链接。
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 2020-04-30
  • 2010-11-11
  • 2011-06-12
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多