면접 필수 질문 sql 최적화 편

17614 단어 sql
1. 개수가 적은 표를 기초 조회표로 선택
FROM 자구에 여러 개의 시계가 포함된 경우, 기록 항목의 수가 가장 적은 시계를 기초표로 선택해야 한다.
기본 테이블(Driving Table)은 가장 먼저 액세스하는 테이블(일반적으로 전체 테이블 스캔으로 액세스됨)을 의미합니다.
예는 다음과 같습니다.
표 TAB1 16384개 기록표 TAB2 1개 기록은 TAB2를 기초표로 선택(최선의 방법)
select count(*) from tab1,tab2     0.96  oracle    

TAB2를 기본표로 선택(좋지 않은 방법)
select count(*) from tab2,tab1     26.09 

만약 3개 이상의 테이블 연결 조회가 있다면 교차표(intersection table)를 기초표로 선택해야 한다. 교차표는 다른 테이블에 인용된 표를 가리킨다.예를 들면 다음과 같습니다.
EMP 테이블은 LOCATION 테이블과 CATEGORY 테이블의 교차점을 설명합니다.
SELECT * 
FROM LOCATION L , 
CATEGORY C,
EMP E 
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN

다음 SQL보다 효율적입니다.
SELECT * 
FROM EMP E ,
LOCATION L , 
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000

2. WHERE 자문의 연결 순서
아래에서 위로 순서대로 WHERE 자구를 해석하는데 이 원리에 따라 표 간의 연결은 다른 WHERE 조건에 쓰기 전에 최대 수량의 기록을 필터할 수 있는 조건은 WHERE 자구의 끝에 써야 한다.동시에 링크된 테이블에서 필터를 할 수 있는 것은 먼저 필터를 해야 한다.
예를 들면 다음과 같습니다.
(비효율, 실행 시간 156.3초)
SELECTFROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);

(효율성 10.6초)
SELECTFROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER’;

3. SELECT 자구에서'*'사용 금지
SELECT 자구에 모든 COLUMN을 표시하고 싶을 때, 동적 SQL 열을 사용하여 '*' 를 인용하는 것은 편리한 방법입니다.이것은 매우 저효의 방법이다.실제로 해석하는 과정에서 순서대로 모든 열명으로 변환됩니다. 이 작업은 데이터 사전 조회를 통해 이루어지므로 더 많은 시간이 걸릴 것입니다.
예를 들면 다음과 같습니다.
효율성:
SELECT EMPNO,EMPNAME FROM EMP;

비효과:
SELECT * FROM EMP;

4. 최대한 COMMIT 활용
가능하다면 프로그램에서 COMMIT를 최대한 많이 사용하면 프로그램의 성능이 향상되고 수요도 COMMIT가 방출한 자원 때문에 감소할 것이다. COMMIT가 방출한 자원: a. 스크롤 단계에서 데이터를 복구하는 데 사용되는 정보.b. 프로그램 명령문에 의해 잠긴 c. redo log buffer의 공간
레코드 개수 계산하기
일반적인 관점과 반대로count(*)는count(1)보다 조금 빠르다. 물론 색인 검색을 통해 색인 열에 대한 계수가 여전히 가장 빠르다.예를 들어 COUNT(EMPNO)
5. HAVING 자구를 Where 자구로 바꾸기
HAVING 자구를 사용하지 마십시오. HAVING는 모든 기록을 검색한 후에만 결과집을 필터합니다.이 처리는 정렬, 총계 등의 조작이 필요하다.만약 WHERE 자구를 통해 기록의 수를 제한할 수 있다면 이 방면의 비용을 줄일 수 있을 것이다.
예: 비효율:
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’

효율성
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != ‘SYDNEY’
AND REGION != ‘PERTH’
GROUP BY REGION;

HAVING의 조건은 일반적으로 일부 집합 함수, 예를 들어 COUNT () 등에 대한 비교에 사용된다.그 외에 일반적인 조건은 WHERE 자문에 써야 한다.
6. 내부 함수를 통한 SQL 효율성 향상
흔히 볼 수 있는 sql 내장 함수를 사용하면 sql 실행 효율을 효과적으로 높일 수 있으며, 가능한 한 내장된 일반 베이스 정의의 효율을 사용하면 자신이 쓴 것보다 높을 수 있다.
7. 테이블 별칭 사용(Alias)
SQL 문에서 여러 개의 테이블을 연결할 때, 테이블의 별명을 사용하고, 별명을 각각의 Column에 접두사로 붙여 주십시오.이렇게 하면 해석하는 시간을 줄이고 콜럼버스의 잘못된 의미로 인한 문법 오류를 줄일 수 있다.
예를 들면 다음과 같습니다.
SELECT l.LOCN,c.CAT_NO 
FROM LOCATION L , 
CATEGORY C,
EMP E 
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN

8. IN 대신 EXISTS 사용
9.NOT IN 대신 NOT EXISTS 사용
10. EXISTS를 테이블 연결로 교체
일반적으로 표 연결 방식은 EXISTS보다 효율적이다
SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT ‘X’ 
FROM DEPT
WHERE DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A’);

효율성 향상:
SELECT ENAME
FROM DEPT D,EMP E
WHERE E.DEPT_NO = D.DEPT_NO
AND DEPT_CAT = ‘A’ ;

11. 인덱스로 효율 향상
색인은 표의 개념 부분으로 검색 데이터의 효율을 높이는 데 쓰인다.
색인을 사용하면 조회 효율이 향상될 수 있지만, 우리도 그 대가에 주의해야 한다.인덱스는 공간을 저장하고 정기적으로 유지보수해야 하며, 표에 기록된 증감이나 인덱스 열이 수정될 때마다 인덱스 자체도 수정된다.이는 각 기록의 INSERT, DELETE, UPDATE가 4, 5회의 디스크 I/O를 더 지불한다는 것을 의미한다.색인은 추가 저장 공간과 처리를 필요로 하기 때문에, 불필요한 색인은 오히려 조회 반응 시간을 느리게 할 수 있다.
12. 색인 열에서 계산을 사용하지 않기
WHERE 자문에서 색인 열이 함수의 일부일 경우 최적화기는 색인을 사용하지 않고 전체 테이블 스캔을 사용합니다
예:
비효과:
SELECTFROM DEPT
WHERE SAL * 12 > 25000;

효율성:
SELECTFROM DEPT
WHERE SAL > 25000/12;

매우 실용적인 규칙이니 반드시 명심하시오
13. 인덱스 자동 선택
테이블에 둘 이상의 색인이 있는 경우 고유 색인이 있고 다른 고유 색인이 있는 경우 ORACLE은 고유 색인을 사용하지 않고 고유 색인을 완전히 무시합니다. 예를 들어 다음과 같습니다.
SELECT ENAME
FROM EMP
WHERE EMPNO = 2326 
AND DEPTNO = 20 ;

여기에서 EMPNO의 색인만 고유하므로 EMPNO 색인은 레코드 검색에 사용됩니다. TABLE ACCESS BY ROWID ON EMP INDEX UNIQUE SCAN ON EMPNO_IDX
14. 색인 열에서 NOT을 사용하지 않기
일반적으로 우리는 색인 열에서 NOT를 사용하지 않도록 해야 한다. NOT는 색인 열에서 함수를 사용하는 것과 같은 영향을 미칠 수 있다.
15. 사용>=대체>
DEPTNO에 색인이 있으면 효율적입니다.
SELECT *
FROM EMP
WHERE DEPTNO >=4

비효과:
SELECT *
FROM EMP
WHERE DEPTNO >3

양자의 차이점은 전자의 DBMS는 첫 번째 DEPT가 4와 같은 기록으로 바로 이동하고 후자는 먼저 DEPTNO=3의 기록으로 이동하며 첫 번째 DEPT가 3보다 큰 기록을 앞으로 스캔하는 것이다.
16. OR 대신 UNION(인덱스 열)
일반적으로 WHERE 자구의 OR를 UNION으로 대체하면 비교적 좋은 효과를 얻을 수 있습니다.색인 열에 OR를 사용하면 전체 테이블 스캔을 할 수 있습니다.상기 규칙은 여러 색인 열에만 유효합니다.만약 column이 인덱스되지 않았다면, 검색 효율은 OR를 선택하지 않았기 때문에 떨어질 수 있습니다.다음 예에서 LOCID와 REGION에 모두 색인이 만들어져 있습니다.효율성:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”

비효과:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

만약 OR를 사용하겠다고 고집한다면, 가장 적게 기록된 색인열을 맨 앞에 되돌려 써야 한다.
17. OR 대신 IN
비효과:
SELECT.
FROM LOCATION
WHERE LOC_ID = 10
OR LOC_ID = 20
OR LOC_ID = 30

효율성
SELECTFROM LOCATION
WHERE LOC_IN IN (10,20,30);

18. 색인 열에서 IS NULL 및 IS NOT NULL을 사용하지 마십시오.
인덱스에서 빈 열을 사용하지 마십시오.
19. 항상 색인의 첫 번째 열을 사용합니다
만약 인덱스가 여러 열에 세워져 있다면, 첫 번째 열 (leading column) 이where 자문에서 인용될 때만 최적화기가 이 인덱스를 사용할 수 있습니다.
20. UNION-ALL로 UNION 대체(가능하면)
SQL 문장에 UNION 두 개의 조회 결과 집합이 필요할 때, 이 두 결과 집합은 UNION-ALL 방식으로 통합된 다음에 최종 결과를 출력하기 전에 정렬됩니다.UNION ALL로 UNION을 대체하면 정렬이 필요하지 않습니다.이로 인해 효율이 향상될 것이다.
UNION은 결과 컬렉션을 정렬합니다. 이 작업은 SORT 에 사용됩니다.AREA_SIZE 메모리
union: 검색한 결과에 중복된 기록이 있다면 다시 하세요. 영어로는'distinct'unionall라고 합니다. 조건에 맞는 모든 기록을 표시하고 중복도 보류합니다.
21. ORDER BY 자구는 두 가지 엄격한 조건에서만 색인을 사용한다.
ORDER BY의 모든 열은 같은 색인에 포함되어야 하며 색인에서 정렬 순서를 유지해야 합니다.ORDER BY의 모든 열은 비어 있지 않도록 정의해야 합니다.
22. 색인열의 종류를 바꾸는 것을 피한다.
서로 다른 데이터 유형의 데이터를 비교할 때 자동으로 열에 간단한 유형 변환을 한다.EMPNO가 수치 형식의 색인 열이라고 가정하십시오.
SELECTFROM EMP
WHERE EMPNO =123

실제로 ORACLE 유형 변환을 통해 문은 다음과 같이 변환됩니다.
SELECTFROM EMP
WHERE EMPNO = TO_NUMBER(123)

다행히도, 형식 변환은 색인 열에서 일어나지 않았고, 색인의 용도는 바뀌지 않았다.지금 EMP 를 가정하면TYPE는 문자 유형의 색인 열입니다.
SELECTFROM EMP
WHERE EMP_TYPE = 123

이 문은 ORACLE에서 다음과 같이 변환됩니다.
SELECTFROM EMP
WHERE TO_NUMBER(EMP_TYPE)=123

내부에서 발생하는 형식 변환 때문에 이 인덱스는 사용되지 않습니다!ORACLE이 당신의 SQL에 대해 은밀한 유형 변환을 하지 않도록 유형 변환을 현식으로 표현하는 것이 좋습니다.ORACLE은 문자와 수치를 비교할 때 문자 유형을 숫자 유형으로 우선 변환합니다.
23. 조심해야 할 WHERE 자구
일부 SELECT 문의 WHERE 자문은 색인을 사용하지 않습니다.여기에 몇 가지 예가 있다.아래의 예에서'!='색인을 사용하지 않습니다.색인은 테이블에 존재하는 것만 알려줄 뿐, 테이블에 존재하지 않는 것은 알려줄 수 없다는 것을 명심해라. '+'수학 함수입니다.다른 수학 함수들처럼 색인을 사용하지 않았습니다
24. 자원을 소모하는 조작을 피한다
DISTINCT, UNION, MINUS, INTERSECT, ORDER BY가 있는 SQL 문장은 SQL 엔진이 자원을 소모하는 정렬(SORT) 기능을 실행합니다.DISTINCT는 한 번의 정렬 작업을 필요로 하고, 다른 것은 적어도 두 번의 정렬을 실행해야 한다.

좋은 웹페이지 즐겨찾기