Оптимизация производительности запросов к хранилищу данных с помощью фильтрации по битовым картам

Большая часть запросов к хранилищу данных сконструирована по схеме «звезда» и способны обрабатывать сотни миллионов строк за один запрос. По умолчанию оптимизатор запросов сравнивает запросы со схемами «звезда» и создает для них эффективные планы запроса. Одним из методов создания эффективного плана запроса является применение битовой фильтрации. Фильтр по битовым картам использует компактное представление набора значений из таблицы, находящейся в одной части дерева операторов, для фильтрации строк из другой таблицы, находящейся в другой части дерева. В сущности, фильтр выполняет сокращение полусоединением, то есть обрабатываются только те строки второй таблицы, которые удовлетворяют условию объединения с первой таблицей.

В SQL Server 2008 битовые фильтрации можно ввести в план запроса после оптимизации, как в SQL Server 2005, или динамически с помощью оптимизатора запросов во время создания плана запроса. Если фильтр создается динамически, его называют оптимизированным фильтром по битовым картам. Оптимизированная битовая фильтрация может значительно повысить производительность запросов к хранилищу данных, использующих схемы «звезда», удаляя не соответствующие условию строки на раннем этапе плана запроса. Без оптимизированной битовой фильтрации в некоторой части дерева операторов обрабатываются все строки в таблице фактов перед тем, как операция объединения с таблицей измерений удалит не соответствующие условию строки. Если применяется битовая фильтрация, не соответствующие условию строки удаляются немедленно.

Оптимизированная фильтрация по битовым картам доступна только в следующих выпусках SQL Server: Enterprise, Developer и Evaluation.

Основные сведения о битовой фильтрации

Фильтрация по битовым картам выигрывает по сравнению с индексом битовой карты. Индекс битовой карты является альтернативной формой представления списков идентификаторов строк (RID) в индексе списка значений, который использует один или несколько битовых векторов, указывающих, какая строка в таблице содержит определенное значение столбца. Оба метода могут эффективно удалять ненужные строки из обработки результатов, но между ними существует значительная разница. Во-первых, фильтры по битовым картам хранятся в памяти, устраняя тем самым затраты на обслуживание индекса, вызванные операциями языка обработки данных (DML) в базовой таблице. Кроме того, фильтры по битовым картам имеют очень маленький размер и, в отличие от существующих дисковых индексов, которые обычно зависят от размера соответствующей таблицы, могут создаваться динамически с минимальным воздействием на время обработки запроса.

Сравнение битовой фильтрации с оптимизированной битовой фильтрацией

Битовая фильтрация и оптимизированная фильтрация по битовым картам реализуются в плане запроса с помощью оператора bitmap showplan. Битовая фильтрация применяется только в планах параллельных запросов, в которых используется соединение слиянием или хэш-соединение. Оптимизированная битовая фильтрация может применяться только в планах параллельных запросов с использованием хэш-соединений. В обоих случаях простой и оптимизированный фильтр по битовым картам создаются в конструктивном входе (таблица измерений) хэш-соединения, однако фактическая фильтрация обычно выполняется в операторе Parallelism, который находится на стороне пробного входа (таблица фактов) хэш-соединения. Если соединение основано на целочисленном столбце, фильтр может применяться непосредственно к начальной таблице или операции просмотра индекса, а не к оператору Parallelism. Этот метод называется внутристроковой оптимизацией

Если битовая фильтрация вводится в план запроса после оптимизации, время компиляции запроса сокращается, но планы запросов, которые может рассматривать оптимизатор, ограничены, а кроме того, в расчет не принимается оценка количества элементов и затрат.

Оптимизированные фильтры по битовым картам имеют следующие преимущества:

  • Поддерживается фильтрация из нескольких таблиц измерений.

  • К одному оператору можно применить несколько фильтров.

  • Оптимизированные фильтры по битовым картам можно применять к большему числу типов операторов. Они включают операторы обмена, например Distribute Streams и Repartition Streams, операторы просмотра таблиц или индексов и операторы фильтров.

  • Фильтрация применяется к инструкциям SELECT и операторам только для чтения, которые используются в инструкциях INSERT, UPDATE, DELETE и MERGE.

  • Фильтрация применяется к созданию индексированных представлений в операторах, которые используются для заполнения индекса.

  • Оптимизатор использует оценку количества элементов и затрат для определения, применима ли в данном случае оптимизированная битовая фильтрация.

  • Оптимизатор может рассматривать больше планов.

Реализация оптимизированной битовой фильтрации

Фильтр по битовым картам полезен, только если он обладает селективностью. Оптимизатор запросов определяет, достаточно ли селективен оптимизированный фильтр по битовым картам, чтобы быть полезным, и в каких операторах он применим. Оптимизатор помещает оптимизированные фильтры по битовым картам во все ветви соединения «звезда» и использует правила затрат для определения, сможет ли обеспечить план минимальные предполагаемые затраты на выполнение. Если оптимизированный фильтр по битовым картам неселективный, предполагаемые затраты обычно слишком высоки, и план отбрасывается. При рассмотрении возможного размещения оптимизированных фильтров по битовым картам в плане оптимизатор ищет варианты хэш-соединений, например углубляющийся вправо стек хэш-соединений. Соединения с таблицами измерений реализуются, чтобы выполнить в первую очередь вероятно наиболее селективное соединение.

Оператор, в котором применяется оптимизированный фильтр по битовым картам, содержит предикат битовой карты в формате PROBE([Opt_Bitmap1001], {[имя_столбца]} [, 'IN ROW']). Предикат битовой карты сообщает следующие сведения.

  • Имя растрового изображения, соответствующее имени, приведенному в операторе Bitmap. Префикс «Opt_» указывает, что используется оптимизированный фильтр по битовым картам.

  • Зондируемый столбец. Из этой точки поток отфильтрованных данных проходит по дереву.

  • Использование зондом растрового изображения внутристроковой оптимизации. При использовании внутристроковой оптимизации по битовым картам зонд вызывается с параметром IN ROW. В противном случае этот параметр опускается.

Пример

В следующем примере представлен запрос в простой схеме «звезда». Две таблицы измерений, DimProduct и DimCustomer, объединяются с таблицей фактов FactInternetSales с помощью объединения «первичный ключ — внешний ключ» в одном целочисленном столбце.

USE AdventureWorksDW2008R2;
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;

На следующем рисунке показан план выполнения для этого запроса в SQL Server 2005. В точке 1A просматриваются таблицы измерений с целью получения сведений, необходимых для фильтрации не удовлетворяющих условиям строк из таблицы фактов (1B). Однако свойства оператора Table Scan показывают, что не используется предикат для ограничения строк, которые возвращаются из таблицы фактов.

План запроса SQL Server без фильтров по битовым картам.

В отличие от этого рисунка, на следующем показан план выполнения того же запроса в SQL Server 2008. Операторы оптимизированных битовых карт используются в поддеревьях обеих таблиц измерений. Свойства оператора просмотра таблиц показывают, что фильтры (зонды битовых карт) из этих поддеревьев применяются непосредственно к дереву таблицы фактов для ограничения строк, которые возвращаются из таблицы фактов до первой операции соединения.

План запроса SQL Server с фильтрами по битовым картам.

Требования к оптимизированной битовой фильтрации

К оптимизированной битовой фильтрации применяются следующие требования:

  • Предполагается, что таблицы фактов будут иметь, по крайней мере, 100 страниц. Оптимизатор рассматривает меньшие таблицы как таблицы измерений.

  • Рассматриваются только внутренние соединения между таблицей фактов и таблицей измерений.

  • Предикат соединения между таблицей фактов и таблицей измерений должен быть соединением по одному столбцу, но не обязательно должен иметь отношение «первичный ключ — внешний ключ». Предпочтительнее выполнять соединение по целочисленному столбцу.

  • Соединения с измерениями рассматривается, только если количество элементов входа измерения меньше количества элементов входа из таблицы фактов.