在他的答案文森特这样说:
“对表-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”,其余的都是高选择性则指数可能会或可能不会有用。当我们收集索引时,我们可能需要生成直方图,但当查询使用文字而不是绑定变量时,它们才真正有用。
来源
2011-07-29 16:30:41
APC
您好,你知道有多少不同的值会在每列?并且最经常使用哪个查询,因为这将指示要创建哪个索引/索引。 –