数据库的查询执行计划中的位图过滤优化技术(Bitmap Filtering)
描述:位图过滤(Bitmap Filtering)是一种用于优化多表连接查询的重要技术,尤其在星型/雪花型数据仓库查询中效果显著。它通过提前在连接的一端(通常是维度表)构建一个简洁的位图(Bitmap),来过滤另一端(事实表)中不满足连接条件的记录,从而大幅减少连接操作需要处理的数据量。其核心思想是将“连接时的过滤”提前到“数据扫描时”进行。这项技术也称为“布隆过滤器”的一种优化应用,但这里我们聚焦于基于精确值构建的位图实现。
解题过程/原理讲解:
这个过程可以循序渐进地理解为“提前准备一个通行证名单,在安检时就快速放行或拦截”。
第一步:识别适用场景
此技术通常适用于以下场景:
- 星型/雪花型连接:一个大的事实表(Fact Table)与多个较小的维度表(Dimension Table)进行连接。
- 选择性过滤:维度表上的过滤条件(WHERE子句)具有较高的选择性,即能从维度表中筛选出一小部分记录。
- 连接键基数高:事实表与维度表之间的连接键(通常是外键)的基数(不同值的数量)很高,使得传统的哈希连接或嵌套循环连接开销较大。
例如:查询“2023年来自‘华东’地区的‘电子产品’的销售金额”。事实表是sales(上亿行),维度表是time、region、product。连接前,会在time、region、product表上应用过滤条件(年份=2023,地区=‘华东’,类别=‘电子产品’),筛选出小部分维度记录。
第二步:构建过滤位图
这是核心的“准备工作”。
- 步骤1:查询优化器首先对小的维度表执行查询,应用其上的所有过滤条件,得到满足条件的维度记录集。这个集合通常较小。
- 步骤2:数据库系统为这个满足条件的维度记录集,基于连接键的值,创建一个位图。这个位图是一个紧凑的0/1数组。
- 位图的长度:通常等于事实表连接键列的所有可能的不同值数量(或其哈希值空间)。在实现中,更常见的是基于一个哈希函数,将连接键值映射到位图的一个特定位置(位)。
- 位的值:
- 如果某个连接键值存在于上一步得到的维度记录集中,则其对应的位设置为 1。
- 否则,设置为 0。
接上例:优化器从time, region, product表过滤后,得到一组特定的time_id, region_id, product_id。然后,它会为sales表中的time_id列创建一个位图,其中所有在过滤后time表中出现的time_id对应的位设为1,其余为0。同理,为region_id和product_id也创建各自的位图。
第三步:应用位图进行过滤(事实表扫描)
这是“快速安检”环节,发生在读取事实表数据时。
- 步骤1:在扫描事实表(
sales)的每一行时,数据库系统会提取该行的连接键值(time_id,region_id,product_id)。 - 步骤2:系统用这些连接键值去查询对应的位图。
- 对于
sales表中的一行,它的time_id值去查询time_id位图,region_id去查询region_id位图,product_id去查询product_id位图。
- 对于
- 步骤3:应用过滤逻辑。
- 通常使用位“与” 操作:只有当该行数据的所有相关连接键值在其对应的位图中都为1时(即
time_id位图 ANDregion_id位图 ANDproduct_id位图的结果为真),才认为该行可能与所有维度表匹配,允许其进入后续连接阶段。 - 注意:这里说“可能”,是因为哈希冲突可能导致误判(一个不匹配的键被映射到已设为1的位置)。但在精确值位图中,如果设计得当(如使用完美哈希),可以做到零误判。这与概率性的布隆过滤器有所不同。
- 通常使用位“与” 操作:只有当该行数据的所有相关连接键值在其对应的位图中都为1时(即
- 步骤4:如果位图检查通过,该行事实记录被保留并传递给连接操作符;如果未通过(任何一位为0),则该行在数据读取的早期就被丢弃,不会参与后续的任何计算、连接,节约了大量CPU和I/O资源。
第四步:执行最终的连接操作
经过位图过滤后,事实表的中间结果集已经大大缩小。此时,数据库再使用常规的连接算法(如哈希连接)将过滤后的事实表与维度表进行最终的连接。由于输入数据量锐减,连接操作的效率得到极大提升。
总结与优势:
- I/O优化:早期过滤掉大量不相关的事实表记录,减少了后续操作需要读取和传输的数据量。
- CPU优化:避免了为最终不匹配的记录计算哈希、进行连接比较的开销。
- 内存优化:位图本身非常紧凑,占用内存小,而过滤后的事实表中间结果也更小,降低了哈希连接等操作的内存压力。
- 流水线优化:位图过滤可以无缝集成到扫描操作中,实现高效的流水线处理。
这项技术是现代MPP(大规模并行处理)数据仓库和分析型数据库中加速复杂连接查询的关键手段之一。它巧妙地将基于集合的过滤思想,通过位图这个高效的数据结构,提前应用到数据流水线的最前端,从而达到“先过滤,后连接”的最佳优化效果。