2011-08-16 9 views
6

SQL Asistente para la optimización de Oracle SQL Developer v3 sugiere lo siguiente para mi consulta:¿Es necesario considerar dejar caer el índice existente, ya que es un prefijo del índice recomendado

considere ejecutar el Asesor de Acceso a mejorar la esquema físico diseño o crear el índice recomendado. Si decide crear el índice recomendada, considera eliminar el índice "SchemaName". "INDEXNAME" (en 'COLUMN1') porque es un prefijo del índice recomendado .

create index SCHEMANAME.NEW_INDEXNAME on SCHEMANAME.TABLENAME("COLUMN1","COLUMN2");

¿Hay algún daño en no haciendo sugerencia en negrita? El problema es que el índice existente que sugiere descartar es utilizado por otros procedimientos. No creía que las ideas pudieran "perjudicarse" entre sí, ¿hay alguna desventaja de dejar ambos índices aparte del espacio en disco que tomarán y un declive de rendimiento insignificante en la inserción/actualización?

Respuesta

8

Por lo tanto, suponiendo que OLD INDEX está en [Column1] y RECOMMENDED INDEX está en [Column1] [Column2], el índice recomendado también se puede usar para las consultas existentes.

En resumen: eliminación el ÍNDICE VIEJO será, como usted ha dicho, aumento de rendimiento en insertar/actualizar, y tampoco disminuirá la capacidad de buscar recorte de bordes en las consultas que se estaban utilizando ÍNDICE DE EDAD. ÍNDICE RECOMENDADO Aún permite buscar valores de [Columna1], así como valores de [Columna1] [Columna2].

Por lo tanto, no hay ningún daño además de la caída de rendimiento en la actualización/inserción y la sobrecarga de almacenamiento adicional, pero también hay sin ganancia para mantener ambos índices.

+2

+1 pero tal vez también podría agregar la desventaja de espacio de almacenamiento adicional? –

+1

¡listo! el viejo índice está en la columna1. Bueno, si eliminarlo no dañará el filtrado en la columna 1, ¿por qué no siempre creamos un gran índice de grasa para todas las columnas que consultamos? – Tsar

+1

@tsar Un índice de datos crea copias de los datos en una estructura de datos diferente (B-tree en SQL Server, inseguro en otros RDBMS). Si es un índice no agrupado, solo copiará esos campos (Columna1/Columna2 en este caso) y luego una referencia para buscar el resto de los datos de ese registro en la tabla completa. Un índice agrupado almacena todo el conjunto de datos en la estructura de datos adicional. Esto significa * mucho * de sobrecarga de datos, y un montón de procesamiento para equilibrar la estructura de datos en la inserción/actualización. –

4

El daño en no perder el índice original es la sobrecarga que Oracle tiene para mantener ambos índices cuando solo se necesita uno.

La desventaja de dejarlos es una caída en el rendimiento de las operaciones CRUD en su mesa, me doy cuenta por su publicación que esto puede ser "insignificante" en este momento pero las tablas crecen con el tiempo y en el futuro esto podría causar problemas eso luego tendría que ser remediado.

También tomará más almacenamiento innecesariamente.

Sus procedimientos anteriores también podrán usar el nuevo índice.

Dejar los índices innecesarios confundirá a los futuros desarrolladores y DBA que tienen que soportar su base de datos, lo que les cuesta tiempo y esfuerzo para investigar por qué existe el índice duplicado.

En lugar de buscar razones para no dejar caer el índice original, estaría buscando razones para mantenerlo.

Déjalo, prueba el rendimiento de tus "otros" procedimientos y verás poca diferencia; si hay un problema, puedes investigar por qué y si es necesario reemplazarlo.

6

En realidad puede haber una disminución en el rendimiento cuando suelta el índice en la columna individual.

Supongamos que hace una consulta con WHERE [Column1] = 123. Esto podría resolverse perfectamente con el índice original. El nuevo índice también se puede usar para esto, pero -dependiendo de la implementación- también necesitará leer los valores de [Columna2] en el índice aunque no se utilicen.

Así que sí: en teoría, puede haber un inconveniente para bajar el índice: lecturas aumentadas.

[y actualización 9 de sept.]
Recientemente me encontré con otra situación en la que un único índice puede ser mucho mejor que un índice combinado.
Considere una tabla enorme 'errores' con columna [estado], [crear fecha] y algunos otros campos. La mayoría de los errores se cerrarán así que asuma que el estado es '0' (abierto) para 100 registros y '1' (cerrado) para 99000 registros.

SELECT * FROM bugs WHERE status = '0' se beneficiarán enormemente de un índice en status mientras que con SELECT * FROM bugs WHERE status = '1' un índice en status no ayudará.

Oracle sabrá la diferencia porque crea estadísticas en el índice.

Sin embargo, con un índice combinado en status, createdate cada entrada de índice es casi única y Oracle decidirá no utilizar el índice para la consulta SELECT * FROM bugs WHERE status = '0' porque adivina (erróneamente) que el índice no ayudaría.

Por lo tanto, en esta situación, no se debe descartar un solo índice solo porque es un prefijo de un índice combinado.

Nota: En teoría, Oracle podría crear incluso estadísticas más inteligentes en el índice, pero no parece hacer eso.

+0

¿Hay un enlace a esto en cualquier documentación de Oracle? ¿Qué tipo de caída de rendimiento se esperaría? – Ollie

+2

No conozco ninguna documentación, solo mi interpretación de cómo entiendo cómo funcionan los índices. Tener dos columnas en el índice hace que el índice total sea dos veces más grande. Cuando el índice es muy selectivo (o único), Oracle normalmente solo necesitará leer unos pocos 'bloques' para obtener toda la información que necesita.Cuando el índice es dos veces más grande, existe la posibilidad de que necesite leer más bloques. Sin embargo, creo que el efecto es insignificante en todos los casos prácticos. – Jeff

+3

+1. Pensé que esto era obvio, me sorprende que no hayas obtenido más votos. Si su índice es más grande y contiene información que no todas las consultas necesitarán, entonces, en algunos casos, habrá una penalización de rendimiento. –

Cuestiones relacionadas