Indices del derecho o del revés?

10/02/2005 - 19:00 por djsalus | Informe spam
Hola a todos, quería formularos un par de preguntas sobre índices, y
luego explicaros un pequeño caso que me está pasando y me estoy
volviendo un poco majareta.

1) ¿es lo mismo un indice A,B que un indice B,A?
2) Si tengo un indice A,B,C y necesito acceder por A,B, ¿tengo que
crear un indice de A,B, o el que tengo ya lo cubre?
3) Si tengo un indice A,B, pero tengo la siguiente query
select * from tabla
where B = 15 and A = 20
¿cogerá el indice A,B, o espera uno que sea B,A por el orden utilizado
en el where?

Y por último, os comento brevemente lo que me está pasando:
Tengo una tabla con 2.000.000 de registros.
Tengo que acceder por 2 campos alfanuméricos, uno con un "=" y el otro
con un "like".
Sería algo así:
select * from tabla
where campoSTR1 = 'pepe'
and campoSTR2 like 'PE______________'

el problema es que esta query tarda unos 10 segundos la primera vez, y
luego unos 2 segundos el resto de veces.
Si cambio de apellido y vuelvo a lanzar la query, otros 10 segundos.

Tengo indice múltiple por campoSTR1,campoSTR2.


¿alguna idea?

Gracias a todos por vuestra ayuda.

Preguntas similare

Leer las respuestas

#1 Maxi
10/02/2005 - 19:25 | Informe spam
Hola, es muy importante la creacion de indices el orden de los campos, si
creas A,B y luego consultas B,A se complicara. Tambien puedes hacer indices
no compuestos o sea uno por A y otro por B.

Con respecto al like, debes tener mucho cuidado porque mucha de las veces no
usa los indices y ese sintoma que comentas es porque por lo general la
primer vez queda guardado el plan de ejecucion y la segunda lo debe volver a
calcular, quizas si armas un Store Procedure esa sensacion la cambies ;)

De todas maneras, los tiempos son importantes pero para poder hablar con mas
propiedad necesitariamos ver los planes de ejecucion de las consultas,
tambien te recomiendo una leida por los libros on line (BOL) el tema de
indices, veras ahi una excelente explicacion sobre dicho tema.

Un abrazo


Salu2
Maxi


"djana" escribió en el mensaje
news:
Hola a todos, quería formularos un par de preguntas sobre índices, y
luego explicaros un pequeño caso que me está pasando y me estoy
volviendo un poco majareta.

1) ¿es lo mismo un indice A,B que un indice B,A?
2) Si tengo un indice A,B,C y necesito acceder por A,B, ¿tengo que
crear un indice de A,B, o el que tengo ya lo cubre?
3) Si tengo un indice A,B, pero tengo la siguiente query
select * from tabla
where B = 15 and A = 20
¿cogerá el indice A,B, o espera uno que sea B,A por el orden utilizado
en el where?

Y por último, os comento brevemente lo que me está pasando:
Tengo una tabla con 2.000.000 de registros.
Tengo que acceder por 2 campos alfanuméricos, uno con un "=" y el otro
con un "like".
Sería algo así:
select * from tabla
where campoSTR1 = 'pepe'
and campoSTR2 like 'PE______________'

el problema es que esta query tarda unos 10 segundos la primera vez, y
luego unos 2 segundos el resto de veces.
Si cambio de apellido y vuelvo a lanzar la query, otros 10 segundos.

Tengo indice múltiple por campoSTR1,campoSTR2.


¿alguna idea?

Gracias a todos por vuestra ayuda.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
10/02/2005 - 20:41 | Informe spam
Dejanos ver la estructura de la tabla incluyendo contrains, definicion de
indices y ademas un poco el como se ejecutaria la sentencia. Si ejecutas el
siguiente script, podras postear el valor de StmtText. Tambien puedes usar el
script para probar alguna de tus preguntas.

Algo importante que debes saber sobre indices es:

- Que la tabla tenga clave primaria
- Que tenga un indice clustered en la columna que mas uses para consulta de
rangos (select * from tabla where la_fecha between ...).
- Que el indice clustered sea lo mas estrecho posible (columnas que no
tengan tantos bytes), pues la clave de este indice es referenciada en cada
indice no clustered.
- Que cuando crees un indice compuesto, tenga la menor cantidad posible de
columnas. Mientras mas columnas, mas tiempo y recursos le tocaria tomas a sql
server para actualizarlos al igual que para leerlos.
- Que cuando crees un indice compuesto, uses del lado izquierdo la columna
que sea mas selectiva, pues de lo contrario sql preferira hacer un scan de la
tabla o el indice clustered si la selectividad de la columna mas a la
izquierda no es buena (dado un valor de la columna, cuantas filas serian
seleccionadas).
- Si creas un indice compuesto por A, B entonces sql no lo usaria en
consultas where B = ...

*** script

set showplan_text on
go

select * from tabla
where campoSTR1 = 'pepe' and campoSTR2 like 'PE______________'
go

set showplan_text off
go


AMB

"djana" wrote:

Hola a todos, quería formularos un par de preguntas sobre índices, y
luego explicaros un pequeño caso que me está pasando y me estoy
volviendo un poco majareta.

1) ¿es lo mismo un indice A,B que un indice B,A?
2) Si tengo un indice A,B,C y necesito acceder por A,B, ¿tengo que
crear un indice de A,B, o el que tengo ya lo cubre?
3) Si tengo un indice A,B, pero tengo la siguiente query
select * from tabla
where B = 15 and A = 20
¿cogerá el indice A,B, o espera uno que sea B,A por el orden utilizado
en el where?

Y por último, os comento brevemente lo que me está pasando:
Tengo una tabla con 2.000.000 de registros.
Tengo que acceder por 2 campos alfanuméricos, uno con un "=" y el otro
con un "like".
Sería algo así:
select * from tabla
where campoSTR1 = 'pepe'
and campoSTR2 like 'PE______________'

el problema es que esta query tarda unos 10 segundos la primera vez, y
luego unos 2 segundos el resto de veces.
Si cambio de apellido y vuelvo a lanzar la query, otros 10 segundos.

Tengo indice múltiple por campoSTR1,campoSTR2.


¿alguna idea?

Gracias a todos por vuestra ayuda.

Respuesta Responder a este mensaje
#3 Norman A. Armas
10/02/2005 - 21:35 | Informe spam
1) ¿es lo mismo un indice A,B que un indice B,A?


No

2) Si tengo un indice A,B,C y necesito acceder por A,B, ¿tengo que
crear un indice de A,B, o el que tengo ya lo cubre?


El que ya tienes lo cubre.

3) Si tengo un indice A,B, pero tengo la siguiente query
select * from tabla
where B = 15 and A = 20
¿cogerá el indice A,B, o espera uno que sea B,A por el orden utilizado
en el where?


Cogera el indice A,B en caso de que sea el unico , si existe un B,A
utilizara este.

Y por último, os comento brevemente lo que me está pasando:
Tengo una tabla con 2.000.000 de registros.
Tengo que acceder por 2 campos alfanuméricos, uno con un "=" y el otro
con un "like".
Sería algo así:
select * from tabla
where campoSTR1 = 'pepe'
and campoSTR2 like 'PE______________'

el problema es que esta query tarda unos 10 segundos la primera vez, y
luego unos 2 segundos el resto de veces.
Si cambio de apellido y vuelvo a lanzar la query, otros 10 segundos.

Tengo indice múltiple por campoSTR1,campoSTR2.



En este es mas dificil la respuesta con los datos que nos das, cuantos
registros te retorna eses query?
En caso de que sean muchos y solo sea para mostrar la informacion en
pantalla puedes analizar la opcion de paginar el resultado.
Saludos,

Norman




"djana" wrote in message
news:
Hola a todos, quería formularos un par de preguntas sobre índices, y
luego explicaros un pequeño caso que me está pasando y me estoy
volviendo un poco majareta.

1) ¿es lo mismo un indice A,B que un indice B,A?
2) Si tengo un indice A,B,C y necesito acceder por A,B, ¿tengo que
crear un indice de A,B, o el que tengo ya lo cubre?
3) Si tengo un indice A,B, pero tengo la siguiente query
select * from tabla
where B = 15 and A = 20
¿cogerá el indice A,B, o espera uno que sea B,A por el orden utilizado
en el where?

Y por último, os comento brevemente lo que me está pasando:
Tengo una tabla con 2.000.000 de registros.
Tengo que acceder por 2 campos alfanuméricos, uno con un "=" y el otro
con un "like".
Sería algo así:
select * from tabla
where campoSTR1 = 'pepe'
and campoSTR2 like 'PE______________'

el problema es que esta query tarda unos 10 segundos la primera vez, y
luego unos 2 segundos el resto de veces.
Si cambio de apellido y vuelvo a lanzar la query, otros 10 segundos.

Tengo indice múltiple por campoSTR1,campoSTR2.


¿alguna idea?

Gracias a todos por vuestra ayuda.
Respuesta Responder a este mensaje
#4 Eladio Rincón
11/02/2005 - 10:01 | Informe spam
un comentario más:

- elige los índices compuestos por la selectividad de sus columnas; para
(a,b), a debe ser más selectiva que b; en caso contrario deberías crearlo
como (b,a)

- el orden de las condiciones del where NO es determinante para el
optimizador de consultas a la hora de elegir el índice:
where a=n and b=m, será válido tanto para índice (a,b), como (b,a); eso si,
depende su selectividad...

Eladio Rincón
SQL Server MVP

Solid Quality Learning (http://www.solidqualitylearning.com)
"Comparte lo que sabes, aprende lo que no sepas", FGG

Consulte el histórico del grupo en Google
http://groups.google.com/groups?gro....sqlserver

¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

"djana" wrote in message
news:
Hola a todos, quería formularos un par de preguntas sobre índices, y
luego explicaros un pequeño caso que me está pasando y me estoy
volviendo un poco majareta.

1) ¿es lo mismo un indice A,B que un indice B,A?
2) Si tengo un indice A,B,C y necesito acceder por A,B, ¿tengo que
crear un indice de A,B, o el que tengo ya lo cubre?
3) Si tengo un indice A,B, pero tengo la siguiente query
select * from tabla
where B = 15 and A = 20
¿cogerá el indice A,B, o espera uno que sea B,A por el orden utilizado
en el where?

Y por último, os comento brevemente lo que me está pasando:
Tengo una tabla con 2.000.000 de registros.
Tengo que acceder por 2 campos alfanuméricos, uno con un "=" y el otro
con un "like".
Sería algo así:
select * from tabla
where campoSTR1 = 'pepe'
and campoSTR2 like 'PE______________'

el problema es que esta query tarda unos 10 segundos la primera vez, y
luego unos 2 segundos el resto de veces.
Si cambio de apellido y vuelvo a lanzar la query, otros 10 segundos.

Tengo indice múltiple por campoSTR1,campoSTR2.


¿alguna idea?

Gracias a todos por vuestra ayuda.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida