2010-03-23 15 views
5

Me gustaría saber el rendimiento de este índice:índice en la columna con sólo 2 valores distintos

tengo una varchar "no válido" (1) columna que tiene 2 valores: NULL o 'Y' tengo una index on (inválido), así como (inválido, last_validado) Last_validated is datetime (esto se usa para una consulta SELECT no relacionada)

Estoy marcando una pequeña cantidad de elementos (1-5%) de las filas en la tabla con esto como 'a eliminar'.
Esto es así cuando me

DELETE FROM items WHERE invalid='Y' 

que no realiza un escaneo completo de tabla para los elementos no válidos.

Parece que hay un problema, el DELETE real es ahora bastante lento, posiblemente porque todos los índices se eliminan a medida que se eliminan.

¿Un índice de mapa de bits proporcionaría un mejor rendimiento para esto? o tal vez no hay índice en absoluto?

Respuesta

0

Dos pensamientos sobre esto ...

  1. usar NULL para expresar lo contrario de 'Y' no es posiblemente una buena idea. Nulo significa * No sé cuál es este valor 'o' no hay una respuesta válida a una pregunta '. Realmente debería usar 'N' como opuesto a 'Y'. Esto eliminaría el problema de buscar elementos válidos, porque Oracle no usará el índice en esa columna cuando solo contenga valores no nulos.

  2. Puede que desee agregar un CHECK CONSTRAINT en dicha columna para asegurarse de que solo se ingresen los valores legales.

Ninguno de estos cambios tiene necesariamente ningún impacto en el rendimiento de DELETE.

+2

Lógicamente, estoy de acuerdo con su punto n. ° 1; en la práctica, sin embargo, hay * en algunos casos * beneficios de rendimiento significativos para representar valores poco interesantes como NULL en una columna debido a que Oracle no almacena filas nulas en índices, si las consultas en esa columna casi siempre solo están interesadas en los raros valores 'Y', entonces no tener' 'Y' representado como NULL puede tener un gran impacto en el rendimiento de las consultas, actualizaciones y eliminaciones. –

+0

[Este artículo] (https://richardfoote.wordpress.com/2011/08/10/indexing-a-column-with-just-one-distinct-value-all-the-madmen/) confirma con más detalle @ Declaración de JeffreyKemp. – GolezTrol

1

Se debe utilizar el índice, pero DELETE aún puede tomar algún tiempo.

Tenga una mirada en el plan de ejecución de la DELETE:

EXPLAIN PLAN FOR 
    DELETE FROM items WHERE invalid='Y'; 

SELECT * FROM TABLE(dbms_xplan.display); 

Usted podría tratar de usar un índice de mapa de bits, pero dudo de que tendrá un gran impacto en el rendimiento.


Utilizando NULL como valor no es una buena idea. La consulta

SELECT something FROM items WHERE invalid IS NULL 

no podría utilizar su índice, ya que solo contiene valores no nulos.

2

Como sugirió Peter, es importante verificar primero que el índice se esté utilizando para la eliminación. Los índices de mapa de bits invocarán otros bloqueos para DML que podrían dañar el rendimiento general.

consideraciones adicionales:

  • están allí no indexados extranjeros clave referencias a esta tabla de otros tablas?
  • ¿Hay desencadenantes en esta tabla que realicen otro DML?
0

Coloque el índice en (no válido) y pruebe tanto SELECCIONAR como ELIMINAR. Ya tiene un índice activado (no válido, último validado). No debería necesitar el índice solo como no válido. ¿También aproximadamente cuántas filas hay en esta tabla?

+0

La ventaja del índice en 'invalid' es que solo contendrá filas donde' invalid' no es nulo, y por lo tanto será muy rápido de consultar. Por otro lado, '(invalid, last_validated)' contendrá una entrada para cada fila que tenga un 'invalid' no nulo o 'last_validated'; si 'last_validated' es en su mayoría no nulo, el índice será bastante grande y, por lo tanto, menos adecuado para esta operación DELETE. –

0

recomiendo:

  1. comprobar cuántos registros se espera que el BORRAR para efecto (es decir, a lo mejor hay más de lo esperado)
  2. si el número de filas que se deben eliminar es relativamente pequeña, cheque que el índice en invalid está siendo utilizado por DELETE
  3. obtenga un seguimiento de la sesión para ver qué está haciendo - podría leer más bloques del disco de lo esperado o podría estar esperando (por ejemplo, bloqueo de registros o bloqueo) contención)

No se moleste en dejar caer o crear índices hasta que tenga una idea de lo que realmente está sucediendo. Podrías hacer todo tipo de cambios, ver una mejora (pero no saber por qué mejoró), luego, meses después, el problema vuelve a ocurrir o es aún peor.

Cuestiones relacionadas