[오답정리] SQL 성능 튜닝

3과목. 데이터베이스 구축 > 1장. 논리 데이터베이스 설계 > SQL 성능 튜닝 :
  • Hint
    • 힌트의 개념
      • 사용자가 수동으로 어떠한 경우에도 실행 계획을 고정하기 위해 사용
    • SQL의 힌트 사용의 예시
      • 일반 형식 : SELECT a.dname, b.ename, b.sal
      • 힌트 사용 시 : SELECT /* + use_nl(b,a) */ a.dname. b.ename, b.sal ( SELECT /* + hint[{hint} .... ] */ )
  • SQL 부분범위 처리
    • SQL 부분범위 처리의 개념
      • 조건을 만족하는 전체범위를 처리하는 것이 아니라 일단 운반단위까지만 처리하여 추출하는 처리 방식
    • SQL 부분범위 처리 목적
      • 스캔 범위를 나누어서 운반단위를 가능한 빨리 채워서 처리 속도를 향상
      • 일부분만 처리하고서도 Optimizer의 특성을 이용하여 정확한 결과를 도출
      • 처리 범위가 넓더라도 빠른 속도를 얻도록 하기 위함
    • SQL 부분범위 처리 적용 원칙
      • 부분범위처리의 자격
        • 논리적으로 일부분만 처리한 결과가 전체범위를 읽어 추가적인 가공을 하지 않고도 처리한 결과와 동일하다면 자격이 있음
      • 부분범위처리를 할 수 없는 경우
        • Order By가 사용된 경우
        • UNION, MINUS, INTERSECT 등 조회 후 추가 연산을 사용한 경우
      • 부분범위처리를 할 수 없는 경우의 대체
        • Order By : Index를 이용하여 Order by를 하지 않아도 되는 형태로 대체
        • MINUS, INTERSECT : EXISTS, NOT EXISTS, IN, NOT IN 등으로 대체
    • SQL 부분범위 처리 방안
      • SQL 구문에 Order By가 있는 경우 인덱스 등을 이용하여 Order By를 삭제하는 형태로 변환
      • 결과 컬럼을 얻어올 때 인덱스에서 모두 가져올 수 있는 항목인지를 살펴서 인덱스가 다시 테이블을 읽지 않아도 되는 형태로 사용
      • 보통 사용하는 MAX(seq) + 1 형태를 버리고 역순 인덱스를 이용하여 Next Seq (다음 시권스값)를 구하는 형태로 변경
      • 데이터의 존재 여부를 체크하는 등의 로직을 수행해야 할 때, count()를 수행하는 것보다는 EXISTS를 이용하여 존재여부를 파악
    • SQL 부분범위 처리 VS 전체범위 처리 비교

      구분 전체범위처리 부분범위처리
      특징 주어진 조건의 범위가 좁은 경우는 문제가 없으나 넓은 경우는 빠른 수행 속도를 기대하기 어려움 처리할 범위가 아무리 넓다고 하더라도 그 범위 중의 일부만 처리
      스캔방법 드라이빙 조건을 만족하는 범위를 모두 스캔 드라이빙 조건을 만족하는 범위를 차례로 스캔함
      체크조건 처리 방법 체크조건 검증 후 성공한 건에 대해 임시 저장공간에 저장 체크 조건을 검증하여 성공한 건을 바로 운반단위로 보냄
      결과추출 방법 저장이 완료되면 필요한 2차 가공을 한 후 운반단위만큼 추출시키고 다음 요구가 있을 때까지 일단 멈춤 운반단위가 채워지면 수행을 멈추고 결과를 추출

 

800제-251번. 다음 SQL 문의 실행 결과는? 

정답 : 3

 

 

800제-760번. 테이블 A, B의 해쉬조인을 유도하는 SQL의 힌트(Hint) 구문으로 올바른 것은?

① SELECT /* USE_HASH(A, B) */ FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';
 SELECT /*+ USE_HASH(A, B) */ FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';
 SELECT // USE_HASH(A, B) // FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';
 SELECT /* USE_HASH(A, B) */ FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';

 

정답 : 1

 

 

1000제-354번. 다음은 데이터베이스 SQL의 부분범위 처리 구문이다. 괄호 안에 들어갈 알맞은 명령어를 쓰시오. 
SELECT ITEM_NM
FROM ITEM_TAB_HIST
WHERE (     )
	(SELECT 'X'
     FROM ITEM_TAB
     WHERE DEPT = '101' AND SEQ > 100)

① EXISTS
② ORDER BY
③ HAVING
④ GROUP BY 

 

정답 : 1

 

 

1000제-960번. 테이블 A, B의 해쉬조인을 유도하는 SQL의 힌트(Hint) 구문으로 올바른 것은?

① SELECT /* USE_HASH(A, B) */ FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';
SELECT /*+ USE_HASH(A, B) */ FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';
SELECT // USE_HASH(A, B) // FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';
SELECT /* USE_HASH(A, B) */ FORM A, B WHERE A.NAME = B.NAME AND A.NAME ='이순신';

 

정답 : 1