2011-07-29 30 views
0

如果我有一个表TABLE_1用,可以说5列:哪些索引是必需的?

COL1 | COL2 | COL3 | COL4 | COL5 
[line] 
[line] 
[...] 

而且主要有两个疑问我想做的事:

SELECT * FROM table_a WHERE COL1 = 'X' and COL2 = 'Y' 

,另一个是:

SELECT * FROM table_a WHERE COL2 = 'Z' 

我应该创建哪些索引?创建一个与列COL1COL2将索引这两个查询,或者我应该需要另一个索引只为COL2为了让第二个查询更快?

谢谢!

+2

您好,你知道有多少不同的值会在每列?并且最经常使用哪个查询,因为这将指示要创建哪个索引/索引。 –

回答

5

这两个查询都可以使用table_a(COL2, COL1)上的常规B树索引。

单独使用索引COL2可能会更有效地检索仅使用此列上的筛选器的行,但附加索引将使用空间并会减慢插入(如果更新此列,则会更新)。这是一个权衡。

+0

值得注意的是,该索引不会用在“where COL1 ='X'”上,因为索引中的列顺序是错误的。为此,你需要一个额外的索引。一个用于COL1,另一个用于COL2。或(COL1,COL2)和COL2。 –

+2

它可以索引跳跃式扫描的第一列,如果基数是很低的,除非你知道你不能做出明智的决定上哪个索引/指数法建立。 –

+0

@比约恩:同意,虽然OP明确地要求只有两个查询(COL1,COL2)和(COL2) –

4

在他的答案文森特这样说:

“对表-A定期B树索引(COL2,COL1)可以通过两种 查询中使用。”

该句中的关键词是“可以”。因为这样的索引也许不会被任何查询使用。

数据库索引是一个复杂而微妙的主题。有entire books written on the topic。 Richard Foote设法保留a blog talking about nothing but Oracle Indexes(和David Bowie)

如果不知道关于表的一些基本事实,我们无法给出明确的答案:它有多少行? COL1有多少个不同的值? COL2有多少个不同的值?

所以,让我们看看一些替代答案。

如果TABLEA只包含十几行,则全表扫描将比任何索引读取更有效。

如果COL2是独一无二的,我们需要的唯一指标是table_a(COL2)

如果(与行的总数量相对较少的值)COL2是无选择性的,则第二个查询应使用全表扫描,而不是一个索引读取。

如果COL2是无选择性,但(与行的总数目,但不是唯一的很多值)COL1是高度选择性的,则第一查询应使用上table_a(COL2, COL1)的索引。

如果COL2不是特别有选择性的,而COL1不是特别有选择性的,但两者的组合是高度选择性的,那么第一个查询应该使用table_a(COL2, COL1)上的索引。全表扫描将是第二个查询的首选路径。

如果COL1是独一无二的,应该有一个指标,这是将在第一查询中使用,但它显然不会在第二个查询帮助。

再有就是空值,这futher节外生枝的事情。除了在复合索引(以及其他特殊情况)之外,NULL不会编入索引。

一个真正完整的答案也能解决歪斜的事情:如果90%的COL1行均为“0”,其余的都是高选择性则指数可能会或可能不会有用。当我们收集索引时,我们可能需要生成直方图,但当查询使用文字而不是绑定变量时,它们才真正有用。

相关问题