ORACLE 千萬條的資料優化
阿新 • • 發佈:2020-12-23
技術標籤:oracle
概述
需要是這樣的,在一張有一千萬條資料的表裡,時間型別為yyyy-MM-dd HH:mm:ss,需要按月或者年對資料進行統計,功能寫出來後查詢了一下資料發現太慢了,,結合一個案例簡單講一下,架構用的是Mybatis Plus
demo
開始的返回資料是這樣的,但是它的時間達到了3秒,有時候到8秒,這也太慢了
想到了再Mybatis Plus中注入資料的時候,可能要對很多無關的欄位進行檢測,那麼是否可以把無關欄位去掉一下?
嘗試一下
可以,時間為1秒,沒有問題,期間有嘗試過用在時間欄位上加索引,但是時間達到了30多秒,太恐怖了,我想可能是索引在遍歷B樹所用的時間比查全表的時間長
SQL:
SELECT
NVL( a.FUND_AMOUNT, 0 ) FUND_AMOUNT,
a.FUND_TYPE_NAME FUND_TYPE_NAME,
b.ACCT
FROM
(
SELECT
SUM( FUND_AMOUNT ) FUND_AMOUNT,
MAX( TO_CHAR( ACCT, 'yyyy-MM' ) ) ACCT,
MAX( FUND_TYPE_NAME ) FUND_TYPE_NAME
FROM
FUND_DETAIL
WHERE
FUND_TYPE_CODE = '1'
AND USER_ID = '1'
AND TO_CHAR ( ACCT, 'yyyy-MM' ) BETWEEN '2020-07'
AND '2020-12'
GROUP BY
SUBSTR( TO_CHAR( ACCT, 'yyyy-MM' ), 0, LENGTH( ACCT ) - 2 )
) a
RIGHT JOIN (
SELECT
TO_CHAR( ADD_MONTHS( TO_DATE( '2020-07', 'yyyy-MM' ), ROWNUM - 1 ), 'yyyy-MM' ) ACCT
FROM
DUAL CONNECT BY ROWNUM <= MONTHS_BETWEEN( TO_DATE( '2020-12' , 'yyyy-MM' ), TO_DATE( '2020-07', 'yyyy-MM' ) ) + 1
) b ON a.ACCT = b.ACCT
ORDER BY
b.ACCT;