【问题标题】:Should I index individual columns that are already part of a composite index?我应该索引已经是复合索引一部分的各个列吗?
【发布时间】:2016-09-20 18:50:31
【问题描述】:

我有一个跨表中 4 列的复合唯一索引,以及一个存在性能问题的查询,该查询单独过滤了其中的 2 列。也许是一个愚蠢的问题,但我是否应该也索引各个列以提高性能?感谢您的帮助!

【问题讨论】:

  • 请显示您的索引架构和查询

标签: sql database oracle indexing database-performance


【解决方案1】:

您需要权衡取舍。较小的索引更快。让我们在示例中仅尝试两列。假设我有带有字符列 A 和 B 的表 X。

不能说我创建了一个 A+B 的索引和另一个 B+A 的索引。

这允许我只为 A 或 B 使用索引。但是在读取索引时,sql 引擎必须读取更多的 A+B 或 B+A 的总数据量。因此,这比只为 A 设置一个或为 B 设置一个要慢。所以为什么不放入 4 个索引。好吧,您可以这样做,但是现在您减慢了插入速度,因为您必须维护 4 个不同的索引。

没有确切的正确答案。其他因素会影响差异。您使用哪个 Sql 引擎,哪个版本的供应商 sql 引擎。了解这些行动的优缺点的基本动态。将其与更好地理解您的数据集和使用您的数据库的人相结合。例如,如果每个给定的 A 记录很少有超过三个 B 记录。拥有一个综合索引可能不会有太大帮助。引擎使用索引查找三个记录然后在其中选择要返回的记录会更快。

您的结果可能会有所不同。但这在很大程度上是一种工程权衡的情况。

【讨论】:

    【解决方案2】:

    我回答这个问题是因为乔的回答不正确。

    Oracle 9 引入了一种新型索引扫描,称为跳过扫描。这允许将索引用于非前导列。详情请见documentation

    确实,在大多数数据库中,在大多数情况下,索引是从左到右使用的。但是,Oracle 的跳过扫描机制是一个例外,它是对其他数据库中索引算法的增强。

    【讨论】:

      【解决方案3】:

      答案取决于哪两列。复合索引可用于最左侧列的子集。如果您的索引在 (A, B, C, D) 上并且您正在过滤 A 和 B,那么您就可以开始了。另一方面,如果您在 B 和 C 上进行过滤,那么此索引将无济于事,您需要创建一个新索引。

      【讨论】:

      • 感谢您的回复。为了确保我理解正确,假设我要过滤的列是 A 和 C。在这种情况下,我只想为 C 添加一个索引,对吧?
      • @TheGilbertArenasDagger 在 A 和 C 的情况下,现有的 (A,B,C,D) 索引可用于 A 过滤器,但对 C 没有帮助,因为它在B. 你最好创建一个 (A,C) 索引来完全支持该查询模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多