是否有任何数据库允许同时创建同一个表上的多个索引?

时间:2010-11-13 21:54:17

标签: sql oracle indexing

我很确定在Oracle中无法做到这一点,但我希望被证明是错误的......

假设我有一个包含大量列的大表,我想在十几个列上创建索引。使用Oracle,我会发出几个连续的create index语句,然后开始烧水壶。

每个create index都需要扫描表格中的每一行以形成索引。

即。 10个索引= 10个完整扫描。

您认为明显的优化是扫描表一次并同时索引10列。不是吗?

create indexes on mytable (
    ix_mytable_cola (cola),
    ix_mytable_colb (colb),
    ix_mytable_colc (colc)
);

很明显,必须有一个很好的理由说明它不在那里。

有什么想法吗?

我可以在单独的会话中同时触发每个create index并希望数据库缓冲区缓存保存当天,但似乎是一个很长的镜头。

修改

我没有得到明确的答案所以我在Oracle-L问了同样的问题:

http://www.freelists.org/post/oracle-l/Creating-multiple-indexes

普遍的共识是它不可用,但可能是一个有用的功能。最有用的回复来自David Aldridge,他建议如果创建索引语句全部同时启动,那么Oracle将“做正确的事情”。

4 个答案:

答案 0 :(得分:5)

我认为在Oracle或任何其他DBMS中都不可能。但是在Oracle中,您可以使用PARALLELNOLOGGING等选项加快索引创建速度。

PARALLEL允许您将处理并行化为N个其他CPUS。

NOLOGGING放弃写入重做日志(可能不适合您)。

CREATE INDEX some_idx
   ON a_table(col1, col2, col3)
PARALLEL 3
NOLOGGING;

答案 1 :(得分:1)

对于Oracle来说答案是否定的,根据我的研究,对DB2来说也是如此。我怀疑其他人是否有这个功能。

答案 2 :(得分:0)

在您的示例中,您有多个单列索引,因此以下建议不适用于此处。但无论如何我想指出它,因为 IS 是在某些情况下如何减少索引创建时间的一个例子。

当表行的物理排序顺序与您构建的索引的顺序相同时,您可以在create index语句中指定“NOSORT”选项。这样Oracle就不必在创建索引期间对行进行排序(当排序溢出到磁盘时,这是一个杀手)。

当您创建空表(或CTAS),按特定顺序插入行(按顺序强制执行),然后使用与order by语句相同的列顺序直接创建索引时,这通常很有用。 / p>

答案 3 :(得分:0)