Duda sobre Indice

18/04/2007 - 17:51 por Alejandro.33.Chile | Informe spam
Estimados Listeros.
En un supuesto : Tengo la Tabla1

Numero varchar(10)
Nombre varchar(50)
Fecha datetime

PK_Numero campo Numero
FK_Nombre_Fecha campos nombre,fecha

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?
- Si tengo FK_Fecha , cual de las 2 FK usa ?
- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?


Gracias.

Preguntas similare

Leer las respuestas

#1 Javier Loria
18/04/2007 - 18:26 | Informe spam
Hola Alejandro:
Asumo que la PK es Clustered porque es el default.
1. Probablemente nunca, porque le falta el Nombre para traer la
informacion completa y el filtro no le sirve de nada.
2. Depende. Si hay muchas filas en la tabla y solo unas cuantas son del
1/1/2007, usara el indice Fecha, si hay pocas filas o si hay digamos 10000 y
1000 son del 1/1/12007 lo más problable es que no se use.
3. Como numero es unico (PK) y clustered siempre usara esta.
Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

wrote in message
news:
Estimados Listeros.
En un supuesto : Tengo la Tabla1

Numero varchar(10)
Nombre varchar(50)
Fecha datetime

PK_Numero campo Numero
FK_Nombre_Fecha campos nombre,fecha

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?
- Si tengo FK_Fecha , cual de las 2 FK usa ?
- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?


Gracias.

Respuesta Responder a este mensaje
#2 Isaias
18/04/2007 - 18:44 | Informe spam
Por principio de cuentas, te sugiero manejar las fechas en formato ANSI.

Where Fecha >= '20070101' and Fecha <= '20070101'


Saludos
IIslas


"" wrote:

Estimados Listeros.
En un supuesto : Tengo la Tabla1

Numero varchar(10)
Nombre varchar(50)
Fecha datetime

PK_Numero campo Numero
FK_Nombre_Fecha campos nombre,fecha

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?
- Si tengo FK_Fecha , cual de las 2 FK usa ?
- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?


Gracias.


Respuesta Responder a este mensaje
#3 Alejandro Mesa
18/04/2007 - 19:42 | Informe spam
,

La mejor manera de contestar seria probando. que es lo que te dice los
planes de ejecucion para las diferentes sentencias que quieres usar?

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?



La palabra "Usa" tiene un significado muy amplio. Un indice puede ser usado
para realizar una operacion "seek" (lo optimo) o para hacer un scan del mismo
(operacion no tan optima comparada con "seek"). Para que el optimizador de
queries pueda decidir que operacion llevar a cabo, necesita analizar las
estadisticas de distribucion, especialmente el histograma, el cual se genera
o almacena solo para la columna mas a la izquierda en la llave del indice (en
este caso seria [Nombre]). Como la expresion que usas en la clausula "where"
no incluye la columna [nombre], entonces el histograma no sera usado por el
optimizador de queries.

- Si tengo FK_Fecha , cual de las 2 FK usa ?



Si te refieres a la misma sentencia, pues ya sabes, puede que use el indice
FK_Fecha, si es que la selectividad en esa columna para ese valor es alta. En
otras palabras, si la cantidad de filas que machan la expresion
"Fecha='01/01/2007" son muchas, entonces sera mas caro para SQL Server
recorrer el indice nonclustered y luego ir a la tabla a buscar la informacion
pedida y por lo tanto SQL Server puede escojer hacer un scan del indice
clustered o de la tabla (si es heap).

- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?



Definitivamente usara PK_Numero, ya que la columna [Numero] es la clave
primaria (alta selectividad) y ademas contiene el resto de la data pedida (*).


AMB


"" wrote:

Estimados Listeros.
En un supuesto : Tengo la Tabla1

Numero varchar(10)
Nombre varchar(50)
Fecha datetime

PK_Numero campo Numero
FK_Nombre_Fecha campos nombre,fecha

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?
- Si tengo FK_Fecha , cual de las 2 FK usa ?
- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?


Gracias.


Respuesta Responder a este mensaje
#4 jcac
18/04/2007 - 19:56 | Informe spam
Perdón por la intromisión, pero Alejandro donde se puede obtener información
la cual indique lo que estas indicando en tu post, como por ejemplo:
" el cual se genera o almacena solo para la columna mas a la izquierda en la
llave del indice (en este caso seria [Nombre]). Como la expresion que usas
en la clausula "where" no incluye la columna [nombre], entonces el
histograma no sera usado por el optimizador de queries."

saludos


"Alejandro Mesa" escribió en el
mensaje news:
,

La mejor manera de contestar seria probando. que es lo que te dice los
planes de ejecucion para las diferentes sentencias que quieres usar?

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?



La palabra "Usa" tiene un significado muy amplio. Un indice puede ser
usado
para realizar una operacion "seek" (lo optimo) o para hacer un scan del
mismo
(operacion no tan optima comparada con "seek"). Para que el optimizador de
queries pueda decidir que operacion llevar a cabo, necesita analizar las
estadisticas de distribucion, especialmente el histograma, el cual se
genera
o almacena solo para la columna mas a la izquierda en la llave del indice
(en
este caso seria [Nombre]). Como la expresion que usas en la clausula
"where"
no incluye la columna [nombre], entonces el histograma no sera usado por
el
optimizador de queries.

- Si tengo FK_Fecha , cual de las 2 FK usa ?



Si te refieres a la misma sentencia, pues ya sabes, puede que use el
indice
FK_Fecha, si es que la selectividad en esa columna para ese valor es alta.
En
otras palabras, si la cantidad de filas que machan la expresion
"Fecha='01/01/2007" son muchas, entonces sera mas caro para SQL Server
recorrer el indice nonclustered y luego ir a la tabla a buscar la
informacion
pedida y por lo tanto SQL Server puede escojer hacer un scan del indice
clustered o de la tabla (si es heap).

- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?



Definitivamente usara PK_Numero, ya que la columna [Numero] es la clave
primaria (alta selectividad) y ademas contiene el resto de la data pedida
(*).


AMB


"" wrote:

Estimados Listeros.
En un supuesto : Tengo la Tabla1

Numero varchar(10)
Nombre varchar(50)
Fecha datetime

PK_Numero campo Numero
FK_Nombre_Fecha campos nombre,fecha

Si realizo :
Select * From Tabla1
Where Fecha='01/01/2007'

Las pregunta son:
- Usa la FK_Nombre_Fecha ? si es asi porque ?
- Si tengo FK_Fecha , cual de las 2 FK usa ?
- Si realizo Select * from tabla1 Where Numero=1 and
fecha='01/01/2007' cual indice usa ?


Gracias.


Respuesta Responder a este mensaje
#5 Alejandro Mesa
18/04/2007 - 20:38 | Informe spam
jcac,

Espero estos articulos te sean de ayuda.

Estadísticas de distribución en SQL Server 2000 (I)
http://www.helpdna.net/colab02.htm

Estadísticas de Distribución en SQL Server 2000 (II)
http://www.portalsql.com/estadistic...articulo35

Ajuste y optimización del rendimiento de MS SQL Server para programadores,
primera parte: Introducción a los aspectos de rendimiento
http://www.microsoft.com/latam/tech...005/art02/

Estadísticas de índice
http://msdn2.microsoft.com/es-es/li...90397.aspx

Statistics Used by the Query Optimizer in Microsoft SQL Server 2000
http://msdn2.microsoft.com/en-us/library/aa902688(SQL.80).aspx

Statistics Used by the Query Optimizer in Microsoft SQL Server 2005
http://www.microsoft.com/technet/pr...stats.mspx

SQL Server Query Performance Tuning Distilled, Second Edition
http://www.amazon.com/Server-Perfor...F8&qid76920722&sr=1-4

Microsoft SQL Server 2000 Unleashed (2nd Edition
http://www.amazon.com/Microsoft-SQL...ks&qid76920804&sr=1-1


AMB


"jcac" wrote:

Perdón por la intromisión, pero Alejandro donde se puede obtener información
la cual indique lo que estas indicando en tu post, como por ejemplo:
" el cual se genera o almacena solo para la columna mas a la izquierda en la
llave del indice (en este caso seria [Nombre]). Como la expresion que usas
en la clausula "where" no incluye la columna [nombre], entonces el
histograma no sera usado por el optimizador de queries."

saludos


"Alejandro Mesa" escribió en el
mensaje news:
> ,
>
> La mejor manera de contestar seria probando. que es lo que te dice los
> planes de ejecucion para las diferentes sentencias que quieres usar?
>
>> Si realizo :
>> Select * From Tabla1
>> Where Fecha='01/01/2007'
>>
>> Las pregunta son:
>> - Usa la FK_Nombre_Fecha ? si es asi porque ?
>
> La palabra "Usa" tiene un significado muy amplio. Un indice puede ser
> usado
> para realizar una operacion "seek" (lo optimo) o para hacer un scan del
> mismo
> (operacion no tan optima comparada con "seek"). Para que el optimizador de
> queries pueda decidir que operacion llevar a cabo, necesita analizar las
> estadisticas de distribucion, especialmente el histograma, el cual se
> genera
> o almacena solo para la columna mas a la izquierda en la llave del indice
> (en
> este caso seria [Nombre]). Como la expresion que usas en la clausula
> "where"
> no incluye la columna [nombre], entonces el histograma no sera usado por
> el
> optimizador de queries.
>
>> - Si tengo FK_Fecha , cual de las 2 FK usa ?
>
> Si te refieres a la misma sentencia, pues ya sabes, puede que use el
> indice
> FK_Fecha, si es que la selectividad en esa columna para ese valor es alta.
> En
> otras palabras, si la cantidad de filas que machan la expresion
> "Fecha='01/01/2007" son muchas, entonces sera mas caro para SQL Server
> recorrer el indice nonclustered y luego ir a la tabla a buscar la
> informacion
> pedida y por lo tanto SQL Server puede escojer hacer un scan del indice
> clustered o de la tabla (si es heap).
>
>> - Si realizo Select * from tabla1 Where Numero=1 and
>> fecha='01/01/2007' cual indice usa ?
>
> Definitivamente usara PK_Numero, ya que la columna [Numero] es la clave
> primaria (alta selectividad) y ademas contiene el resto de la data pedida
> (*).
>
>
> AMB
>
>
> "" wrote:
>
>> Estimados Listeros.
>> En un supuesto : Tengo la Tabla1
>>
>> Numero varchar(10)
>> Nombre varchar(50)
>> Fecha datetime
>>
>> PK_Numero campo Numero
>> FK_Nombre_Fecha campos nombre,fecha
>>
>> Si realizo :
>> Select * From Tabla1
>> Where Fecha='01/01/2007'
>>
>> Las pregunta son:
>> - Usa la FK_Nombre_Fecha ? si es asi porque ?
>> - Si tengo FK_Fecha , cual de las 2 FK usa ?
>> - Si realizo Select * from tabla1 Where Numero=1 and
>> fecha='01/01/2007' cual indice usa ?
>>
>>
>> Gracias.
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida