何时保留索引 - 分析SQL Server 2008中的索引使用情况

sql*_*oob 10 sql sql-server indexing sql-server-2008

我在MS SQL 2008数据库上做了一个索引报告(右键单击数据库 - >报告 - >索引使用情况统计信息)

它告诉我,我的一个索引使用:88个用户寻求0个用户扫描6,134,141个用户更新

有人可以向我解释一下:

  1. 用户搜索和用户扫描之间的区别是什么?
  2. 我应该如何根据用户搜索+用户扫描与用户更新来确定何时保留索引或丢弃索引?

我认为在这种情况下维护索引的成本是不值得的.

Abe*_*ler 8

  1. 这是一篇关于搜索和扫描(以及一般索引)的好文章.它可能会比任何SO帖子做得更好.
  2. 它可能是一种确定您是否需要索引的艺术形式.如果那些88搜索从3小时到30秒的运行时间内获取绝对必要的报告查询,那么请保留它们.我认为第一步是找出哪些查询正在使用它们,索引对这些查询的帮助程度以及这些查询的重要性.

从文章剪辑(虽然肯定给它读了):

扫描

索引扫描是索引中所有叶页的完整读取.在聚簇索引上完成索引扫描时,除了名称之外,它都是一个表扫描.

当查询处理器完成索引扫描时,无论是否返回所有行,它始终是索引中所有叶页的完整读取.它绝不是部分扫描.

扫描不仅涉及读取索引的叶级别,更高级别的页面也会作为索引扫描的一部分读取.

寻求

索引查找是一种操作,其中SQL使用b树结构来定位特定值或值范围的开头.对于索引寻求可能,必须在查询中指定SARGable3谓词和匹配(或部分匹配)索引.匹配索引是查询谓词使用索引列的基于左的子集的索引.这将在本系列的第3部分中进行更详细的研究.

从根页开始评估查找操作.使用根页面中的行,查询处理器将定位索引的下一个较低级别中的哪个页面包含正在搜索的第一行.然后它将读取该页面.如果这是索引的叶级别,则搜索结束.如果它不是叶子,则查询处理器再次识别下一个较低级别中的哪个页面包含指定值.此过程继续,直到达到叶级.

一旦查询处理器找到包含指定键值或指定范围的键值的开头的叶页,它就会沿着叶页读取,直到返回了与谓词匹配的所有行.


Joe*_*lli 3

前面需要注意的重要一点是:每次数据库启动时都会重置索引使用统计信息。因此,在不知道上次重新启动时间的情况下,很难评估您的 88 次搜索。过去一小时的 88 次搜索与上个月的 88 次搜索有很大不同。

  1. 用户搜索正在索引中查找与查询条件匹配的特定行或行集。用户扫描正在读取索引中的所有行。出于显而易见的原因,查找操作比扫描操作更可取。
  2. 我不知道有任何一般准则说“当查找/更新比率为 X 时,删除索引”。根据这些通用设计指南和查询性能前后的基准检查您的索引,以确定删除索引的影响。