oracle 是否应该对已经是复合索引一部分的各个列建立索引?

mrfwxfqh  于 7个月前  发布在  Oracle
关注(0)|答案(3)|浏览(92)

我有一个跨表中4列的复合唯一索引和一个性能问题的查询,该查询分别过滤其中2列。
也许这是一个愚蠢的问题,但是我是否也应该索引各个列以提高性能呢?
感谢您的任何帮助!

eagi6jfj

eagi6jfj1#

我回答这个问题是因为乔的答案不正确。
Oracle 9引入了一种新的索引扫描类型,称为跳过扫描。这允许将索引用于非前导列。详细信息在文档中解释。
在大多数数据库中,在大多数情况下,索引都是从左到右使用的。然而,Oracle的跳过扫描机制是一个例外,它是对其他数据库中索引算法的增强。

sbdsn5lh

sbdsn5lh2#

答案取决于是哪两列。复合索引可以用于最左边列的子集。如果你的索引是(A,B,C,D),并且你正在过滤A和B,那么你就可以开始了。另一方面,如果你正在过滤B和C,那么这个索引不会有帮助,你需要创建一个新的索引。

oiopk7p5

oiopk7p53#

你需要权衡。小的索引更快。让我们在一个例子中只尝试两列。假设我有一个带有字符列A和B的表X。
不,假设我创建了一个A+B的索引和另一个B+A的索引。
这允许我使用一个索引只为A或只是B。但在阅读索引的SQL引擎必须读取更多的总数据量的A+B或B+A。所以这是慢于如果你只是有一个为A或只有一个为B。所以为什么不把在4个索引。嗯,你可以这样做,但现在你放慢你的插入,因为你必须维护4个不同的索引。
没有确切的正确答案。其他因素会影响差异。您使用哪个SQL引擎,哪个版本的供应商sql引擎。了解这些操作的优点和缺点的基本动态。将其与更好地了解数据集和使用数据库的数据集结合起来。例如,如果对于每个给定的A记录,您很少有超过三个B记录。复合索引。引擎使用索引查找三条记录,然后从中选择要返回的记录,这样会更快。
你的结果可能会有所不同,但这在很大程度上是一个工程权衡的情况。

相关问题