Optimizar el rendimiento de las consultas del almacén de datos a través del filtrado de mapas de bits

La mayoría de las consultas del almacenamiento de datos están diseñadas para seguir un esquema de estrella y pueden procesar centenares de millones de filas en una única consulta. De manera predeterminada, el optimizador de consultas detecta las consultas en los esquemas de estrella y crea planes de consultas eficaces para ellos. Un método que el optimizador puede utilizar para generar un plan eficaz es el uso del filtrado de mapas de bits. Un filtro de mapas de bits utiliza una representación compacta de un conjunto de valores de una tabla en una parte del árbol de operadores para filtrar filas de una segunda tabla en otra parte del árbol. En esencia, el filtro realiza una reducción de semicombinación. Es decir, se procesan sólo las filas de la segunda tabla que puedan participar en la combinación con la primera tabla.

En SQL Server 2008, el filtrado de mapas de bits se puede insertar en el plan de consultas después de la optimización, como en SQL Server 2005. También lo puede introducir dinámicamente el optimizador de consultas durante la generación del plan de consultas. Cuando el filtro se inserta dinámicamente, se denomina filtro de mapas de bits optimizado. El filtrado de mapas de bits optimizado puede mejorar significativamente el rendimiento de las consultas del almacenamiento de datos que utilizan los esquemas de estrella, al quitar de la tabla de hechos las filas innecesarias temprano en el plan de consultas. Sin el filtrado de mapas de bits optimizado, todas las filas de la tabla de hechos se procesan por alguna parte del árbol del operador antes de que la operación de combinación con las tablas de dimensiones quite las filas no necesarias. Cuando se aplica el filtrado de mapas de bits optimizado, las filas no necesarias de la tabla de hechos se eliminan inmediatamente.

El filtrado de mapa de bits optimizado sólo está disponible en las ediciones Enterprise, Developer y Evaluation de SQL Server.

Descripción del filtrado de mapas de bits

El filtro de mapas de bits proporciona mejores resultados que el índice de mapas de bits. Un índice de mapas de bits es una manera alternativa de representar listas de Id. de filas (RID) en un índice de lista de valores utilizando uno o varios vectores de bits que indican qué fila de una tabla contiene determinado valor de columna. Los dos pueden ser muy efectivos para quitar las filas innecesarias del procesamiento del resultado. Sin embargo, hay diferencias importantes entre un filtro de mapas de bits y un índice de mapas de bits. En primer lugar, los filtros de mapas de bits son estructuras en memoria, que eliminan toda sobrecarga de mantenimiento de índices debida a operaciones del lenguaje de manipulación de datos (DML) realizadas en la tabla subyacente. Además, los filtros de mapas de bits son muy pequeños y, a diferencia de los índices en disco existentes que normalmente dependen del tamaño de la tabla en la que se generan, los filtros de mapas de bits se pueden crear dinámicamente con un efecto mínimo en el tiempo de procesamiento de la consulta.

Comparación entre el filtrado de mapas de bits y el filtrado de mapas de bits optimizado

El filtrado de mapas de bits y el filtrado de mapas de bits optimizado se implementan en el plan de consultas utilizando el operador Bitmap de Showplan. El filtrado de mapas de bits sólo se aplica en planes de consultas paralelos en los que se utilizan combinaciones hash o de mezcla. El filtrado de mapas de bits optimizado sólo se aplica a planes de consultas paralelos en los que se utilizan combinaciones hash. En los dos casos, el filtro de mapas de bits se crea en el lado de entrada de generación (la tabla de dimensiones) de una combinación hash. Sin embargo, el filtrado en sí se hace normalmente en el operador Parallelism, que está en el lado de entrada del sondeo (la tabla de hechos) de la combinación hash. Cuando la combinación se basa en una columna de enteros, se puede aplicar directamente a la tabla inicial o a la operación de recorrido de índice en lugar del operador Parallelism. Esta técnica se denomina optimización consecutiva.

Cuando el filtrado de mapas de bits se inserta en el plan de consultas después de la optimización, se reduce el tiempo de compilación de la consulta. Con todo, los planes de consultas que el optimizador puede tener en cuenta son limitados, y no se tienen en cuenta las estimaciones de costos y cardinalidad.

Los filtros de mapas de bits optimizados tienen las ventajas siguientes:

  • Permite filtrar desde varias tablas de dimensiones.

  • Se pueden aplicar varios filtros a un operador único.

  • Los filtros de mapas de bits optimizados se pueden aplicar a más tipos de operador. Entre ellos están los operadores de intercambio como Distribute Streams y Repartition Streams, operadores de recorrido de tabla o índice, y operadores de filtro.

  • El filtrado se puede aplicar a instrucciones SELECT y a los operadores de sólo lectura utilizados en las instrucciones INSERT, UPDATE, DELETE y MERGE.

  • El filtrado se puede aplicar a la creación de vistas indizadas en los operadores utilizados para rellenar el índice.

  • El optimizador utiliza estimaciones de cardinalidad y costos para determinar si el filtrado de mapas de bits optimizado es adecuado.

  • El optimizador puede tener en cuenta más planes.

Implementación del filtrado de mapas de bits optimizado

Un filtro de mapas de bits sólo resulta útil si es selectivo. El optimizador de consultas determina cuándo un filtro de mapas de bits optimizado es suficientemente selectivo para resultar útil y a qué operadores se aplica el filtro. El optimizador coloca los filtros de mapas de bits optimizados en todas las ramas de una combinación en estrella y utiliza reglas de cálculo de costos para determinar si el plan proporciona el costo de ejecución estimado más pequeño. Cuando el filtro de mapas de bits optimizado no es selectivo, la estimación del costo suele ser demasiado alta y se descarta el plan. Al tratar de determinar dónde colocar los filtros de mapas de bits optimizados en el plan, el optimizador busca variaciones de combinación hash como una pila hacia la derecha de combinaciones hash. Las combinaciones con tablas de dimensiones se implementan de forma que se ejecute primero la combinación que probablemente sea más selectiva.

El operador en que se aplica el filtro de mapas de bits optimizado contiene un predicado de mapa de bits con el formato PROBE([Opt_Bitmap1001], {[nombre_columna]} [, 'IN ROW']). El predicado de mapa de bits notifica la información siguiente:

  • El nombre del mapa de bits que corresponde al nombre escrito en el operador Bitmap. El prefijo 'Opt_' indica que se utiliza un filtro de mapas de bits optimizado.

  • La columna que se sondea. Es el punto desde el que los datos filtrados fluyen a través del árbol.

  • Si el sondeo del mapa de bits utiliza la optimización consecutiva. Cuando se utiliza la optimización consecutiva, el sondeo del mapa de bits se invoca con el parámetro IN ROW. De lo contrario, este parámetro no aparece.

Ejemplo

El ejemplo siguiente representa una consulta en un esquema de estrella simple. Los dos tablas de dimensiones DimProduct y DimCustomer se combinan con la tabla de hechos FactInternetSales utilizando una combinación de clave principal con clave externa en una única columna de enteros.

USE AdventureWorksDW;
GO
SELECT * 
FROM dbo.FactInternetSales AS F
INNER JOIN dbo.DimProduct AS D1 ON F.ProductKey = D1.ProductKey
INNER JOIN dbo.DimCustomer AS D2 ON F.CustomerKey = D2.CustomerKey
WHERE D1.StandardCost <= 30 AND D2.YearlyIncome <= 50000;

La ilustración siguiente muestra el plan de ejecución para esta consulta como podría aparecer en SQL Server 2005. En los puntos marcados 1A, se han recorrido las tablas de dimensiones y se conoce la información necesaria para filtrar y quitar las filas innecesarias de la tabla de hechos (1B). Sin embargo, las propiedades del operador Table Scan muestran que no se utiliza ningún predicado para limitar las filas devueltas de la tabla de hechos.

Plan de consulta de SQL Server sin filtros de mapas de bits.

Por otra parte, la ilustración siguiente muestra el plan de ejecución de la misma consulta como podría aparecer en SQL Server 2008. Se utilizan operadores de mapas de bits optimizados en los subárboles de ambas tablas de dimensiones. Las propiedades del operador de recorrido de tabla muestran que los filtros (sondeos de mapas de bits) de estos subárboles se aplican directamente al árbol de tabla de hechos para limitar las filas devueltas de la tabla de hechos antes de que se realice la primera operación de la combinación.

Plan de consulta de SQL Server con filtros de mapas de bits.

Requisitos del filtrado de mapas de bits optimizado

El filtrado de mapas de bits optimizado tiene los requisitos siguientes:

  • Se espera que las tablas de hechos tengan por lo menos 100 páginas. El optimizador considera que las tablas menores son tablas de dimensiones.

  • Sólo se tienen en cuenta las combinaciones internas entre una tabla de hechos y una tabla de dimensiones.

  • El predicado de combinación entre la tabla de hechos y la tabla de dimensiones debe ser una combinación de una única columna, pero no necesita ser una relación de clave principal a clave externa. Se prefiere utilizar una columna basada en enteros.

  • Las combinaciones con dimensiones sólo se consideran cuando las cardinalidades de entrada de dimensiones son menores que la cardinalidad de entrada de la tabla de hechos.