优化位图过滤是如何实现的?
位图过滤只有在具有选择性的情况下才有用。查询优化器会决定优化位图过滤何时具有足够的选择性,以及该过滤适用于哪些操作符。优化器会将优化位图过滤应用于星型连接的所有部门,并使用成本计算规则来确定计划是否支持最小的预估实施成本。
当优化位图过滤不具有选择性时,成本估算通常会过高,从而导致计划被拒绝。在考虑将优化位图过滤放置在计划中的位置时,哈希连接变体的优化器视图会包含一个右侧深度的哈希连接堆栈。与维度表的连接会被实现为首先执行可能最具选择性的连接。
在 PROBE ([Opt_Bitmap1001], {[column_name]} [, ‘IN ROW’]) 的设计中,使用优化位图过滤的操作符包含一个位图谓词。位图谓词报告以下数据:
位图名称与位图运算符中引入的名称相对应。前缀"Opt_"表示使用了优化的位图过滤器。
探测的对应列。这是过滤后的数据流经树的术语。
位图探测是否需要行内优化。如果需要,则使用 IN ROW 参数调用位图探测。否则,无需此参数。
优化的位图过滤要求
优化的位图过滤具有以下要求 −
事实表预计至少有 100 页。优化器将较小的表视为维度表。
事实表和维度表之间仅考虑内连接。
事实表和维度表之间的连接谓词应该是单列连接,但不需要是主键-外键关系。选择基于整数的列。
仅当维度输入基数小于事实表的输入基数时,才会处理带有维度的连接。
位图过滤和优化位图过滤在查询计划中使用位图显示计划运算符执行。位图过滤仅用于使用哈希连接或合并连接的并行查询计划。优化位图过滤仅与使用哈希连接的并行查询计划相关。
在这两种情况下,位图过滤器都是在哈希连接的构建输入(维度表)端生成的;但是,实际的过滤通常在并行运算符中完成,该运算符位于哈希连接的探测输入(事实表)端。当连接基于整数列时,过滤器可以直接用于原始表或索引扫描操作,而无需使用并行运算符。这种技术称为行内优化。

