標籤:oracle sql 排序 串連
天氣天熱,周末在家敲代碼發現一個奇怪的sql,在使用left join 表串連左查詢的時候,A left join B,之前A表排好的序,突然錯亂了,第一行記錄跑到了最後以後,之前的降序變成了升序! 類比sql如下
SELECT
A .*
FROM
(
SELECT
A .*
FROM
(
SELECT
A .*,
ROWNUM r
FROM
(
SELECT
*
FROM
tporder A
WHERE
TO_CHAR (A .PLATTIME, ‘yyyy-mm-dd‘) >=‘2015-08-09‘
AND TO_CHAR (A .PLATTIME, ‘yyyy-mm-dd‘) <=‘2015-08-09‘
AND A . TYPE IN (0, 1, 23, 24, 25, 30)
AND A .BUSI_TYPE = 1
ORDER BY
PLATTIME DESC
) A
LEFT JOIN TMERINFO b ON A .STOREID = b.TACCOUNTID
) A
LEFT JOIN tbankmore c ON A .CARD_BANK_TP = c. ID
WHERE
A .r <=20
) A
left JOIN TpRANSACTION tr ON A.ID = tr.TORDERID(執行這句話的時候之前按照plattime降序-->升序)。
折騰了好久沒想起來解決方案,突然就像看看這個sql的執行計畫,我們知道表串連有3中方式,嵌套內迴圈,排序合并串連,雜湊串連,根據我們這個sql的情況,由於A表的id和B表的torder做串連,A表的主鍵肯定是經過排序的,預設是升序,oracle最佳化引擎肯定是用了排序合并串連的演算法,導致問題發生的。解決方案就是為b表的torderid欄位建立降序索引,這樣合并的時候不僅可以提高sql執行效率,而且把剛才的那種問題也避免了!
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Oracle 表串連 導致排序錯亂