Columnas incluidas (include) en índices no agrupados de SQL Server

SQLServerLogo

Introducción

El uso de índices de cobertura es una técnica simple y poderosa para la optimización de consultas, que nos brinda los mejores tiempos de ejecución disminuyendo además el acceso a disco. Un índice de cobertura es aquel que contiene la totalidad de los campos que una consulta referencia, por lo que el motor puede resolver esta consulta solo accediendo al índice. Además en estos casos es fundamental que los campos que aparezcan en la cláusula WHERE de la consulta sean los primeros campos del índice, en orden de mayor a menor selectividad. De esta forma el índice será efectivo y el optimizador lo elegirá en forma apropiada.

Pero como contrapartida de esto tenemos que los índices de cobertura en muchos casos son voluminosos, sobre todo si se definen sobre tablas con gran cantidad de registros. Si buscamos una alternativa para seguir utilizando este tipo de índices y no pagar el costo extra del uso de espacio, tenemos a disposición, desde SQL Server 2008, la funcionalidad de columnas incluidas en los índices (include columns).

Las columnas incluidas son aquellas que forman parte del índice pero solo se almacenan sus valores en las hojas del mismo (recordar que los índices se implementan como estructuras de árbol B+) De esta manera, las columnas que aparecen como incluidas se pueden utilizar en la cláusula SELECT sin problemas o incluso en el WHERE, pero su evaluación será siempre al final de la resolución de la consulta. Además de las columnas incluidas, el índice posee las columnas tradicionales, por las que se podrán filtrar y ordenar los datos de la manera habitual.

Ejemplo práctico

Les presento a continuación un ejemplo práctico simple, para observar las ventajas de los índices con columnas incluidas y la forma de implementar estos índices.

Vemos la ejecución de una consulta sobre la tabla Sales.SalesOrderDetail, definiendo un índice sobre el campo SpecialOfferID:

IX_Include

Ver el artículo completo

Limitar los recursos asignados a la ejecución de una consulta en SQL Server

Siempre aparecen en nuestras bases de datos y sistemas consultas que por su naturaleza consumen una gran cantidad de recursos durante su ejecución. Muchas veces se trata de consultas o procesos que generan reportes o que realizan importaciones o exportaciones masivas de datos. Cuando estas consultas se ejecutan, el rendimiento general del sistema se ve afectado por la caída en los recursos disponibles, lo que redunda en mayores tiempos de ejecución para los demás procesos y en mayores probabilidades de que se produzcan bloqueos.

Para mejorar esta situación tenemos varias alternativas. La primera que menciono es realizar una optimización detallada y profunda de estas consultas y procesos, a fin de mejorar sus métodos de acceso y minimizar la cantidad de lecturas y accesos a disco que requieran. Pero a veces, esto no es posible o ya fue realizado sin mejoras apreciables.

Una opción distinta es en estos casos restringir los recursos que la consulta puede utilizar. De esta forma, aunque su ejecución tomará más tiempo, la misma no interferirá de forma tan notable en el funcionamiento del servidor. Para ello aplicaremos una opción presente en la instrucción SELECT, que es la denominada MAXDOP.

Leer el artículo completo

Uso de la utilidad DTEXECUI para programar y ejecutar paquetes de Microsoft SQL Server Integration Services

La ejecución de paquetes de Microsoft SQL Server Integration Services (MSSIS) es posible a través de diversos mecanismos. Uno de ellos es a través de una utilidad de línea de comando denominada DTEXEC, que puede incorporarse dentro de una tarea programada de Windows o en el SQL Server Agent como un paso de un job. El problema con esta utilidad es que su sintaxis es complicada y muchas veces una ejecución simple requiere de extensos parámetros indicados en la misma instrucción.

Afortunadamente para evitarnos problemas y errores en este tipo de ejecuciones  es que se presenta la utilidad, ahora gráfica, DTEXECUI. Con esta herramienta podremos en forma simple y guiada indicar todos los parámetros necesarios para la ejecución de nuestro paquete MSSIS y finalmente ejecutarlo o si lo preferimos generar una línea de ejecución que luego podremos anexar a un llamado de la utilidad DTEXEC.

Les dejo a continuación un ejemplo de uso:

DTEXECUI_1

Leer el artículo completo

Uso del ForEach ADO Enumerator para iterar sobre los registros de una consulta en Integration Services de SQL Server

En este post les presentaré una guía paso a paso para la implementación de un contenedor del tipo ForEach loop dentro de Integration Services de SQL Server. Este tipo tipo de container nos permite recorrer una colección de objetos y repetir las tareas dentro del container por cada elemento de la colección. En nuestro ejemplo, la colección será el resultado de una consulta SQL ejecutada al comienzo del paquete de Integration Service. El caso de uso que estamos representando corresponde a un proceso de backup de todas las bases de datos del usuario para un determinado servidor SQL Server. Fácilmente podrán adaptar este caso a sus necesidades y extender lo aquí presentado.

Paso 1- Definición de una variable de tipo object

Debemos definir en nuestro paquete una variable del tipo object, que será la que almacene el resultado de la consulta ejecutado en la tarea de Execute SQL, como se ve en el siguiente gráfico:

ForEachADOEnum_P1

Ver el artículo completo

Indices filtrados en SQL Server

Si estamos en proceso de optimizar una consulta o procedimiento en SQL Server, una de las herramientas que siempre debemos considerar es el uso de índices. Un índice bien implementado puede mejorar el tiempo de ejecución de una consulta de horas a segundos. También ayuda a minimizar el uso de recursos durante la ejecución y a evitar la aparición de bloqueos. Lamentablemente el uso de índices no es recomendable para todos los casos posibles y debemos analizar cuidadosamente los datos de las tablas antes de determinar si es viable indexarlas de la manera requerida.

Afortunadamente con SQL Server tenemos una nueva característica que nos permite el uso de índices eficientes y de un tamaño muy reducido. Se trata de los índices filtrados (filtered indexes).

Leer el artículo completo

Configuración de un esquema de auditoría en SQL Server 2012

Una de las tareas que normalmente debemos realizar para asegurar y proteger nuestros servidores y bases de datos en SQL Server 2012 es configurar un esquema de auditoría. En esta nota les presento un tutorial paso a paso de como establecer un esquema de auditoría completo.

La auditoría puede ser implementada a traves de un wizard que nos guiará en los pasos necesarios para configurar el esquema requerido. El asistente se lanza desde la carpeta de Security/Audit

Leer el artículo completo

Backup del esquema de bases de datos en SQL Server

En una nota previa mencionaba las ventajas de contar con un backup de toda la estructura y los objetos de nuestras bases de datos (esquema o metadatos) y que no incluya los datos almacenados en las tablas.

Estas ventajas se hacen más claras en un entorno de desarrollo, donde es mucho más importante contar con un resguardo para los últimos procedimientos almacenados, funciones, triggers o nuevas tablas creadas que proteger los datos de este entorno, que son generalmente de prueba y no revisten importancia alguna.

En esa misma nota les presentaba una solución para realizar este tipo de backup en un servidor SQL Server 2000 mediante VBScript. En esta nueva nota les presentaré una solución que permite realizar el backup completo del esquema de múltiples bases de datos, para las versiones de SQL Server de 2005 en adelante (2005/2008/2008R2 y 2012).

Leer el artículo completo

Normalización de datos usando lógica difusa en SQL Server

Una problemática que aparece al momento de definir el modelo de datos para el diseño de un datawarehouse es la existencia de datos desnormalizados. Ejemplo de esto puede ser la localidad en el domicilio de una tabla de personas, donde la misma localidad puede aparecer escrita de varias formas distintas. Pero para representar la información de manera consistente, todas las variantes de una localidad deben estar agrupadas en un solo miembro.

Para resolver este problema, propongo utilizar las herramientas de lógica difusa existentes en SQL Server y particularmente en Integration Services. Mediante la transformación de Fuzzy Lookup (correspondencia difusa) podremos obtener por cada valor de una localidad su correspondiente valor normalizado desde una tabla maestra, pero aquí la gran ventaja es que esta correspondencia no será por igualdad, sino por semejanza. A continuación muestro un ejemplo de aplicación de esta técnica para que puedan adaptarlo a cada requerimiento.

Ver el artículo completo

Error connecting to VMware vCenter Update Manager

Nuestro buen amigo MVP Alberto Morrillo nos comparte su artículo:

Error connecting to VMware vCenter Update Manager

 

Problem Description.

We rebooted the server where VMware vCenter is installed as application and when we tried to open the vSphere Client we received the following error message:
vSphere Client
There was an error connecting to VMware vCenter Update Manager –
[computername:443].
Database temporarily unavailable or has network problems.

clip_image001

This error led us to think there was an issue with the database instance where the VMware vSphere database was installed. However, there was nothing wrong with the SQL Server instance.

Ver más aquí.
Gracias.

Taller – Administración de Microsoft SQL Server (Primera sesión)

Nuestro buen amigo MVP Alberto Morillo nos comparte su evidencia de su pasada actividad:

 

Taller – Administración de Microsoft SQL Server (Primera sesión)

  • Universidad Adventista Dominicana, Campus Santo Domingo
  • Santo Domingo, República Dominicana
  • 27 de septiembre del 2012
  • Taller – Administración de Microsoft SQL Server , (Primera sesión)

 

clip_image001

clip_image002

Ver más aquí.
Gracias.