Oracle多列索引更好的列或更多的索引更好

时间:2018-08-01 10:46:58

标签: sql oracle performance indexing

当在oracle中考虑多列索引时,将更多的列放入索引而不是更少的列是一件好事。即我有一个包含20多个列的表,选项A是创建带有col_1,col_2,col_3的index_1a和创建带有col_1,col_4,col_5的index_1b。可能会添加更多带有col_1,col_2,col_4的index_1c 选项B是创建带有col_1,col_2,col_3,col_4,col_5

的index_b

我有很多查询使用不同的col组合进行搜索,

  • 有时是col_1和col_2
  • 有时col_1和col_4
  • 有时col_1和col_2和col_4

我该怎么办?你们能解释一下更多吗?

2 个答案:

答案 0 :(得分:0)

Oracle实现了跳过扫描索引操作,here中对此进行了说明。

因此,在(col_1, col_2, col_4)(col_1, col_4, col_2)上使用一个索引可能就足够了。您应该测试一下性能是否足以满足您的目的,但是单个索引很可能会满足您的需求。

答案 1 :(得分:0)

Oracle通常不会合并多个索引(假设问题与b * tree索引有关,而与位图索引无关)-大多数情况下,优化器只会使用最合适的索引。在您的示例中,第一个问题是条件的选择性:如果col_1的选择性很高,那么仅col_1上的索引就足够了。如果仅条件组合提供了良好的选择性,那么可能有必要创建多个索引-在这种情况下,您可以在示例中以(col_1,col_2,col_4)和(col_1,col_4)结尾。如果您的第二个示例查询只有索引(col_1,col_2,col_4),则我希望优化器仅将col_1用作访问谓词,将col_4用作过滤谓词。当然,添加多个索引会增加DML发生时维护索引所需的工作量。

使用位图索引,优化器可以将它们组合在一起,但是这种索引类型通常仅在数据仓库中使用,因为它给并发DML带来了巨大的锁定问题。