Crear un índice después de la inserción de datos es una forma más eficiente (incluso a menudo se recomienda eliminar el índice antes de la importación por lotes y después de la importación volver a crearlo).
Ejemplo sintético (PostgreSQL 9.1, máquina de desarrollo lento, un millón de filas):
CREATE TABLE test1(id serial, x integer);
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
CREATE INDEX test1_x ON test1 (x);
Insertar y luego crear índice - aproximadamente 12 segundos
CREATE TABLE test2(id serial, x integer);
CREATE INDEX test2_x ON test2 (x);
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
Cree un índice y luego insértelo: aproximadamente 25,5 segundos (más de dos veces más lento)
Probablemente sea mejor crear el índice después de agregar las filas. No solo será más rápido, sino que el equilibrio del árbol probablemente será mejor.
Editar "equilibrio" probablemente no sea la mejor opción de términos aquí. En el caso de un árbol b, está equilibrado por definición. Pero eso no significa que el árbol b tenga el diseño óptimo. La distribución de nodos secundarios dentro de los padres puede ser desigual (lo que genera más costos en futuras actualizaciones) y la profundidad del árbol puede terminar siendo más profunda de lo necesario si el equilibrio no se realiza cuidadosamente durante las actualizaciones. Si el índice se crea después de agregar las filas, es más probable que tenga una mejor distribución. Además, las páginas de índice en el disco pueden tener menos fragmentación después de que se crea el índice. Un poco más de información aquí
fuente
Esto no importa en este problema porque:
O(n*log(N))
largo (donden
se agregan filas). Debido a que el tiempo de generación del árbol esO(N*log(N))
entonces, si divide esto en datos antiguos y datos nuevos, obtiene,O((X+n)*log(N))
esto simplemente se puede convertir aO(X*log(N) + n*log(N))
y en este formato simplemente puede ver lo que esperará adicionalmente.n
nuevas filas) obtiene más tiempo de inserción adicionalO(log(N))
necesario para regenerar la estructura del árbol después de agregar un nuevo elemento (columna de índice de una nueva fila, porque el índice ya existe y se agregó una nueva fila, entonces el índice debe regenerarse para equilibrar estructura, este costoO(log(P))
dondeP
es un índice de potencia [elementos en índice] ). Usted tienen
nuevas filas, finalmente, usted tienen * O(log(N))
a continuaciónO(n*log(N))
resumen tiempo adicional.fuente
Los índices creados después son mucho más rápidos en la mayoría de los casos. Caso en cuestión: 20 millones de filas con texto completo en varchar (255) - (Nombre de la empresa) Índice en su lugar mientras se importan filas - una coincidencia en contra de tomar hasta 20 segundos en el peor de los casos. Deje caer el índice y vuelva a crear: coincida con tomar menos de 1 segundo cada vez
fuente
No estoy seguro de que realmente importe por el bien de la eficiencia del índice, ya que en ambos casos está insertando nuevos datos en el índice. El servidor no sabría cuán desequilibrado estaría un índice hasta después de su construcción, básicamente. En cuanto a la velocidad, obviamente, haga las inserciones sin el índice.
fuente