2016-09-20 50 views

回答

5

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

Oracle 9引入了一种新型的索引扫描,称为跳跃扫描。这允许索引用于非主导列。细节在documentation中解释。

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

+0

加一:今天我学到了一些新东西! –

2

答案取决于哪两列。组合索引可用于最左列的子集。如果您的索引开启(A,B,C,D),并且您正在筛选A和B,那么您很有必要。另一方面,如果你在B和C上过滤,那么这个索引不会帮助你,你需要创建一个新的索引。

+0

感谢您的答复。为了确保我理解正确,说我筛选的列是A和C.在这种情况下,我只想向C添加索引,对吧? –

+1

@TheGilbertArenasDagger在A和C的情况下,现有的(A,B,C,D)索引可以用于A过滤器,但对于C来说,因为它在B之后,所以对C没有任何帮助。关闭创建(A,C)索引以完全支持该查询模式。 –

1

您处理折衷。较小的索引速度更快。让我们在一个例子中试试两列。假设我的表X具有字符列A和B.

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

这使我可以为A或B使用索引。但在读取索引时,sql引擎必须读取更多的A + B或B + A的总体数据量。所以这比如果你只有一个A或B只有一个要慢。那么为什么不放4个索引。那么你可以做到这一点,但现在你放慢你的插入,因为你必须保持4个不同的索引。

没有确切的正确答案。其他事情会影响差异。你使用哪个Sql引擎,哪个版本的供应商的sql引擎。了解这些行动的优势和劣势的基本动态。将它与对数据集和使用数据库的数据集的理解结合起来。例如,如果每个给定的A记录很少有三个以上的B记录。有一个综合指数可能没有多大帮助。引擎使用索引查找三条记录然后从中选择您想要返回的记录会更快。

您的结果可能会有所不同。但这非常适合工程学上的平衡。

相关问题