非聚集索引 - 几乎相同需求的一个或两个索引(两个表之间的连接)?

Posted

技术标签:

【中文标题】非聚集索引 - 几乎相同需求的一个或两个索引(两个表之间的连接)?【英文标题】:Non Clustered Index - One or two index for almost the same need (join between two tables)? 【发布时间】:2019-06-06 11:50:04 【问题描述】:

我有大量查询,我在三个列上的两个表之间进行连接:col1、col2 和 col3。所以我在两个表中的这三列上创建了一个非聚集索引。但是我有同样大量的查询,我只在两列上的两个表之间进行连接:col1 和 col2。 那么你的效率更高(撇开索引的大小)?

在两个表中的 col1 和 col2 上创建第二个非聚集索引,或者这两个索引之一是否足以处理工作?如果是的话,是哪一个? 提前感谢您的帮助

【问题讨论】:

不可能这样回答。这取决于色谱柱的选择性。多个索引意味着多个 IO 操作。查询优化器将选择看起来成本更低的任何东西。如果 col1 和 col2 具有更好的选择性并且首先出现在 3 列索引中,则优化器可能会选择它。这取决于表模式和实际数据统计 无论如何这最适合 dba.stackexchange.com,而不是 SO 在 dba.stackexchange.com Should I use many single field indexes, instead of specific multi column indexes? 中重复查询,答案非常 别忘了,“高效”需要考虑到索引对insert/update/delete/merge语句施加的额外处理。如果经常编写表格,这可能会产生重大影响。 【参考方案1】:

如果您在 col1、col2 和 col3 列中已经有一个索引,并且您有 col1、col2 和 col3 的查询以及 col1、col2 的另一个查询,则可以,查询优化器将在两个搜索中使用该索引。 如果顺序不同但使用了 3 或前 2 个字段,则会出现同样的问题。例如。 col2、col1、col3 或 col3、col2、col3。 不同的问题是搜索是否仅按 col2、col3 或什至仅按 col2 使用。对于这些情况,您需要在 col2、col3 列上创建另一个索引。 如果您有仅使用 col3 的查询,则需要为 col3 创建另一个索引。

【讨论】:

【参考方案2】:

首先,SQL Server 索引、结构和用法都有大量文档记录。你应该去阅读它。

在您描述的情况下,您希望按该顺序在 col1/col2/col3 上创建一个索引。该索引可用于在 col1/col2/col3 上进行连接的查询或在 col1/col2 上进行的查询。由于索引的工作方式,该索引不能用于连接 col2/col3 的查询。

接下来要考虑的是 SELECT 语句。如果您正在查询 col1/col2/col3 以外的列,您将产生会损害性能的 key/rid 查找。您需要在索引中添加一个 INCLUDE 部分。

【讨论】:

记录在案的事情之一是仅添加单个索引不会带来更好的 性能。我建议阅读 Brent Ozar 的文章。如果 col1 和 col2 比 col3 更具选择性,并且它们在两个表上以相同的顺序指定,则查询优化器将能够在两种情况下使用相同的索引并运行 更快要读取的索引

以上是关于非聚集索引 - 几乎相同需求的一个或两个索引(两个表之间的连接)?的主要内容,如果未能解决你的问题,请参考以下文章

搜索引擎算法研究专题三:聚集索引与非聚集索引介绍

创建 2 个具有相同键列但不同包含列的非聚集索引

内连接时非聚集索引的查询性能

一文总结分析聚集索引非聚集索引覆盖索引的工作原理!

数据库怎样创建一个唯一聚集索引

聚集索引非聚集索引