【问题标题】:SQL Server indexing includes questionsSQL Server 索引包括问题
【发布时间】:2015-08-31 03:05:35
【问题描述】:

我在处理我的工作应用程序中的一些错误 SQL 调用时遇到了麻烦。我一直在阅读索引、调整和基准测试。以下是我收集的一些规则(如果这听起来正确,请告诉我):

  • 对于频繁使用的查询,将查询归结为仅需要的内容,然后重新编写 where 语句以首先使用最常用的列。然后在 where 语句中使用的列上创建一个非聚集索引,并对任何剩余的选择列执行 INCLUDING(当然不包括像 nvarchar(max) 这样的大列)。

  • 如果查询要返回 > 20% 的条目表内容,最好进行表扫描而不使用索引

  • 索引中的顺序很重要。您必须确保像构建索引一样构建您的 where 语句。

现在我在查找信息时遇到问题的一件事是,如果查询正在选择不属于任何索引但使用 where 语句的列,该怎么办?是否使用了索引并且叶节点命中了表并查看了关联的行?

例如:表格

Id col1 col2 col3

CREATE INDEX my_index
ON my_table (col1)

SELECT Id, col1, col2, col3
FROM my_table
WHERE col1 >= 3 AND col1 <= 6

这里使用my_index 吗?如果是这样,它如何解析 Id、col2、col3?它是否指向表行并获取值?

【问题讨论】:

  • where 子句中事物的顺序根本不重要,否则这一切听起来都不错。
  • 可能会被使用 - 在让 SQL Server 的查询优化器试一试并查看之前,您通常无法真正判断

标签: sql sql-server indexing include


【解决方案1】:

要回答您的问题,是的,使用了 my_index。是的,您的索引将指向表行并在那里选择 id、col2 和 col3 值。这就是索引的作用。

关于你的“规则”

  • 规则 1 有意义。除了我通常不在索引中“包含”其他列的事实。如上所述,索引将引用表并快速检索您需要的行。

  • 规则 2,我不太明白。您创建索引,SQL Server 将决定使用或不使用哪些索引。你真的不必担心它。

  • 规则 3,顺序并没有真正的区别。

我希望这会有所帮助。

【讨论】:

  • 并确保除非必要,否则不应有多个索引,尤其是当它们涉及相同的列时。
  • 你确定顺序不重要吗?这里的答案呢? stackoverflow.com/questions/1840713/…
  • 索引中列的顺序可能很重要。 where 子句的顺序无关紧要。
【解决方案2】:

来自dba.stackexchange.com

有一些重要的概念和术语需要理解 在处理索引时。搜索、扫描和查找是其中的一些 通过 select 语句使用索引的方式。 关键列的选择性对于确定一个关键列的有效性是不可或缺的 索引可以。

当 SQL Server 查询优化器确定 查找您请求的数据的最佳方法是扫描范围 一个索引内。搜索通常发生在查询被“覆盖”时 一个索引,这意味着搜索谓词在索引键和 显示的列要么在键中,要么包含在其中。发生扫描 当 SQL Server 查询优化器确定最佳方法 查找数据是扫描整个索引然后过滤结果。 当索引不包括所有请求时,通常会发生查找 列,在索引键或包含的列中。查询 然后优化器将使用集群键(针对集群 索引)或 RID(针对堆)“查找”另一个请求的 列。

通常,查找操作比扫描更有效,因为 物理查询较小的数据集。在某些情况下 情况并非如此,例如非常小的初始数据集,但 超出了您的问题范围。

现在,您问如何确定索引的有效性,以及 有几件事要记住。聚集索引的键列是 称为聚类键。这就是如何使记录在 聚集索引的上下文。所有非聚集索引将包括 默认情况下为聚集键,以便在何时执行查找 必要的。所有索引都将被插入、更新或删除 来自每个相应的 DML 语句。说了这么多,就是 最好在 select 语句中平衡性能增益 插入、删除和更新语句的性能下降。

为了确定索引的有效性,您必须确定 索引键的选择性。选择性可以定义为 不同记录占总记录的百分比。如果我有一个[人] 总共有 100 条记录的表,并且 [first_name] 列包含 90 不同的值,我们可以说 [first_name] 列是 90% 可选择的。选择性越高,指标越有效 钥匙。牢记选择性,最好把你最 在您的索引键中首先选择列。使用我以前的 [人] 例如,如果我们有一个 95% 选择性的 [last_name] 列怎么办? 我们想用 [last_name], [first_name] 创建一个索引 索引键。

我知道这是一个有点啰嗦的答案,但确实有很多 决定指数有效性的因素,以及 很多事情你必须权衡任何性能提升。

【讨论】:

猜你喜欢
  • 2010-11-29
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
相关资源
最近更新 更多