如何基于Tbl1字段查询Tbl2交易数据,保留ac_to为NA的记录且提升性能
问题1:更优的关联查询方式
你当前的查询逻辑本身和需求不匹配:核心查询主体是交易表Tbl2,要基于Tbl1映射ac_to对应的uid,正确的关联逻辑应该是以Tbl2作为主表进行关联,而非把Tbl1放在关联的左位。
如果不考虑保留NA记录的场景,你写的inner join逻辑可以调整表顺序提升可读性:
select t2.ac_from_ui, t1.ui as ac_to_uid, t2.amt from tbl2 t2 inner join tbl1 t1 on t2.ac_to = t1.ac_ref
没有比等值join效率更高的两表字段映射方案,所有性能优化都是基于join逻辑的配套优化,不存在查询语法层面的更优替代方案。
问题2:保留NA记录+解决left join大数据量性能问题
要保留ac_to为NA的Tbl2记录,逻辑上必须用left join,你遇到的性能问题不是left join本身导致的,可按以下优先级做配套优化:
- 索引/分桶优化:给Tbl1的关联字段
ac_ref加索引,如果是分布式数仓则把ac_ref设为Tbl1的分桶键,Tbl2也用ac_to作为同规则分桶键,关联时可避免全表扫描和无效数据shuffle。 - 过滤下推:如果查询带有Tbl2的过滤条件(比如交易时间范围),先把过滤条件写在子查询里缩小Tbl2的数据集,再和Tbl1做关联,大幅减少join时的计算量。
- 拆分查询合并结果:如果NA记录占比很高,可以把查询拆成两部分再合并,避免无效关联计算:
-- 非NA记录走关联 select t2.ac_from_ui, t1.ui as ac_to_uid, t2.amt from (select * from tbl2 where ac_to != 'NA') t2 join tbl1 t1 on t2.ac_to = t1.ac_ref union all -- NA记录直接取数不需要关联 select ac_from_ui, null as ac_to_uid, amt from tbl2 where ac_to = 'NA' - 预计算处理:如果这个查询是高频使用的,可以做ETL预处理,直接把ac_to对应的uid预写到Tbl2的专属字段里,查询时直接读取不需要实时关联,性能最优。
内容的提问来源于stack exchange,提问作者curious_nustian
相关产品推荐
相关产品推荐

