我很确定在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将“做正确的事情”。
答案 0 :(得分:5)
我认为在Oracle或任何其他DBMS中都不可能。但是在Oracle中,您可以使用PARALLEL
和NOLOGGING
等选项加快索引创建速度。
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)