오라클 성능 최적화 (A SQL 최적화의 간단한 기록 프로젝트)

프로젝트에서 쓰기 SQL은 주로 쿼리 기반하지만, 많은 양의 데이터, 그것은 강조 표시됩니다 SQL 성능 최적화의 중요성을. 사실, 2000W 이하의 데이터의 양이, 인덱스가 고려 될 수 있지만, 더 2000W보다, 포인트 테이블의 이러한 하위 라이브러리를 고려할 필요가있다. 이 논문은 실제 프로젝트, 질의 매우 느린 할 필요 기록 의 SQL 더 나은 솔루션이 있다면, 다음과 같은 교환에 메시지를 남겨주세요, 최적화 과정을.

에 대한 많은 기사가 있습니다 SQL 최적화 방법은, 여기가 언급되지 않습니다. : 블로그 볼 필요가있는 경우 https://blog.csdn.net/linhaiyun_ytdx/article/details/79101122은

 

SELECT T.YHBH, 
       ( SELECT NAME FROM DIM_REGION WHERE CODE = SUBSTR (T.GDDWBM, 0 , 4 )) GDDWMC, 
       ( SELECT NAME FROM DIM_REGION CODE = T.GDDWBM) FJMC, 
       T.DFNY, 
       T.YHMC, 
       T. YDDZ, 
       ( SELECT NAME FROM DIM_ELECTRICITY_TYPE CODE = YDLBMC T.YHLBDM)
   FROM는 ( SELECT DISTINCT , T.YHBH을 
                        DECODE (T.GDDWBM, 
                               NULL ,
                                ' 0000 ' , 
                               DECODE (T.GDDWBM, ' 09 ' , ' 0000 ' , T.GDDWBM)) AS GDDWBM, 
                        T.BBNY AS DFNY, 
                        T.YHLBDM AS YHLBDM, 
                        T.YHMC, 
                        T2.YDDZ 
          FROM V_TEMP_TABLE_JHCBHSTJ_HISTORY T, T2 TMP_KH_YDKH
          WHERE T.YHBH = T2.YHBH ( + )
           AND  NOT  EXISTS ( SELECT  1 
                  FROM DJHJSL_LSB_FZ_HISTORY B
                  WHERE B.BBNY = T.BBNY
                    AND B.YHBH = T.YHBH
                    AND B.GDDWBM = T.GDDWBM
                    AND B.YHLBDM = T.YHLBDM
                    AND B.ZDCBZHS <>  ' 0 ' ) 
) T 
WHERE SUBSTR (T.GDDWBM, 0 , 4 ) =  ' 0946 '  
  ANDT.DFNY =  ' 201911 '

이것은 내입니다 SQL 스크립트. 사실,이 스크립트는 복잡하지 않다. 어떤 V_TEMP_TABLE_JHCBHSTJ_HISTORY , DJHJSL_LSB_FZ_HISTORY는 매달에게 증가 (330) 만 현재이 1,960 백만을  TMP_KH_YDKH의 표가 (330) 만. DIM_REGION DIM_ELECTRICITY_TYPE는 두 개의 데이터 사전 항목 테이블입니다.

인덱스가없는 경우,이 스크립트가 실행해야 30 대 , 구현 과정을 볼, 지금은 전체 테이블을 스캔입니다. 그런 다음 최적화 시작합니다.

1. 수정 쿼리 스크립트는 데이터의 양을 줄이기 위해, 외부 층의 내부를 쿼리합니다.

SELECT T.YHBH, 
       ( SELECT NAME FROM DIM_REGION WHERE CODE = SUBSTR (T.GDDWBM, 0 , 4 )) GDDWMC, 
       ( SELECT NAME FROM DIM_REGION CODE = T.GDDWBM) FJMC, 
       T.DFNY, 
       T.YHMC, 
       T. YDDZ, 
       ( SELECT NAME은 FROM DIM_ELECTRICITY_TYPE WHERE CODE = T.YHLBDM) YDLBMC
   FROM ( SELECT DISTINCT , T.YHBH을
                        DECODE (T.GDDWBM, 
                               NULL ,
                                ' 0000 ' , 
                               DECODE (T.GDDWBM, ' 09 ' , ' 0000 ' , T.GDDWBM)) AS GDDWBM, 
                        T.BBNY AS DFNY, 
                        T.YHLBDM AS YHLBDM, 
                        T.YHMC, 
                        T2.YDDZ 
          FROM V_TEMP_TABLE_JHCBHSTJ_HISTORY T, T2 TMP_KH_YDKH
          WHERE T.YHBH = T2.YHBH ( + )
           AND  NOT  EXISTS ( SELECT  1 
                  FROM DJHJSL_LSB_FZ_HISTORY B
                  WHERE B.BBNY = T.BBNY
                    AND B.YHBH = T.YHBH
                    AND B.GDDWBM = T.GDDWBM
                    AND B.YHLBDM = T.YHLBDM
                    AND B.ZDCBZHS <>  ' 0 ' )
             AND SUBSTR (T.GDDWBM, 0 , 4 ) =  ' 0946 '  
            ANDT.BBNY =  ' 201911 ' 
) T

2. 세 개의 테이블은 인덱스에 내장되어 있습니다

들면 V_TEMP_TABLE_JHCBHSTJ_HISTORY 있어서 DFNY , SUBSTR (T.GDDWBM, 0, 4) 조인트 인덱스를 작성.

CREATE  INDEX IDX_TMP_JHCBHSTJ_HISTORY_UNION ON V_TEMP_TABLE_JHCBHSTJ_HISTORY (BBNY, SUBSTR (GDDWBM, 0 , 4 ));

들어 TMP_KH_YDKH의 테이블 연결을 사용, 할 필요가 yhbh 인덱스를 구축

만들  인덱스 IDX_YHBH_KH  TMP_KH_YDKH (YHBH를);

들어 DJHJSL_LSB_FZ_HISTORY 테이블에서 하지 EXISTS 내부 는 전체 테이블은 테이블을 스캔 할 것이다, 지금 그 시도하는 공동 인덱스를 설정합니다.

CREATE  INDEX IDX_DJHJSL_FZ_HISTORY_UNION ON V_TEMP_TABLE_JHCBHSTJ_HISTORY (BBNY, YHBH, GDDWBM, YHLBDM을);

보기 오라클 실행 계획은 공동으로 인덱스를 구축하고, 가자하지 않은 인덱스 테이블을, 또는 전체 테이블을 스캔하지만, 질문이 제기되었다 9S 까지.

이 네 개의 필드에 다음 색인 :

만들  인덱스 IDX_DJHJSL_FZ_HISTORY_BBNY DJHJSL_LSB_FZ_HISTORY (BBNY를);
만들  인덱스 IDX_DJHJSL_FZ_HISTORY_YHBH DJHJSL_LSB_FZ_HISTORY (YHBH를);
만들  인덱스 IDX_DJHJSL_FZ_HISTORY_GDDWBM DJHJSL_LSB_FZ_HISTORY (GDDWBM를);
만들  인덱스 IDX_DJHJSL_FZ_HISTORY_YHLBDM  DJHJSL_LSB_FZ_HISTORY (YHLBDM를);

 관점에서 실행 계획, 오라클은 단지 이동 IDX_DJHJSL_FZ_HISTORY_BBNY를 인덱스 지금이 가장 빠른있다 1.95s 까지.

이 쿼리를 충족하고 있지만 3S 의 요구 사항을하지만, 계정, 월별 데이터 증가로 촬영 한 후, 데이터의 양이있다 5000 만 일억 배의 데이터와 같은 많은 양의 또는 매우 느린 것입니다.

사실, 내 공식적인 환경 시험 시간의 NOT가  단일 인덱스의 설립은 아무 소용이며,이 테이블 내부에 존재하는 공동 인덱스의 설립이 인덱스 테이블 때문에 다른 컴퓨터의 CPU와 다른 요인 아마 가야 할 것입니다.

 

위의 최적화는 물론, 프로젝트, 비즈니스 최적화의 다음 조합의 요구를 충족시킬 수 없다. 모니터 용 시스템으로, 데이터는 T + 1 ,이 데이터가 사용되는 실시간 추적을 필요로하지 않습니다 ETL의 하루 추출 도구 타이밍 추출. 그리고 매월 300 데이터 만 해당 단지 수천 사용자는 바. 비즈니스의 조합 그래서, 우리가 사용하는 ETL을 하므로, 다른 테이블에 해당 데이터를 사용자 삽입 데이터를 추출한 후 해당 데이터의 달에 몇 천, 그래서 온 수십 데이터의 조각 수천 년 전에 오라클 에 그는 결정이 제로 압력 말했다.

 

당신이 최적화 할 수있는 다른 방법이있는 경우, 아래의 메시지 교환을 남겨주세요.

 

추천

출처www.cnblogs.com/pluto-charon/p/11964776.html