Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否有数据库允许在同一个表上同时创建多个索引?_Sql_Oracle_Indexing - Fatal编程技术网

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

Sql 是否有数据库允许在同一个表上同时创建多个索引?,sql,oracle,indexing,Sql,Oracle,Indexing,我很确定这不能在甲骨文中实现,但我希望被证明是错的 假设我有一个包含很多列的巨大表,我想在十几列上创建索引。使用Oracle,我会启动几个连续的createindex语句,然后去烧开水壶 每个create index都需要扫描表中的每一行以形成索引 i、 e.10个索引=10次完整扫描 您可能认为一个明显的优化方法是扫描表一次,同时为10列编制索引。你不会吗 create indexes on mytable ( ix_mytable_cola (cola), ix_mytabl

我很确定这不能在甲骨文中实现,但我希望被证明是错的

假设我有一个包含很多列的巨大表,我想在十几列上创建索引。使用Oracle,我会启动几个连续的
createindex
语句,然后去烧开水壶

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

i、 e.10个索引=10次完整扫描

您可能认为一个明显的优化方法是扫描表一次,同时为10列编制索引。你不会吗

create indexes on mytable (
    ix_mytable_cola (cola),
    ix_mytable_colb (colb),
    ix_mytable_colc (colc)
);
很明显,它不在那里肯定有很好的原因

有什么想法吗

我可以在单独的会话中同时启动每个
create index
,并希望数据库缓冲区缓存可以挽救这一天,但这似乎是一个很长的机会

编辑

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


普遍的共识是它不可用,但可能是一个有用的功能。最有用的回答是,世卫组织建议,如果create index语句同时启动,那么Oracle将“做正确的事情”。

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

PARALLEL
允许您在N个其他CPU上并行处理

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


Oracle的答案是否定的,根据我的研究,DB2的答案也是否定的。我怀疑其他人是否有这种功能。

在您的示例中,您有多个单列索引,因此下面的建议不适用于这里。但我还是想指出它,因为它是在某些情况下如何缩短索引创建时间的一个例子

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

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

注意到2008年3月的这篇博文


我从未使用过Oracle,因此这可能与此无关。无论如何,您不能创建一个具有相同结构和所需索引的新空表,然后从原始表中填充它吗?这可能满足您的要求,也可能不满足您的要求,当然,它会暂时将磁盘需求增加一倍。但它仍然可以工作:)如果我理解正确,您希望动态创建索引,但您不能事先创建索引的原因是什么?谢谢您的建议。然而,预先创建索引的想法在数据仓库大小表上不起作用。将数据加载到具有预先存在的索引的表中是一个真正的性能杀手(即使像Oracle的情况一样,索引创建可能会延迟到数据加载之后)。通常在数据仓库的情况下,您会将数据加载到一个表中,尽可能少地使用索引,然后重新生成索引。@Jürgen Hollfelder-是的,当然可以并行创建索引,但创建每个索引需要对表进行完全扫描。我建议可以将其优化为一次完整扫描,在处理每一行时对要索引的每一列进行采样。只有当数据库缓冲区缓存恰好包含每个并行会话所需的相关块时(即使如此,仍然需要从缓冲区缓存读入每个会话的开销),才会在并行创建索引时发生这种情况。。。。想象一下,您将如何编写代码来创建10列内容的10个哈希映射—您是在表行中循环10次,还是一次循环并一次创建10个哈希映射?感谢您的回复—是的,有很多方法可以帮助加快索引创建,您已经提到了其中的一些方法。
CREATE INDEX some_idx
   ON a_table(col1, col2, col3)
PARALLEL 3
NOLOGGING;