通过位图筛选优化数据仓库查询性能

大多数数据仓库查询都设计为遵循星型架构并且可以在单个查询中处理数亿行。默认情况下,查询优化器可根据星型架构检测查询,并且可为这些查询创建有效的查询计划。优化器可用来生成有效计划的一种方法是使用位图筛选。位图筛选器使用运算符树某部分的表中一组值的简洁表示形式来筛选位于该树另一部分的第二张表中的行。实际上,该筛选器执行半联接减法;即仅处理第二张表中符合到第一张表的联接要求的行。

在 SQL Server 2008 中,可在优化后将位图筛选引入查询计划(这与在 SQL Server 2005 中一样),或者在查询计划生成期间通过查询优化器动态引入位图筛选。当动态引入筛选器时,此筛选器即被称为“已优化的位图筛选器”。优化的位图筛选可在查询计划早期删除事实数据表中不符合要求的行,从而明显提高使用星型架构的数据仓库查询的性能。如果不使用优化的位图筛选,将先通过运算符树的某部分来处理事实数据表中的所有行,然后通过维度表的联接操作删除不符合要求的行。应用优化的位图筛选后,将立即删除事实数据表中不符合要求的行。

优化位图筛选功能仅在 SQL Server 的 Enterprise Edition、Developer Edition 和 Evaluation Edition 中提供。

了解位图筛选

与位图索引相比,位图筛选器更具优势。位图索引是表示值列表索引中的行 ID (RID) 列表的另一种形式,它使用一个或多个位矢量来指示表中的哪一行包含特定的列值。两者在从结果处理中删除不必要的行时都很有效,但是位图筛选器和位图索引之间存在一些重要的差异。首先,位图筛选器是内存中的结构,由于对基础表进行了数据操作语言 (DML) 操作,因此消除了所有的索引维护开销。此外,位图筛选器非常小,并且与现有的磁盘索引(通常取决于生成索引时所基于的表的大小)不同,可动态创建位图筛选器,而且对查询处理时间的影响可降到最低。

比较位图筛选和优化的位图筛选

通过使用 bitmap showplan 运算符可在查询计划中实现位图筛选和优化的位图筛选。位图筛选仅应用于使用哈希联接或合并联接的并行查询计划。优化的位图筛选只适用于使用哈希联接的并行查询计划。在这两种情况下,位图筛选器是在哈希联接的生成输入(维度表)侧创建的;但是,实际筛选通常是在 Parallelism 运算符内完成的,该运算符位于哈希联接的探测输入(事实数据表)侧。联接基于整数列时,筛选器可直接应用于初始表或索引扫描操作,而不是 Parallelism 运算符。这种方法称为“行内优化”。

在经过优化之后将位图筛选引入查询计划,可减少查询编译时间;但是,优化器可考虑使用的查询计划会因此受限,并且不会考虑基数估计和开销估计。

优化的位图筛选器具有以下优点:

  • 支持从多个维度表中进行筛选。

  • 可将多个筛选器应用到单个运算符。

  • 优化的位图筛选器可应用于多种运算符类型。这些运算符包括交换运算符,例如 Distribute StreamsRepartition Streams 运算符、table scan 或 index scan 运算符以及 filter 运算符。

  • 筛选适用于 SELECT 语句以及在 INSERT、UPDATE、DELETE 和 MERGE 语句中使用的只读运算符。

  • 筛选适用于在用于填充索引的运算符中创建索引视图。

  • 优化器使用基数估计和开销估计来确定优化的位图筛选是否合适。

  • 优化器可以支持多个计划。

如何实现优化的位图筛选

只有位图筛选器具有选择性时才有用。查询优化器将确定优化的位图筛选器何时具有足够的选择性以满足使用需求,以及该筛选器将应用于哪些运算符。该优化器将把优化的位图筛选器置于星型联接的所有分支上,并使用开销规则来确定此计划是否将提供最小的估计执行开销。当优化的位图筛选器不具有选择性时,开销估计值通常会很高,并且将放弃该计划。在考虑将优化的位图筛选器置于计划中的什么位置时,优化器将查找哈希联接变量,例如哈希联接的右深堆栈。实现与维度表的联接以首先执行选择性最大的联接。

应用了优化的位图筛选器的运算符包含位图谓词,其格式为 PROBE([Opt_Bitmap1001], {[column_name]} [, 'IN ROW'])。位图谓词可报告以下信息:

  • Bitmap 运算符中引入的名称对应的位图名称。前缀“Opt_”表示使用了优化的位图筛选器。

  • 探测的列。这是已筛选数据流过树时所经过的点。

  • 位图探测是否使用行内优化。如果使用行内优化,则使用 IN ROW 参数调用位图探测。否则将缺失此参数。

示例

下面的示例表示对简单星型架构的查询。以下两个维度表 DimProduct 和 DimCustomer 通过对单个整数列使用主键到外键联接从而联接到事实数据表 FactInternetSales。

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;

下图显示了此查询的执行计划,它与 SQL Server 2005 中显示的执行计划可能相同。在标记为 1A 的点上,已对维度表进行扫描,并且已知从事实数据表 (1B) 中筛选出不符合要求的行所需的信息。但是,Table Scan 运算符的属性显示没有使用任何谓词来限制从事实数据表中返回的行。

无位图筛选器的 SQL Server 查询计划

与之相反,下图显示了同一查询的执行计划,它与 SQL Server 2008 中显示的执行计划可能相同。在这两个维度表的子树中使用了 Optimized bitmap 运算符。table scan 运算符的属性显示这些子树中的筛选器(位图探测)将直接应用于事实数据表树,从而在执行第一个联接操作之前限制从事实数据表中返回的行。

带位图筛选器的 SQL Server 查询计划

优化的位图筛选的要求

优化的位图筛选具有以下要求:

  • 事实数据表应至少有 100 页。优化器将较小的表视为维度表。

  • 只考虑事实数据表和维度表之间的内部联接。

  • 事实数据表和维度表之间的联接谓词必须是单个列联接,但不要求是主键到外键的关系。优先采用基于整数的列。

  • 只有维度输入基数小于事实数据表中的输入基数时,才考虑与维度的联接。