쿼리 성능이 나오지 않을때, 기본적으로 확인할 수 있는 쿼리 개선방법이다.
1. INNER, OUTER JOIN 있을 때 무조건 OUTER JOIN을 마지막에 걸기
2. 쿼리에서 데이터를 SELECT 해올 필요가 없는데 불필요한 조인 하는 경우 제거
SELECT A.COLMN1, B.COLMN2
FROM TABLE_A A INNER JOIN TABLE_B B ON A.COLMN1 = B.COLMN1
INNER JOIN TABLE_C C ON A.COLMN2 = C.COLMN2
-- TABLE_C 의 데이터는 안가져오므로 불필요한 조인.이를 제거해야함.
3. 3개이상 테이블 조인할때, 테이블 작은 순서로 조인하기
4. 실행계획 확인하기
(1) Oracle의 경우, DBeaver 에서 Ctrl + Shift + E 로 실행계획보기를 할 수 있음. MSSQL 은 SSMS 설치해야함.
(2) 실행계획에서 FULL 이 나오지 않더라도 인덱스 타지 않는 것들이 있음. 인덱스를 타게 만들어줘야 함.
인덱스 타면 실행계획에서 INDEX (UNIQUE SCAN) , TABLE INDEX (BY INDEX ROWID) 이런식으로 나옴.
(3) NESTED LOOP 없앨수 있나 확인
5. 인덱스 타는지 확인할 때는 JOIN 된 테이블의 JOIN 조건들이 인덱스로 생성되어있는지 확인하는 것.
CREATE INDEX IDX_A01
ON TABLE_A(COLMN1, COLMN2. COLMN3);
SELECT A.*, B.*
FROM TABLE_A A INNER JOIN TABLE_B B
ON A.COLMN1 = B.COLMN1
AND A.COLMN2 = B.COLMN2
WHERE A.COLMN1 = 'EXAMPLE';
인덱스의 작동 방식을 알고 있어야 함. 예를 들어, 인덱스가 A, B, C 컬럼으로 정의되어 있다면, 조인 조건이나 검색 조건에 A와 B 컬럼이 포함되어 있으면 인덱스를 사용할 수 있음. ※ 인덱스는 왼쪽부터 순서대로 사용되기 때문에, A 컬럼 조건이 포함되지 않고 B, C 컬럼만 조건에 포함된 경우 인덱스를 사용할 수 없음. ※ 조인 조건에서 A, B 컬럼이 사용되었다면 인덱스의 선행 컬럼을 잘 따르고 있기 때문에 인덱스를 사용함.
6. 인덱스 무조건 많은게 좋은게 아님.
인덱스가 너무 많을 경우에 INSERT, DELETE, UPDATE 가 느려짐.
7. 필수 준비물
(1) DBeaver > Window > Show View > 쿼리 관리자
(2) DBeaver > SQL편집기 > 실행계획 보기
'Dev > Database' 카테고리의 다른 글
[DB/MSSQL] 열 이름이 불확실합니다, jdbc SQLServerException (0) | 2024.06.13 |
---|---|
[DB/MSSQL] INSERT INTO SELECT 일부만, 일부만 INSERT INTO SELECT (0) | 2024.06.12 |
[Oracle] Oracle 19c 삭제, 오라클19c 삭제하는법, 오라클 삭제, Oracle 삭제 (0) | 2024.06.10 |
[Oracle] 캐시를 사용하지 않고 실행되게 하는법, Oracle NO CACHE, 캐시 옵션끄기, 캐시 사용안하기 (1) | 2024.06.04 |
[Oracle] Oracle 19c 설치하는 법, 오라클 설치 (0) | 2024.05.31 |