数据源的关联过滤有两种方式,一种是先关联再过滤,第二种是先过滤再关联,那么在什么场景下可以使用这两种方案呢,我们用几个简单的例子来看一下
1.过滤逻辑详解
- 先关联再过滤把两个数据源的全部数据先拼成一个大集合,然后在这个大集合里筛选需要的内容。
- 先过滤再关联先从一个或两个数据源中挑出符合条件的小部分数据,再用这些小数据去做关联。
通常,先过滤再关联参与匹配的数据量更小,速度明显更快。但能不能用,取决于业务规则,因为两种写法算出来的结果可能相同,也可能完全不同。下面分别举例。
例子 1:只能用“先过滤再关联”
场景:超市想分析顾客的购买习惯,需求是——找出所有买过“牛奶”的顾客,查看他们的全部购物订单(包括没买牛奶的订单)。数据源:
- 订单表(订单编号、顾客编号、下单时间)
- 订单明细表(订单编号、商品名称、数量)
❌ 如果用“先关联再过滤”先把所有订单和所有明细关联,得到每一行“订单+商品”的记录,再过滤出“商品=牛奶”的行。这样只会看到包含牛奶的那些订单,顾客买的其它商品完全丢失,违背了“这些顾客的全部订单”的业务要求。✅ 只能用“先过滤再关联”先在订单明细表里过滤出“商品=牛奶”的记录,得到买过牛奶的顾客ID列表;再用这个很小的顾客ID列表,去订单表里捞出这些顾客的所有订单。结果正好满足需求。结论:当过滤条件只是用来找人/找范围,而不是筛选最终展示的数据时,必须先过滤再关联,否则会丢掉不该丢的数据。
例子 2:只能用“先关联再过滤”
场景:教务处要评选“学习积极分子”,条件是——找出选修了 3 门及以上课程的学生。数据源:
- 学生表(学号、姓名)
- 选课表(学号、课程名称)
❌ 如果用“先过滤再关联”在关联之前,选课表里只有一行一行的选课记录,谁也不知道每个学生选了几门课。想过滤“选了3门以上”,根本无从下手,因为这个条件只有在关联并分组统计之后才会出现。✅ 只能用“先关联再过滤”先把学生表和选课表关联,得到每个学生每一门课的记录;再按学生分组,数出每个学生的选课数量;最后过滤出数量 ≥ 3 的学生。只有这样,才能得到需要的结果。结论:当过滤条件必须通过关联后的汇总、计算才能得出时,只能先关联再过滤。
例子 3:两种方法都可以用(推荐先过滤再关联)
场景:图书馆想推送活动通知,需求是——查询所有年龄大于 20 岁的读者的借阅记录。数据源:
- 读者表(读者编号、姓名、年龄)
- 借阅记录表(读者编号、书名、借阅日期)
方法 A —— 先关联再过滤把读者表和借阅记录表全部关联,得到所有借阅记录及其对应读者的年龄,再过滤出年龄 > 20 的记录。方法 B —— 先过滤再关联先从读者表中过滤出年龄 > 20 的读者编号,再用这一小部分读者编号去关联借阅记录表,直接得到他们的借阅记录。两种方法得出的结果完全一致。但方法 B 在关联时只用了一小部分读者,数据量小,运行速度更快,这正是我们要做的优化。结论:当过滤条件作用在关联前就能明确筛选的某一个数据源上,且不会改变最终结果的含义时,两种方法都可行,应优先使用“先过滤再关联”来提速。
整体小结
- 结果可能不同:要先判断业务逻辑,不能为了快而改错结果。
- 只能先过滤再关联:条件是用来圈定范围(例如找到某类顾客),最终要的是这个范围内的全量数据。
- 只能先关联再过滤:条件要等数据合并、计算后才能产生(例如按统计数量筛选)。
- 两种都可以:条件可以在关联前明确筛选,并且不影响最终结果。此时选择先过滤再关联,能明显加快接口响应。
