SQL最佳化1

dmcatding發表於2020-05-10

Oracle版本:12.2

作業系統:Oracle Linux 7.4


SQL語句如下:

因為應用系統是很多年的系統,開發反饋基本不讓動程式碼的, zb_1ddb, xb_2ddb 都是單表的檢視;

select zb_1ddb.jm,

       sum(zb_1ddb.zb_1005) + sum(zb_1ddb.zb_1009) as GTYS1001,

       sum(zb_1ddb.zb_1006) as GTYS1002,

       sum(zb_1ddb.zb_1007) as GTYS1003,

       sum(XB_2DDB.XB_2003) as GTYS1005,

       sum(zb_1ddb.zb_1002) as GTYS1006

  from zb_1ddb, xb_2ddb

 where 1 = 1

   and zb_1ddb.ymd >= to_date('2020-04-01', 'yyyy-mm-dd')

   and zb_1ddb.ymd < to_date('2020-05-01', 'yyyy-mm-dd')

   and xb_2ddb.ymd >= to_date('2020-04-01', 'yyyy-mm-dd')

   and xb_2ddb.ymd < to_date('2020-05-01', 'yyyy-mm-dd')

   and zb_1ddb.jm = xb_2ddb.jm

   and zb_1ddb.ymd = xb_2ddb.ymd

   and zb_1ddb.jm <> '+ '

 group by zb_1ddb.jm;


拿到語句後,看了看語句沒有什麼特別之處,無非就是兩個結果集關聯過濾,但結果只返回16行資料,但消耗38秒,看如下執行計劃:

看到執行計劃發現,被驅動表關聯列也是走的索引 INDEX_XB2_003 但掃描了570次,很明顯執行計劃有問題,這兩個檢視對應的基表都30M左右。


最簡單的最粗暴的方式改變它的執行計劃:

select /*+ use_hash(zb_1ddb,xb_2ddb) */

 zb_1ddb.jm,

 sum(zb_1ddb.zb_1005) + sum(zb_1ddb.zb_1009) as GTYS1001,

 sum(zb_1ddb.zb_1006) as GTYS1002,

 sum(zb_1ddb.zb_1007) as GTYS1003,

 sum(XB_2DDB.XB_2003) as GTYS1005,

 sum(zb_1ddb.zb_1002) as GTYS1006

  from zb_1ddb, xb_2ddb

 where 1 = 1

   and zb_1ddb.ymd >= to_date('2020-04-01', 'yyyy-mm-dd')

   and zb_1ddb.ymd < to_date('2020-05-01', 'yyyy-mm-dd')

   and xb_2ddb.ymd >= to_date('2020-04-01', 'yyyy-mm-dd')

   and xb_2ddb.ymd < to_date('2020-05-01', 'yyyy-mm-dd')

   and zb_1ddb.jm = xb_2ddb.jm

   and zb_1ddb.ymd = xb_2ddb.ymd

   and zb_1ddb.jm <> '+ '

 group by zb_1ddb.jm;


居然秒出了。。再次檢視執行計劃


建議:如果能在修改檢視重構的情況下儘量修改,少用HINT,儘量讓Oracle 自己判斷,我這也是沒辦法的辦法了。。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30327022/viewspace-2691103/,如需轉載,請註明出處,否則將追究法律責任。

相關文章