我的表中有4列的复合唯一索引和一个性能问题的查询,它们分别过滤了2列。也许是一个愚蠢的问题,但我应该索引各个列以提高性能吗?谢谢你的帮助!
答案 0 :(得分:5)
我正在回答这个问题,因为乔的答案不正确。
Oracle 9引入了一种新型的索引扫描,称为跳过扫描。这允许索引用于非前导列。有关详细信息,请参阅documentation。
确实,在大多数数据库中,在大多数情况下,索引是从左到右使用的。但是,Oracle的跳过扫描机制是一个例外,并且是对其他数据库中索引算法的增强。
答案 1 :(得分:2)
答案取决于哪两列。复合索引可用于最左列的子集。如果您的索引处于打开状态(A,B,C,D)并且您在A和B上进行了过滤,那么您就可以了。另一方面,如果你在B和C上进行过滤,那么这个索引不会有帮助,你需要创建一个新索引。
答案 2 :(得分:1)
你处理权衡问题。较小的索引更快。让我们在一个例子中只尝试两列。假设我的表X带有字符列A和B。
不能说我创建了A + B的索引和B + A的另一个索引。
这允许我只使用A或只是B的索引。但是在读取索引时,sql引擎必须读取更多的A + B或B + A的总数据量。所以这比你只有一个用于A或只有一个用于B的速度慢。所以为什么不放入4个索引。那么你可以做到这一点,但现在你减慢了插入速度,因为你必须维护4个不同的索引。
没有确切的正确答案。其他因素会影响差异。您使用哪个Sql引擎,哪个版本的供应商是sql引擎。了解这些行为的优缺点的基本动态。将其与更好地理解您的数据集和使用您的数据库的数据相结合。例如,如果每个给定的A记录很少有超过三个B记录。拥有综合指数可能不会有太大帮助。引擎使用索引查找三个记录然后在其中选择要返回的记录会更快。
您的结果可能会有所不同。但这是工程权衡的一种情况。