2009-12-08 16 views
8

Si tengo una mesa deíndice con múltiples columnas - ¿está bien al hacer una consulta en una sola columna?

create table sv (id integer, data text) 

y un índice:

create index myindex_idx on sv (id,text) 

sería esto todavía ser muy útil si lo hice una consulta

select * from sv where id = 10 

Mi razón para pedir es que i' m mirando a través de un conjunto de tablas sin ningún índice, y viendo diferentes combinaciones de consultas de selección. Algunos usos solo una columna más tiene más de uno. ¿Debo tener índices para ambos conjuntos o un índice de todo incluido bien? Estoy agregando los índices para búsquedas más rápidas que los escaneos completos de tablas.

Ejemplo (basado en la respuesta de Matt Huggins):

select * from table where col1 = 10 
select * from table where col1 = 10 and col2=12 
select * from table where col1 = 10 and col2=12 and col3 = 16 

todo podría estar cubierta por tabla de índice (co1l1, col2, col3) pero

select * from table where col2=12 

necesitaría otro índice?

+0

I just <3 StackOverflow. Excelentes respuestas mucho mejor de lo esperado. Acepté la respuesta que utilicé y permití que la respuesta más votada fuera el suplemento justo debajo de la respuesta aceptada – svrist

Respuesta

15

Debería ser útil ya que un índice en (id, texto) primero indexa por id, luego texto respectivamente.

  • Si consulta por ID, este índice será utilizado.
  • Si consultas por id & texto, se usará este índice.
  • Si consultas por texto, este índice NO se usará.

Editar: cuando digo que es "útil", quiero decir que es útil en términos de velocidad de las consultas/optimización. Como señaló Sune Rievers, no significará que obtendrá un registro único con solo ID (a menos que especifique el ID como único en la definición de su tabla).

+2

Bueno, podría usarse si consulta por 'texto': la estimación del costo aún podría favorecer una exploración de omisión de índice, una exploración de índice o una exploración rápida de índice completo. –

2

Supongo id es la clave principal. No tiene sentido agregar una clave principal al índice, ya que esto siempre será único. Agregar algo único a otra cosa también será único.

Agregue un índice único a text, si realmente lo necesita, de lo contrario solo use id es la singularidad de la tabla.

Si id no es su clave principal, no se garantiza que obtenga un resultado único de su consulta.

En cuanto a su último ejemplo con la búsqueda en col2, creo que podría necesitar otro índice. Sin embargo, los índices no son una solución panacea para problemas de rendimiento. Algunas veces se debe optimizar el diseño de la base de datos o las consultas, por ejemplo, reescribirlos en procedimientos almacenados (aunque no estoy seguro de que Oracle los tenga, estoy seguro de que hay un Oracle equivalente).

+1

Agregar otra columna a un índice PK podría ser útil si permitía que un número significativo de consultas utilizara solo el índice y evitara acceso a la mesa por completo. –

+0

Cierto, pero ese también sería el caso al agregar un índice a la otra columna (clave cardinal). Puede haber una pequeña ganancia de rendimiento en la clave compuesta sobre la clave de valor único + otro índice. –

8

Oracle soporta un número de maneras de usar un índice, y usted debe comenzar por comprender todos ellos para tener una lectura rápida aquí: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#sthref973

Su consulta select * from table where col2=12 podría aprovechar de forma útil un índice exploración con omisión si el líder la columna tiene una cardinalidad muy baja, o una exploración de índice completa rápida si no es así. Estos probablemente estarían bien para ejecutar informes, sin embargo, para una consulta OLTP es probable que sea mejor crear un índice con col2 como columna principal.

+1

+1 Para mencionar el escaneo de salto de índice. Compresión de índice, cardinalidad de datos, estadísticas, todos juegan juntos para definir el plan a usar. – ewernli

2

Si el conductor detrás de su pregunta es que tiene una tabla con varias columnas y cualquier combinación de estas columnas se puede utilizar en una consulta, entonces debe mirar los índices BITMAP.

En cuanto a su ejemplo:

select * from mytable where col1 = 10 and col2=12 and col3 = 16 

Se puede crear índices de mapa de bits 3:

create bitmap index ix_mytable_col1 on mytable(col1); 
create bitmap index ix_mytable_col2 on mytable(col2); 
create bitmap index ix_mytable_col3 on mytable(col3); 

Estos índices de mapa de bits tienen la gran ventaja de que pueden ser combinados según sea necesario.

Así, cada una de las siguientes consultas sería usar uno o más de los índices:

select * from mytable where col1 = 10; 

select * from mytable where col2 = 10 and col3 = 16; 

select * from mytable where col3 = 16; 

Por lo tanto, los índices de mapa de bits puede ser una opción para usted. Sin embargo, como señaló David Aldridge, dependiendo de su conjunto de datos en particular, un único índice en (col1, col2, col3) podría ser preferible. Como siempre, depende. Eche un vistazo a sus datos, las posibles consultas en contra de esos datos, y asegúrese de que sus estadísticas estén actualizadas.

Espero que esto ayude.

+0

+1 Muy interesante. No conocía las matrices de mapas de bits, pero http://en.wikipedia.org/wiki/Bitmap_index tiene un breve y bonito artículo sobre ellas. –

+1

Sin embargo, hay que tener cuidado: los índices de mapas de bits no se adaptan amablemente a las modificaciones concurrentes, por lo que suelen ser una opción deficiente en los sistemas OLTP. –

+0

cierto. Pobre en OLTP: fantástico en data warehouses. "Como siempre, depende". –

Cuestiones relacionadas