【问题详细描述】
有以下 sql 语句。SQL1 耗时约 4s,SQL2、SQL3 耗时约 1 个小时。有办法通过优化 SQL2 做到做完子查询再把所有条件一起下压到 SequoiaDB 吗?

表:ibs.pb_log, 数据量:600亿 ,索引:log_cstno + log_datetime
表:ibs.pb_cstinf_pro,数据量:4千万, 索引:cip_ctfno

SQL1:
SELECT * FROM ibs.pb_log WHERE log_cstno IN
('2339139')
AND log_datetime BETWEEN CONCAT('20190101', '000000') AND CONCAT('20190429', '000000')
SQL2:
SELECT * FROM ibs.pb_log WHERE log_cstno IN
(SELECT cip_cstno FROM ibs.pb_cstinf_pro WHERE cip_ctfno IN ('360426198807174073'))
AND log_datetime BETWEEN CONCAT('20190101', '000000') AND CONCAT('20190429', '000000')

SQL3:
SELECT * FROM ibs.pb_log LEFT JOIN ibs.pb_cstinf_pro ON
log_cstno=cip_cstno WHERE
log_datetime BETWEEN CONCAT('20190101', '000000') AND CONCAT('20190429', '000000') AND
cip_ctfno IN ('360426198807174073')

查询计划见附件。

【解决办法】

  1. 由于 SparkSQL 自身限制,无法通过 SQL 优化做到。需考虑拆分为两个单独的查询来完成。
  2. 该场景适合使用 NLJOIN(Nested Loop Join),但 SparkSQL 只有 HSJOIN(Hash Join)和 MSJOIN(Sort Merge Join)。因此无法将子查询结果作为条件下压。

【参考资料】
表的三种Join方法 (NLJOIN, HSJOIN, MSJOIN): https://www.cnblogs.com/sophy...

【解决办法】

  1. 由于 SparkSQL 自身限制,无法通过 SQL 优化做到。该场景适合使用 NLJOIN(Nested Loop Join),但 SparkSQL 只有 HSJOIN(Hash Join)和 MSJOIN(Sort Merge Join)。因此无法将子查询结果作为条件下压。
  2. 建议分两次查询完成,先从 ibs.pb_cstinf_pro 表中查询,然后在应用层用查询结果生成 ibs.pb_log 表的匹配条件,再对 ibs.pb_log 表进行查询。

【参考资料】
表的三种Join方法 (NLJOIN, HSJOIN, MSJOIN): https://www.cnblogs.com/sophy...