多列索引效率

时间:2013-02-12 21:44:27

标签: sql performance oracle indexing

select a
from t
where b = 1 and c = 2 
  1. 要提高此查询的效果,我应该创建index (b, c)index(c, b)还是第一个索引足够?
  2. 根据我的理解,index (b, c, a)可能会进一步提高效果,但前提是(b, c, a)(b, c)更独特。那是对的吗?
  3. SQL问题是否属于dba.stackexchange站点?

2 个答案:

答案 0 :(得分:3)

  

1.要提高此查询的性能,我应该创建索引(b,c)和索引(c,b)还是第一个索引足够?

您无需创建两个索引。如果它用于执行查询,则两者中的任何一个都可以同等地提高此类查询(具有where b = 1 and c = 2条件)的效率。是否使用以及是否提高性能取决于索引的选择性。

  

2.根据我的理解,索引(b,c,a)可能会进一步提高性能,但前提是(b,c,a)比(b,c)更独特。这是对的吗?

是。 (b , c, a)上的索引(或(c, b, a)上的索引同样好)将提高性能。是否与选择性无关。读取索引(以及索引中相同位置的所有索引)不能比读取((b, c)索引然后从此处的一行获取a列数据而从另一行获取另一行(可能是更广泛的表。

(b, c)的选择性,例如查询返回的行数将影响效率的提升,(b, c, a)索引将为您提供。如果查询返回几十行,则差异会很小。如果查询在数百万个表中返回数千行,则改进将很高,因为所有数据都将从(覆盖)索引中读取。

  

3. SQL问题是否属于dba.stackexchange站点?

这是元网站的问题,无论是主网站还是DBA.SE元。

答案 1 :(得分:2)

  1. 两列上只需要一个索引。哪两个更好取决于表的结构和将使用它的查询,但通常与复合索引的顺序没有显着差异。

  2. 包含查询中使用的所有列的索引称为covering index。它可以提高性能,但除非表格有很多列或非常大,否则它通常不会产生显着差异。它可以更快的原因是,它不是必须在索引中找到条目后转到数据,它可以只使用索引而不需要查看数据,因为它需要的所有内容都在索引中。

  3. 有些问题更适合dba,但这个问题在这里很好。这可能甚至已经迁移到这里,因为它不是很技术性。

  4. 对于前两部分,一般的想法是“它取决于”。在您的情况下,由于您可能没有处理大量数据,因此可能不会产生显着差异。你可能需要在表格中至少有10 MB的数据才能产生明显的差异。