Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
img
img

 

 

SQL Server
Blog. (Apuntes y Recopilaciones) por Norman M. Pardell

img
img
24 de Abril, 2011 · Estimación-Cardinalidad

Query Optimizer. Cardinality Estimation Error. SQL Server. Tema: II

 Utilizar las estadísticas es algo muy importante para el Optimizador de Consultas, por que este toma la mayoría de las decisiones basándose en las estadísticas.  Uno de los mayores problemas cuando optimizamos consultas, es por que no tenemos estadísticas o no se encuentran actualizadas. Voy a comentar, de una forma sencilla, como detectar problemas de estadísticas, que es lo que denominamos “Mala Estimación de la Cardinalidad”.

 

 Es aconsejable para el buen entendimiento de este “Tema:II” sobre la Estimación de la Cardinalidad, que se lea o repase el enlace: Query Optimizer. Parameter Sniffing. SQL Server. Tema: I

 

 

 Es fácil detectar problemas en la Estimación de la Cardinalidad, básicamente es suficiente con comparar el valor actual de registros con el valor estimado de registros en los planes de ejecución. La mejor forma de hacerlo es utilizando el comando:

 

SET STATISTICS PROFILE ON/OFF

 

 Una vez detectado este problema, para solucionarlo, uno de los primeros pasos que podemos hacer es actualizar todas las estadísticas de la tabla que estamos consultando, por ejemplo de la forma:

 

UPDATE STATISTICS TABLA WITH FULLSCAN

 

 Podemos encontrarnos, ante casos, en los cuales SQL Server no nos da soporte de (o no genera) estadísticas, como por ejemplo; cuando trabajamos con table variables, en este caso, si la consulta que utilizamos usa muchos registros, no es buena opción trabajar con table variables, sería recomendable para ese caso utilizar tablas temporales o incluso tablas normales ya que ambas tienen soporte de estadísticas.

 

 En un plan de ejecución, lo que tenemos que mirar, para verificar que se esta haciendo un correcto uso de estadísticas, es el Numero Actual de Registros y el Numero Estimado de Registros:


 En el caso, de la anterior imagen, el Optimizador no esta tomando una buena decisión, ya que estima que va a devolver 36395.1 registros cuando en realidad lo que devolverá son solo 5 registros, para lo cual, lo mas seguro es que realice un Table Scan para devolver solo 5 registros.

 

 Para ver esto de una forma más fácil, como hemos comentado, antes y después de la consulta ejecutamos:

 

SET STATISTICS PROFILE ON

GO

<Nuestra consulta>

GO

SET STATISTICS PROFILE OFF

GO

 

 De esta forma podremos comparar el numero real frente al estimado de registros, y encontrar cual es el operador en el plan que nos esta dando esa mala estimación, viendo el campo StmtText. Muestro un ejemplo de cómo se vería:

 

 

Para la anterior imagen, la tabla tiene 121317 registros, y vemos como estima que va a devolver 36395.1 registros, que sería el 30% de los registros totales, cuando en realidad va a devolver 5 registros. Esta mala estimación hace que el Optimizador de consultas genere un mal plan de ejecución para resolver la consulta.

 

 Se aconseja leer: Actualización de estadísticas síncronas o asíncronas mejoran la respuesta del optimizador de consultas. SQL Server 

 

Os dejo el enlace, para aquellos a quienes les interese es tema, donde se habla de: 

Query Optimizer. Computed Columns. Columnas Calculadas. SQL Server. Tema: III

 

 

Fuentes:

Microsoft, MSDN, Benjamin Nevares

Apunte y recopilación por Norman M. Pardell

Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.

 

 

publicado por normanmpardell a las 20:08 · Sin comentarios  ·  Recomendar
Comentarios (0) ·  Enviar comentario
Esta entrada no admite comentarios.
img
.Sobre mí
FOTO

Norman M. Pardell

MCITP: Database Administrator & Database Developer, SQL Server 2008. MCC Award Certificate. Consultor Senior de bases de datos en Capgemini España, S.L. Asesoramiento en implementación, desarrollo y gestión de bases de datos en grandes compañías. Actualmente, asignado a proyecto en compañía líder en el sector energético global. Más de 10 años trabajando con SQL Server (y otros gestores de BBDD)

» Ver perfil

img
.Secciones
» Inicio
img
.Enlaces
» Microsoft MSDN Foros
» Windows Server 2012
img
.Más leídos
» Asignar la cantidad correcta de Memoria para SQL Server
» Base de Datos Sospechosa (Suspect)
» Como modificar la Intercalación (Collation) en SQL Server
» Detectar bloqueos. SQL Server V.2005 y superiores
» Funciones SQL Server. Funciones escalares y funciones con valores de tabla.
» Integridad y corrupción en las bases de datos: DBCC CHECKDB
» Log de transacciones ( .ldf ). SQL Server.
» Migrando SQL Server 2005, 2008, 2008 R2 a SQL Server 2012
» Tomo I. Memoria RAM. Optimización de sistemas de 32 y 64 bits. SQL Server 2008.
» Transacciones activas. SQL server 2008
img
.Nube de tags [?]
                                                           
img img
FULLServices Network | Crear blog | Privacidad