ORACLE數據庫多表關聯查詢效率問題解決方案


最近在做項目中遇到多表關聯查詢排序的效率問題(5張以上40W+數據的表),查詢一次大概要20多秒,經過一番苦思冥想,處理方案如下:

  1、軟件設計初期,需要一對一關聯的表應該設計在一張大表里,這樣雖然字段多些,但是對於查詢的速度提升是非常明顯的,特別是在排序的情況下。

  2、我們在關聯的時候可能需要排序的表只是其中的一張或者兩張,我們可以先針對這兩張需要排序的表先查詢排序,然后再用這兩個表查詢的結果關聯其他表。代碼如下:

  

 1 SELECT * FROM (
 2        SELECT * FROM M_RK_JBXX A 
 3        LEFT JOIN M_RK_ZFGX B ON A.RKID = B.RKID 
 4        LEFT JOIN(SELECT *
 5            FROM M_DZ_MP D
 6            LEFT JOIN M_DZ_LD E ON D.LDID = E.LDID
 7            ORDER BY E.XC, E.PXH, D.PXH)DD ON B.MPID = DD.MPID
 8        LEFT JOIN  M_DZ_WGGL F  ON DD.WGID = F.WGID 
 9        LEFT  JOIN M_RK_HJXXZH C ON C.MPID = DD.MPID
10 )

 后來我在需要分頁的環境下,用rownum來進行分頁,發現按照上面的排序的順序就被打亂了。在網上找了很多資料也看了很多博客,也沒找到解決方案。

所以上面的代碼的適用性就很局限了(不分頁的情況下)。

 

但是我需要高效率的分頁怎么辦呢?rownum滿足不了我呀。后來我又找到了一個函數ROW_NUMBER() OVER(ORDER BY column)  ,通過該函數可以極大的提高查詢的效率。

使用的方式為

1 SELECT *
2   FROM (SELECT ROW_NUMBER() OVER(ORDER BY A.PXH, B.PXH) NUM,
3               A.*,B.*
4 FROM TAB1 A
5           LEFT JOIN TAB2 B
6             ON A.T2= B.ID
7 )
8  WHERE NUM BETWEEN 1 AND 20

通過這種方式我的查詢速度提高了將近10倍,當然我的實際環境比這段代碼要麻煩很多。


免責聲明!

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



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