大数据项目中的Oracle查询优化
今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进。
需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下:
SELECT COUNT(NAME) FROM(SELECT TAX_INFO_GD.NAME, TAX_INFO.NSR, TAX_INFO_GD.SH_ID, TAX_INFO.SHXYDM, TAX_INFO_GD.SYLX, TAX_INFO_GD.JDXZ, TAX_INFO_GD.STATE GDSTATE FROM TAX_INFO_GD LEFT JOIN TAX_INFO ON TAX_INFO_GD.NAME = TAX_INFO.NSR OR TAX_INFO_GD.SH_ID = TAX_INFO.SHXYDM) WHERE NSR is null and SHXYDM is null and (SYLX = 2 OR SYLX = 3) and GDSTATE='正常';
改进过后的代码:
SELECT COUNT(*) FROM TAX_INFO_GD B WHERE (SELECT COUNT(1) ASnum FROM TAX_INFO A WHERE A.NSR = B.NAME AND A.SHXYDM = B.SH_ID) = 0 AND B.STATE = '正常' AND (B.SYLX = '2' OR B.SYLX = '3');
两段查询语句查询出的结果是一样的,
第一种查询思路是先将国地税表和税源表做左链接,这也就意味着形成的临时表是以国地税表为主体,将税源表所有字段横向追加到国地税表中的一张大表,比国地税表的字段数量更多。在形成这张临时表之后再做一次符合条件的查询。
而第二种查询方式的主体思路是先在一张表中筛选,筛选出的数据就是另外一张表的查询条件。
这里只有结果,不做结论,因为orcale内部是何种数据结构如何运行我们不得而知,贸然的主观猜测可能会误人子弟。