在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。在某运营商的优化经历中曾经遇到了一条比较有意思的 SQL,具体如下:
1 该最开始的 sql 执行情况如下
SQL> SELECT 2 NVL(T.RELA_OFFER_SPEC_ID, SUBOS.SUB_OFFER_SPEC_ID) "offerSpecId" 3 FROM OFFER_SPEC_RELA T 4 LEFT JOIN OFFER_SPEC_GRP_RELA SUBOS 5 ON T.RELA_GRP_ID = SUBOS.OFFER_SPEC_GRP_ID 6 AND subos.start_dt = SYSDATE 8 WHERE T.RELA_TYPE_CD = 2 9 AND t.start_dt = SYSDATE 11 AND (T.OFFER_SPEC_ID = 109910000618 12 OR EXISTS 13 (SELECT A.OFFER_SPEC_GRP_ID 14 FROM OFFER_SPEC_GRP_RELA A 15 WHERE A.SUB_OFFER_SPEC_ID = 109910000618 16 AND T.OFFER_SPEC_GRP_ID = A.OFFER_SPEC_GRP_ID 17 )) 18 AND rownum<p> </p><p><img alt="image" class="has" src="https://img.php.cn/upload/article/000/000/018/8062f64365ca5d12f77f757727bc7d3e-0.png"></p><pre class="brush:sql;toolbar:false;">Predicate Information (identified by operation id): --------------------------------------------------- 1 - Filter(ROWNUM=SYSDATE@! AND "T"."START_DT"=SYSDATE@! AND "SUBOS"."START_DT"(+)<p> </p><p><img alt="image" class="has" src="https://img.php.cn/upload/article/000/000/018/8062f64365ca5d12f77f757727bc7d3e-1.png"></p><p>2 第一次分析<br>此时应该有以下个地方值得注意<br>1) 该 sql 每天执行上千次,平均每次执行返回不到 10 行数据,但是平均逻辑读达到1.2W,可能存在性能问题。<br>2)ID 为 4,5 的执行计划路径中出现了两个全表扫描,看到这儿我们可以想到可能是没有合适的索引导致走了全表扫描从而执行效率低下。<br>3)ID 为 2 的执行计划路径出现了 FILTER,且 3,和 6 为其子路径,如果FILTER有两个及两个以上的子路径,那么他的执行原理将类似于嵌套循环,id 号最小的子路径如果返回行数较多,可能会导致多次执行id号更小的子路径,导致性能低下。一般存在 “OR EXISTS” 的时候会出现此情况,可以根据情况避免。</p><p>相关链接:<br></p><p><a href="http://www.php.cn/php-notebook-162286.html" target="_self">PHP-FPM实现性能优化,php-fpm性能优化</a></p><p><a href="http://www.php.cn/php-notebook-162286.html" target="_self">PHP-FPM实现性能优化,php-fpm性能优化</a></p><p><a href="http://www.php.cn/php-notebook-162286.html" target="_self">PHP-FPM实现性能优化,php-fpm性能优化</a></p>
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END