Análisis plan de Ejecución de query en Sql Server II


En esta entrada se detallan técnicas avanzadas y consejos que pueden mejorar el rendimiento de los planes de ejecución.

Crear un Indice con la clausula INCLUDE (Covering Index)

Al crear un indice noclustered podemos añadir columnas con la clausula INCLUDE. De esta manera al realizar al buscar información de la tabla ya tenemos toda la información al realizar el Seek, sin necesidad de realizar un Lookup.
También a tener en cuenta:

  • Overhead al modificar la tabla; ya que debe también modificar el indice
  • El coste de espacio extra que supone el almacenar esta información en el indice.

Vistas Indizadas (Indexed Views)

Una vista indizada es una vista con un indice clustered que además contiene los datos de las columnas; en realidad es una nueva tabla en la base de datos.

Mejora el rendimiento en las consultas ya que evita el acceder a múltiples tablas base; sin embargo al modificar las tablas base hay un overhead considerable ya que deben también reflejarse en la vista.

También a tener en cuenta:

  • La creación de la vista indizada es un proceso es un proceso costoso (aunque solo se ha de realizar una vez ;-)).
  • El coste de espacio extra que supone el almacenar la nueva tabla.

Las consultas de agregados son buenas candidatas.

No crear indices en Columnas con pocos valores únicos

El optimizador no usará el indice, ya que tardará menos en leer toda la tabla. Estamos malgastando espacio ;-). La siguiente consulta nos muestra las estadísticas del indice donde la densidad nos muestra el porcentaje de valores únicos.

DBCC SHOW_STATISTICS([NombreDeTabla], [NombreDeIndice]);

Quizás en función de la casuistica, se podría crear un indice filtrado (filter index), que sólo aplica a determinados valores.

La clave del indice en lo posible es preferible un tipo simple y con menos columnas

Reduce el tamaño del indice y mejora su rendimiento. Por ejemplo un entero es preferible a un NVARCHAR.

Valorar la compresión de indices/tablas (Index Compression)

Permite reducir el tamaño del indice (acceso a disco y cache en memoria) pero a costa de overhead en CPU. Con la siguiente consulta podríamos ver el número de paginas que ocupa el indice.

SELECT i.Name,
i.type_desc,
s.page_count,
s.record_count,
s.index_level,
compressed_page_count
FROM sys.indexes i
JOIN sys.dm_db_index_physical_stats(DB_ID(N'[NombreBaseDatos]'),
OBJECT_ID(N'[NombreDeTabla]'),NULL,
NULL,'DETAILED') AS s
ON i.index_id = s.index_id
WHERE i.OBJECT_ID = OBJECT_ID(N'[NombreDeTabla]');

Hints

De manera excepcional se puede forzar determinados tipos de operación plan de ejecución con clausulas SELECT .. FROM TABLE WITH (hint, hint…) LEFT (hint) JOIN TABLE… OPTION (hint,hint,…) en la búsqueda de rendimiento.
No es muy recomendable, ya que el optimizador se adapta a los cambios en los datos ;-).

En lo posible evitar cursores

Es preferible usar sentencias de SQL.

Usar sp_executesql frente a EXECUTE para consultas dinámicas

Debido que permite el uso de consultas parametrizas y por lo tanto el plan de ejecución puede ser cacheado.

Consejos para Consultas

Se adjuntan varios consejos para realizar consultas que requieren menos recursos:

  • Usar EXIST frente COUNT(*) para verificar la existencia de registros.
  • Usar UNION ALL frente UNION si los datasets no tienen duplicados o estos no son relevantes.
  • Los stores procedures no debe comenzar por el prefijo sp_.
  • Los stores procedures permiten ejecutar múltiples consultas (lo cual evita tráfico de red).
  • Usar SET NOCOUNT si no es necesario.
Anuncios
Esta entrada fue publicada en Sql Azure, Sql Server. Guarda el enlace permanente.

Una respuesta a Análisis plan de Ejecución de query en Sql Server II

  1. Pingback: Análisis plan de Ejecución de query en Sql Server | Pensando bajo la lluvia

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s