Oracle SQL 성능 최적화 시리즈 학습 3

2961 단어 OrraacclleeS
보고 있 는 ORACLE 튜 토리 얼 은 Oracle SQL 성능 최적화 시리즈 학습 3 입 니 다.8. DECODE 함 수 를 사용 하여 처리 시간 을 줄 입 니 다.  DECODE 함 수 를 사용 하면 같은 기록 을 중복 검색 하거나 같은 표를 중복 연결 하 는 것 을 피 할 수 있 습 니 다.  예 를 들 면:  SELECT COUNT(*),SUM(SAL) FROM EMP  WHERE DEPT_NO = 0020  AND ENAME LIKE ‘SMITH%';  SELECT COUNT(*),SUM(SAL)  FROM EMP  WHERE DEPT_NO = 0030  AND ENAME LIKE ‘SMITH%';   너 는 DECODE 함수 로 같은 결 과 를 효율적으로 얻 을 수 있다.  SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,  COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,  SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,  SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL  FROM EMP WHERE ENAME LIKE ‘SMITH%';   유사 한 것 은 DECODE 함수 도 GROUP 에 사용 할 수 있다. BY ORDER BY 자구 중.    9. 통합 이 간단 하고 관련 이 없 는 데이터베이스 접근  만약 당신 이 몇 개의 간단 한 데이터베이스 조회 문 구 를 가지 고 있다 면,당신 은 그것들 을 하나의 조회 에 통합 시 킬 수 있 습 니 다.(비록 그것들 사이 에 관계 가 없 더 라 도)  예 를 들 면:  SELECT NAME FROM EMP  WHERE EMP_NO = 1234;  SELECT NAME FROM DPT  WHERE DPT_NO = 10 ;  SELECT NAME FROM CAT  WHERE CAT_TYPE = ‘RD';   위의 세 개의 조 회 는 하나 로 합 쳐 질 수 있다.  SELECT E.NAME , D.NAME , C.NAME FROM CAT C , DPT D , EMP E,DUAL X  WHERE NVL(‘X',X.DUMMY) = NVL(‘X',E.ROWID(+))  AND NVL(‘X',X.DUMMY) = NVL(‘X',D.ROWID(+))  AND NVL(‘X',X.DUMMY) = NVL(‘X',C.ROWID(+))  AND E.EMP_NO(+) = 1234  AND D.DEPT_NO(+) = 10  AND C.CAT_TYPE(+) = ‘RD';   (번역자: 이런 방법 을 채택 하면 효율 이 높 아 지지 만 프로그램의 가 독성 이 크게 떨 어 지기 때문에 독자 들 은 이 로 움 과 폐단 을 따 져 봐 야 한다)    10. 중복 기록 삭제  가장 효율 적 인 중복 기록 삭제 방법 ( 로 와 이 드 를 사 용 했 기 때문에)  DELETE FROM EMP E  WHERE E.ROWID > (SELECT MIN(X.ROWID)  FROM EMP X  WHERE X.EMP_NO = E.EMP_NO);     11. DELETE 대신 TRUNCATE 사용 하기  표 의 기록 을 삭제 할 때 일반적인 상황 에서 스크롤 백 세그먼트 segments ) 복구 할 수 있 는 정 보 를 저장 합 니 다. COMMIT 업무 가 없 으 면 ORACLE 은 데 이 터 를 삭제 하기 전 상태 로 복원 합 니 다(정확히 말 하면 삭제 명령 을 실행 하기 전 상태 로 복원 합 니 다) ,TRUNCATE 를 사용 할 때, 스크롤 백 은 복구 가능 한 정 보 를 저장 하지 않 습 니 다.명령 이 실 행 된 후 데 이 터 를 복구 할 수 없습니다.따라서 자원 이 호출 되 지 않 고 실행 시간 도 짧 습 니 다.(주: TRUNCATE 는 전체 테이블 삭제 에 만 적용 되 며 TRUNCATE 는 DDL 이지 DML 이 아 닙 니 다)    12. 되도록 COMMIT 를 많이 사용 하 세 요.  가능 하 다 면 프로그램 에서 가능 한 한 COMMIT 를 많이 사용 하 세 요. 이러한 프로그램의 성능 이 향상 되 고 수요 도 COMMIT 가 방출 하 는 자원 으로 인해 줄어든다.  COMMIT 에서 사용 하 는 자원:    a. 스크롤 백 에서 데 이 터 를 복구 하 는 데 사용 되 는 정보 입 니 다.    b. 프로그램 문 에서 얻 은 자물쇠    c. redo log buffer 공간    d. Oracle 은 상기 3 가지 자원 중의 내부 비용 을 관리 하기 위해  (비고:COMMIT 를 사용 할 때 반드시 업무 의 완전 성 을 주의해 야 한다.현실 에서 효율 과 업무 의 완전 성 은 흔히 물고기 와 곰 발바닥 을 겸 할 수 없다)  DECODE 에서 NULL 을 추출 하면 SUM(NULL)의 값 은 NULL 입 니 다. -->모든 값 이 NULL 이면 , SUM(NULL) = NULL 하지만 한 값 만 있 으 면 NULL,SUM()이 아 닙 니 다. <> NULL 그래서 원래 SQL 은 논리 적 인 문제 가 없 을 거 예요.  8 시 에 대한 개인 적 인 견해:만약 에 DECODE 의 수치 가 NULL 이 라면 SUM(NULL)의 값 이 NULL 이 고 정상적으로 화 해 를 구하 지 않 을 것 입 니 다.다음 과 같이 고 칠 수 있 으 면 좋 겠 습 니 다. SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,0)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,0)) D0030_SAL FROM EMP WHERE ENAME LIKE ‘SMITH%';

좋은 웹페이지 즐겨찾기