프로젝트에서 쓰기 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을 하므로, 다른 테이블에 해당 데이터를 사용자 삽입 데이터를 추출한 후 해당 데이터의 달에 몇 천, 그래서 온 수십 데이터의 조각 수천 년 전에 오라클 에 그는 결정이 제로 압력 말했다.
당신이 최적화 할 수있는 다른 방법이있는 경우, 아래의 메시지 교환을 남겨주세요.