Обработка планов выполнения, содержащих фильтры по битовым картам
Параллельные планы выполнения запросов, использующие битовую фильтрацию, имеют оператор Bitmap в одном или нескольких поддеревьях операторов. Фильтр по битовым картам использует компактное представление набора значений из таблицы, находящейся в одной части дерева операторов, для фильтрации строк из другой таблицы, находящейся в другой части дерева. Если сразу удалять ненужные строки в запросе, последующие операторы работают с меньшим количеством строк, тем самым повышая общую производительность.
В SQL Server 2008 битовую фильтрацию можно ввести в параллельный план запроса после оптимизации, как в SQL Server 2005, или ввести динамически с помощью оптимизатора запросов во время создания плана запроса. Если фильтр создается динамически, его называют оптимизированным фильтром по битовым картам. План запроса может содержать как простые, так и оптимизированные фильтры по битовым картам. Оптимизатор запросов определяет, достаточно ли избирателен простой или оптимизированный фильтр по битовым картам, чтобы быть полезным, и в каких операторах он применим. Дополнительные сведения см. в разделе Оптимизация производительности запросов к хранилищу данных с помощью фильтрации по битовым картам.
При анализе плана выполнения, содержащего битовую фильтрацию, важно понимать принцип потока данных через план и то, где применяется фильтр. Простой и оптимизированный фильтры по битовым картам создаются в конструктивном входе (таблица измерения) хэш-соединения, однако фактическая фильтрация обычно выполняется в операторе Parallelism, который находится на стороне пробного входа (таблица фактов) хэш-соединения. Тем не менее, если фильтр по битовым картам основан на целочисленном столбце, он может применяться непосредственно к начальной таблице или операции просмотра индекса, а не к оператору Parallelism. Этот метод называется внутристрочной оптимизацией.
Просмотр фильтров по битовым картам в Showplans
Чтобы просмотреть фильтры по битовым картам в плане запроса, используются параметры SHOWPLAN_ALL, SHOWPLAN_TEXT или SHOWPLAN_XML инструкции SET. В среде Среда SQL Server Management Studio можно также установить флажок Включить действительный план выполнения.
Если выводится XML Showplan, физические и логические операторы битовых карт перечисляются следующим образом.
<RelOp NodeId="2" PhysicalOp="Bitmap" LogicalOp="Bitmap Create" EstimateRows="88" EstimateIO="0" EstimateCPU="0.0718125" AvgRowSize="6893" EstimatedTotalSubtreeCost="0.229385" Parallel="1" EstimateRebinds="0" EstimateRewinds="0">
Оператор, в котором применяется фильтр по битовым картам, содержит имя битовой карты в свойстве Столбец зонда.
Оператор, в котором применяется оптимизированный фильтр по битовым картам, содержит предикат битовой карты в форме PROBE([Opt_Bitmap1001], {[имя_столбца]} [, 'IN ROW']). Предикат битовой карты сообщает следующие сведения.
Имя битовой карты, соответствующее имени, указанному в операторе Bitmap Create. Префикс «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;
На следующем рисунке показано создание оптимизированного фильтра по битовым картам в поддереве операторов обеих таблиц измерений после того, как была просмотрена таблица измерений и получены нужные сведения для исключения соответствующих строк из таблицы фактов. После этого к таблице фактов применяется фильтр в наиболее раннем положении, в операторе Table Scan. Применение фильтра показано в разделе «Предикат» свойств оператора Table Scan. Сведения, приведенные в разделе «Предикат», указывают, что для ограничения возвращаемых в таблицу фактов строк используются оба оптимизированных фильтра по битовым картам, Opt_Bitmap1008 и Opt_Bitmap1009. В таблице фактов прозондированы столбцы [F].[CustomerKey] и [F].[ProductKey]. Показан параметр IN ROW, указывающий, что используется внутристрочная оптимизация. Если внутристрочная оптимизация невозможна, битовая фильтрация применяется к оператору Parallelism.
На основе рисунка можно сделать следующие выводы.
Оптимизированные фильтры по битовым картам создаются в двух поддеревьях.
Оба фильтра динамически применяются к одному оператору (Table Scan).
Вначале применяется оптимизированный фильтр по битовым картам, оцененный как наиболее эффективный.
Столбцы, на основе которых таблицы измерений соединяются в таблицу фактов, допускают внутристрочную оптимизацию, то есть объединение основано на одном целочисленном столбце.
Фильтр применяется в наиболее ранней возможной точке запроса, что приводит к уменьшению числа строк, переданных из операции Table Scan в другие операторы дерева.