【发布时间】:2016-09-20 18:50:31
【问题描述】:
我有一个跨表中 4 列的复合唯一索引,以及一个存在性能问题的查询,该查询单独过滤了其中的 2 列。也许是一个愚蠢的问题,但我是否应该也索引各个列以提高性能?感谢您的帮助!
【问题讨论】:
-
请显示您的索引架构和查询
标签: sql database oracle indexing database-performance
我有一个跨表中 4 列的复合唯一索引,以及一个存在性能问题的查询,该查询单独过滤了其中的 2 列。也许是一个愚蠢的问题,但我是否应该也索引各个列以提高性能?感谢您的帮助!
【问题讨论】:
标签: sql database oracle indexing database-performance
您需要权衡取舍。较小的索引更快。让我们在示例中仅尝试两列。假设我有带有字符列 A 和 B 的表 X。
不能说我创建了一个 A+B 的索引和另一个 B+A 的索引。
这允许我只为 A 或 B 使用索引。但是在读取索引时,sql 引擎必须读取更多的 A+B 或 B+A 的总数据量。因此,这比只为 A 设置一个或为 B 设置一个要慢。所以为什么不放入 4 个索引。好吧,您可以这样做,但是现在您减慢了插入速度,因为您必须维护 4 个不同的索引。
没有确切的正确答案。其他因素会影响差异。您使用哪个 Sql 引擎,哪个版本的供应商 sql 引擎。了解这些行动的优缺点的基本动态。将其与更好地理解您的数据集和使用您的数据库的人相结合。例如,如果每个给定的 A 记录很少有超过三个 B 记录。拥有一个综合索引可能不会有太大帮助。引擎使用索引查找三个记录然后在其中选择要返回的记录会更快。
您的结果可能会有所不同。但这在很大程度上是一种工程权衡的情况。
【讨论】:
我回答这个问题是因为乔的回答不正确。
Oracle 9 引入了一种新型索引扫描,称为跳过扫描。这允许将索引用于非前导列。详情请见documentation。
确实,在大多数数据库中,在大多数情况下,索引是从左到右使用的。但是,Oracle 的跳过扫描机制是一个例外,它是对其他数据库中索引算法的增强。
【讨论】:
答案取决于哪两列。复合索引可用于最左侧列的子集。如果您的索引在 (A, B, C, D) 上并且您正在过滤 A 和 B,那么您就可以开始了。另一方面,如果您在 B 和 C 上进行过滤,那么此索引将无济于事,您需要创建一个新索引。
【讨论】: