【巨杉数据库Sequoiadb】如何在作完子查询后,将子查询结果做为条件下压到 SequoiaDB

【问题详细描述】
有如下 sql 语句。SQL1 耗时约 4s,SQL二、SQL3 耗时约 1 个小时。有办法经过优化 SQL2 作到作完子查询再把全部条件一块儿下压到 SequoiaDB 吗? html

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

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') oop

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') 优化

查询计划见附件。htm

【解决办法】blog

  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...索引

【解决办法】ip

  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...ci

相关文章
相关标签/搜索