2010-11-13 20 views
10

Estoy bastante seguro de que esto no se puede hacer en Oracle, pero me gustaría que se demuestre que está equivocado ...¿Alguna base de datos permite que se creen simultáneamente varios índices en la misma tabla?

Digamos que tengo una gran tabla con muchas columnas y quiero crear índices en una docena de columnas. Usando Oracle, desencadenaría varias declaraciones secuenciales de create index y apagaría y herviría el hervidor.

Cada create index necesita escanear todas las filas de la tabla para formar el índice.

es decir, 10 índices = 10 escaneos completos.

Usted pensaría que una optimización obvia sería escanear la tabla una vez e indexar las 10 columnas al mismo tiempo. ¿No es así?

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

Tan obvio que debe haber una gran razón por la que no está allí.

¿Alguna idea?

Pude disparar cada create index simultáneamente en sesiones separadas y espero que la memoria caché del búfer de la base de datos haya guardado el día, pero parece una posibilidad remota.

EDITAR

no he tenido una respuesta definitiva por lo que la misma pregunta en Oracle-L:

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

consenso general fue que no está disponible pero tal vez sea una característica útil. La respuesta más útil fue de David Aldridge, quien sugirió que si las instrucciones de creación de índice se iniciaran al mismo tiempo, entonces Oracle haría 'lo correcto'.

+0

no he visto ninguna base de datos que soporta eso. Tal vez sea porque asumieron que los índices se crearían por adelantado, donde esto no sería un problema y no cuando la tabla tenga varios GB de datos ;-) –

+4

Nunca he usado Oracle, así que esto probablemente sea irrelevante. De todos modos, ¿no puedes crear una nueva tabla vacía con la misma estructura y los índices requeridos y luego completarla desde tu original? Esto puede hacer o no lo que está pidiendo y, por supuesto, duplicará temporalmente los requisitos del disco. Todavía podría funcionar :) – noodl

+1

Si entendí bien, le gustaría crear índices dinámicamente, pero ¿cuál es la razón por la que no puede tener índices de antemano? – Leonid

Respuesta

1

La respuesta no es para Oracle y, según mi investigación, tampoco es para DB2. Dudo que otros tengan esa característica.

4

No creo que sea posible en Oracle ni en ningún otro DBMS. Sin embargo, en Oracle puede acelerar la creación de índices utilizando opciones como PARALLEL y NOLOGGING.

PARALLEL le permite paralelizar el procesamiento en N otro CPUS.

NOLOGGING se olvida de escribir en el registro de rehacer (que puede que no sea para usted).

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

Gracias por la respuesta, sí, hay muchas maneras de ayudar a acelerar la creación de índices, de los que ha mencionado un par. –

0

En su ejemplo, tenía varios índices de una sola columna, por lo que la siguiente sugerencia no se aplica aquí. Pero quería señalarlo de todos modos ya que es IS un ejemplo de cómo reducir el tiempo de creación de índice en ciertos casos.

Cuando las filas de la tabla están clasificadas físicamente en el mismo orden que el índice que está creando, puede especificar la opción "NOSORT" en su declaración de índice de creación. De esta forma, Oracle no tiene que ordenar las filas durante la creación del índice (que es un asesino cuando el ordenamiento se extiende al disco).

Esto normalmente es útil cuando crea una tabla vacía (o CTAS), inserta las filas en algún orden específico (impuesto por orden) y luego crea directamente un índice usando el mismo orden de columnas que su orden por instrucción.

Cuestiones relacionadas