DBLINK跨數據庫關聯表的優化查詢 [使用/*+ driving_site(tablename) */]


【菜鳥隨筆,有錯誤或者不准確的地方歡迎大嬸們斧正!】

 檢查系統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,雖說還是比較長但至少能接受了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM