Un indice sobre dos campos o dos indices

30/08/2005 - 18:04 por Sonlino | Informe spam
Hola a todos, a ver si me podeís ayudar con las siguientes dudas sobre
índices:


Tengo dos campos tipo string (teléfonos) y quiero hacer busquedas sobre uno
u otro (Select * from tabla where (tel1 = '987654321') or (tel2 =
'987654321')

He estado analizando el funcionamiento del SQL Server con el plan de
ejecución y he visto que si busco sólo por el Tel2 y el índice definido está
agrupado (Clustered) no lo usa (Si busco por tel1 sí que lo hace), en
cambio, si no está agrupado si que lo utiliza para buscar. ¿Alguién sabe por
que funciona así?



Creo que es más efectivo para agilizar la búsqueda utiliza un indice para
cada teléfono, pero, como cuando lo defino como no agrupado sólo usa este, y
con tiempos buenos, no lo tengo tan claro.

¿Que opinion tenéis sobre esto? ¿Cual es la mejor opción?

(Evidentemente, la tabla en cuenstión ya tiene clave primaria, sólo quiero
agilizar las busquedas sobre estos campos)

Muchas gracias,
 

Leer las respuestas

#1 Alejandro Mesa
30/08/2005 - 18:29 | Informe spam
No existe una regla unica, ya que el use de los indices por parte de sql
server depende en la distribucion de los valores de las columnas que
conforman la llave del indice. En el caso de llaves compuestas, sql server
solo guarda el histograma de la columna que esta mas a la izquierda en la
llave, por lo que si creas el indice como (tel1, tel2) entonces sql server
podra o no usar el indice si en la clausula "where" tienes:

- tel1
- tel1 and tel2

pero no lo usara si solo tienes tel2. Asi que un buen empezar es creando un
indice por cada columna, al menos que ya sepas de antemano que la
selectividad de esa columna es baja (la sentencia select devuelve muchas
filas para un valor dado) y por lo tanto crear un indice compuesto ayudaria a
mejorarla.

Te paso un link donde encontraras muchos tips sobre el uso de indices. Busca
todo los relacionado con ellos.

http://www.sql-server-performance.c...rmance.asp


AMB

"Sonlino" wrote:

Hola a todos, a ver si me podeís ayudar con las siguientes dudas sobre
índices:


Tengo dos campos tipo string (teléfonos) y quiero hacer busquedas sobre uno
u otro (Select * from tabla where (tel1 = '987654321') or (tel2 =
'987654321')

He estado analizando el funcionamiento del SQL Server con el plan de
ejecución y he visto que si busco sólo por el Tel2 y el índice definido está
agrupado (Clustered) no lo usa (Si busco por tel1 sí que lo hace), en
cambio, si no está agrupado si que lo utiliza para buscar. ¿Alguién sabe por
que funciona así?



Creo que es más efectivo para agilizar la búsqueda utiliza un indice para
cada teléfono, pero, como cuando lo defino como no agrupado sólo usa este, y
con tiempos buenos, no lo tengo tan claro.

¿Que opinion tenéis sobre esto? ¿Cual es la mejor opción?

(Evidentemente, la tabla en cuenstión ya tiene clave primaria, sólo quiero
agilizar las busquedas sobre estos campos)

Muchas gracias,




Preguntas similares