【菜鳥隨筆,有錯誤或者不准確的地方歡迎大嬸們斧正!】
檢查系統bug時發現系統中有個頁面數據加載超慢,十分鍾都沒出結果,以為程序bug,跟蹤后發現調用的視圖慢,繼續簡稱發現視圖套視圖,而且還用了DBLINK,進行了跨數據庫聯合,總共用到三張遠程表+一個本地視圖。
不方便直接貼實際sql,假設本地服務器為local,遠程服務器為remote,三張遠程表為t1@remote(百萬級),t2@remote(千級),t3@remote(千級),本地視圖為v1(兩位數)。
原sql語句為(有簡化):
select * from
t1@ remote t1
inner join
v1
on xxxxx=xxxxx
inner join
t2@ remote t2
on xxxxx=xxxxx
inner join
t3@ remote t3
on xxxxx=xxxxx
幾乎所有數據都在遠程數據庫,只關聯遠程數據庫三張表三秒鍾出結果,再關聯v1十分鍾都沒出來,本地視圖v1明顯在拖后腿,首先想到的是把本地視圖挪到遠程數據庫,立馬否定,然后有想到能不能查詢時把本地v1全部數據都發送到remote那然后在remote數據庫完成聯合查詢再返回結果,然后千度查到/*+driving_site(tablename)*/ ,可以指定查詢聯合在哪個數據庫進行,這樣只要把執行數據庫指定到remote,幾十條的v1數據發送到remote而不再是把百萬級的remote數據同步到local。
修改sql
select /*+driving_site(t1)*/ * from
t1@ remote t1
inner join
v1
on xxxxx=xxxxx
inner join
t2@ remote t2
on xxxxx=xxxxx
inner join
t3@ remote t3
on xxxxx=xxxxx
再次執行,查詢時間由原來的10min+降到5s,雖說還是比較長但至少能接受了。
