1. 程式人生 > 其它 >ORACLE 千萬條的資料優化

ORACLE 千萬條的資料優化

技術標籤: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;