Supongamos que tengo una tabla de base de datos con dos campos, "foo" y "bar". Ninguno de ellos es único, pero cada uno de ellos está indexado. Sin embargo, en lugar de indexarse juntos, cada uno tiene un índice separado.¿Pueden trabajar juntos varios índices?
Ahora supongo que realizo una consulta como SELECT * FROM sometable WHERE foo='hello' AND bar='world';
en mi tabla un gran número de filas para las cuales foo es 'hola' y un pequeño número de filas para las cuales la barra es 'mundial'.
Por lo tanto, lo más eficiente para el servidor de base de datos es usar el índice de barras para encontrar todos los campos donde la barra es 'mundo', luego devolver solo aquellas filas para las cuales foo es 'hola'. Esto es O(n)
donde n es el número de filas donde la barra es 'mundo'.
Sin embargo, me imagino que es posible que el proceso ocurra al revés, donde se utilizó el índice fo y se buscaron los resultados. Esto sería O(m)
donde m es el número de filas donde foo es 'hola'.
Entonces, ¿Oracle es lo suficientemente inteligente como para buscar de manera eficiente aquí? ¿Qué pasa con otras bases de datos? ¿O hay alguna forma de que pueda decirlo en mi consulta para buscar en el orden correcto? ¿Quizás poniendo bar='world'
primero en la cláusula WHERE
?
Con todo Respete a David, mirando los comentarios de Eli a continuación, la respuesta a su pregunta es "use bitmaps". –
Los índices de bitmap son ciertos eficiente en este tipo de consulta, pero son muy hostiles en un entorno OLTP. También vale la pena saber que un par de índices btree se pueden combinar en una operación de mapa de bits, aunque hay una sobrecarga mucho mayor en esto. –