una - create index postgresql ejemplos
¿Cuándo se debe crear el índice en la columna de la tabla en la base de datos? (3)
No soy db chico. Pero necesito crear tablas y hacer operaciones CRUD en ellas. Me confundo si debo crear el índice en todas las columnas de forma predeterminada o no? Aquí está mi entendimiento que considero al crear el índice.
El índice básicamente contiene el rango de ubicación de la memoria (ubicación de la memoria inicial donde el primer valor se almacena en la ubicación de la memoria final donde se almacena el último valor). Por lo tanto, cuando insertemos cualquier valor en el índice de la tabla para columna, debe actualizarse ya que tiene un valor más, pero la actualización del valor de la columna no tendrá ningún impacto en el valor del índice. ¿Derecha? El resultado final es cuando mi columna se usa para unir dos tablas; deberíamos considerar crear un índice en la columna utilizada en la unión, pero todas las otras columnas pueden omitirse porque si creamos índice en ellas implicará un costo adicional de actualizar el valor del índice cuando el nuevo valor está insertado en la columna. ¿Derecha?
Considere este escenario donde la tabla mytable
contiene dos tres columnas, es decir, col1
, col2
, col2
. Ahora activamos esta consulta
select col1,col2 from mytable
Ahora hay dos casos aquí. En el primer caso, creamos el índice en col1
y col2
. En el segundo caso, no creamos ningún índice. ** Según mi entendimiento, el caso 1 será más rápido que el caso 2 porque en el caso 1, Oracle puede encontrar rápidamente la ubicación de la memoria de la columna. Así que aquí no he usado ninguna columna de unión, pero el índice está ayudando aquí. Entonces, ¿debería considerar crear un índice aquí o no? **
¿Qué pasaría si en el mismo escenario anterior si disparamos?
select * from mytable
en lugar de
select col1,col2 from mytable
¿Ayudará el índice aquí?
pero la actualización del valor de la columna no tendrá ningún impacto en el valor del índice. ¿Derecha?
No. La actualización de una columna indexada tendrá un impacto. El manual de rendimiento de Oracle 11g establece que:
Las instrucciones UPDATE que modifican las columnas indexadas y las instrucciones INSERT y DELETE que modifican las tablas indexadas tardan más que si no hubiera ningún índice. Tales declaraciones SQL deben modificar los datos en índices y datos en tablas. También crean deshacer y rehacer adicionales.
El resultado final es cuando mi columna se usa para unir dos tablas; deberíamos considerar crear un índice en la columna utilizada en la unión, pero todas las otras columnas pueden omitirse porque si creamos índice en ellas implicará un costo adicional de actualizar el valor del índice cuando el nuevo valor está insertado en la columna. ¿Derecha?
No solo inserciones, sino cualquier otra declaración del Lenguaje de Manipulación de Datos.
Considera este escenario. . . ¿Ayudará el índice aquí?
Con respecto a este último párrafo, ¿por qué no crear algunos casos de prueba con volúmenes de datos representativos para que pueda probar o refutar sus suposiciones sobre qué columnas debe indexar?
¡No crees índices en cada columna! Disminuirá la velocidad de las operaciones de inserción / eliminación / actualización.
Como simple recordatorio, puede crear un índice en columnas que son comunes en las cláusulas WHERE
, ORDER BY
y GROUP BY
. Puede considerar agregar un índice en columnas que se utilizan para relacionar otras tablas (a través de un JOIN
, por ejemplo)
Ejemplo:
SELECT col1,col2,col3 FROM my_table WHERE col2=1
Aquí, crear un índice en col2 ayudaría mucho a esta consulta.
Además, considere la selectividad del índice. En pocas palabras, cree un índice en los valores que tienen un "gran dominio", es decir, Id., Nombres, etc. No los cree en columnas masculinas / femeninas.
En el escenario específico que usted brinda, no existe una cláusula WHERE, por lo que se usará un escaneo de tabla o se usará el escaneo de índice, pero solo está descartando una columna, por lo que el rendimiento puede no ser tan diferente. En el segundo escenario, el índice no se debe usar, ya que no está cubriendo y no hay una cláusula WHERE. Si hubiera una cláusula WHERE, el índice podría permitir que el filtrado reduzca el número de filas que deben buscarse para obtener la columna faltante.
Oracle tiene varias tablas diferentes, incluidas las tablas organizadas de montones o índices.
Si un índice cubre, es más probable que se use, especialmente cuando es selectivo. Pero tenga en cuenta que una tabla organizada por índice no es mejor que un índice de cobertura en un montón cuando hay restricciones en la cláusula WHERE y muchas menos columnas en el índice de cobertura que en la tabla base.
Crear índices con más columnas de las que se usan realmente solo ayuda si es más probable que cubran el índice, pero agregar todas las columnas sería similar a una tabla organizada por índice. Tenga en cuenta que Oracle no tiene el equivalente de INCLUDE (COLUMN) de SQL Server, que se puede usar para hacer que los índices cubran más (en realidad está haciendo un índice agrupado adicional de solo un subconjunto de las columnas, útil si desea que un índice sea único pero también agregue algunos datos que no desea que se consideren en la singularidad, pero ayuda a cubrir más consultas)
Necesita ver sus planes y luego determinar si los índices lo ayudarán. Y luego mira los planes después para ver si hicieron una diferencia.