728x90
반응형
2024.08.02 - [개발/ORACLE] - Oracle 튜닝 - 실행 계획
Oracle 튜닝 - 실행 계획
2024.05.02 - [개발/ORACLE] - Oracle 에서 explain plan 쿼리 계획 Oracle 에서 explain plan 쿼리 계획Mysql에서 쿼리 튜닝을 위해 혹은 인덱스를 걸기 위해 자주 사용했던 explain.Oracle에서는 문법이 다른데 어떻게
joolog.tistory.com
정렬 및 중복 제거
- SORT ORDER BY
- ORDER BY 구문에 의해 결과 집합을 정렬하는 단계.
- 쿼리의 결과를 사용자 지정 순서대로 정렬한다.
- 정렬 작업은 대개 메모리에서 수행되지만, 메모리가 부족할 경우 디스크를 사용한다.
SELECT name
FROM employees
ORDER BY salary DESC;
- SORT UNIQUE
- 선택된 결과 집합에서 중복된 레코드를 제거하는 작업을 수행.
- UNION 연산자나 DISTINCT 연산자와 같이 중복을 제거해야 할 때 발생.
- 정렬과 중복 제거가 필요할 때 사용
SELECT DISTINCT department_id
FROM employees;
해시 기반 오퍼레이션
- HASH GROUP BY
- GROUP BY 구문에 의해 결과를 그룹화할 때 사용하는 방식.
- 해시 함수를 사용하여 각 행을 해시 테이블에 매핑하여 동일한 값의 그룹을 찾음.
- 대량의 데이터를 효율적으로 그룹화하는 데 유용.
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id;
- HASH UNIQUE
- 해시 함수를 사용하여 중복된 레코드를 제거하는 단계.
- 대규모 데이터 세트에서 중복을 효과적으로 제거하는 데 유리.
SELECT DISTINCT name
FROM employees;
조인 연산
- MERGE JOIN CARTESIAN
- 두 테이블 간에 조인 키 없이 모든 가능한 조합을 생성하는 카테시안 조인이 발생할 때 나타남.
- 보통 조인 조건이 없거나 최적화되지 않았을 때 발생하며, 성능상 좋지 않을 수 있다.
SELECT *
FROM employees, departments;
- NESTED LOOPS
- 중첩 반복문 방식으로 조인을 수행하는 단계.
- 한 테이블의 각 행에 대해 다른 테이블을 검색.
- 작은 데이터 집합이나 효율적인 인덱스를 사용할 경우 성능이 좋다.
SELECT e.name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;
인덱스 관련 스캔
- INDEX RANGE SCAN
- 인덱스의 범위를 스캔하여 조건에 맞는 레코드를 찾는다.
- 인덱스가 정렬되어 있기 때문에 범위 검색이 효과적.
SELECT * FROM employees
WHERE salary BETWEEN 30000 AND 50000;
- INDEX UNIQUE SCAN
- 유니크 인덱스를 통해 단일 행을 검색하는 단계.
- 유니크 인덱스는 항상 고유한 값을 가지므로 단일 값을 정확히 찾을 때 사용.
SELECT * FROM employees
WHERE employee_id = 123;
- TABLE ACCESS BY INDEX ROWID
- 인덱스를 사용하여 찾은 ROWID로 테이블의 데이터를 직접 조회하는 단계.
- 인덱스를 사용하여 테이블의 특정 행에 빠르게 접근할 수 있다.
버퍼 및 행 관련 오퍼레이션
- BUFFER SORT
- 데이터베이스 버퍼 캐시에 후보 행들을 정렬하는 작업.
- 메모리에서 정렬을 수행하여 빠른 접근을 가능하게 한다.
SELECT *
FROM employees
ORDER BY hire_date;
- FIRST ROW
- 쿼리에서 첫 번째 행만을 읽어오고자 할 때 사용.
- 보통 최대값이나 최솟값과 같은 특정 조건을 만족하는 단일 행을 찾는 경우에 발생.
SELECT *
FROM employees
ORDER BY salary DESC FETCH FIRST 1 ROW ONLY;
기타
- INDEX RANGE SCAN (MIN/MAX)
- 인덱스가 항상 정렬된 상태를 유지하는 것을 이용하여
최솟값 또는 최댓값을 빠르게 추출하는 스캔 방식.
- 인덱스가 항상 정렬된 상태를 유지하는 것을 이용하여
SELECT MIN(salary)
FROM employees;
- SORT AGGREGATE
- 집계 함수 (SUM, AVG, COUNT 등)를 사용하여 전체 행의 합계 등을 구한 후 정렬하는 작업.
- 보통 집계 결과를 정렬해야 할 때 사용.
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id
ORDER BY SUM(salary);
- TABLE ACCESS FULL
- 테이블의 모든 행을 읽는 풀 테이블 스캔.
- 인덱스가 없거나 사용할 수 없는 경우에 주로 발생하며,
대량의 데이터를 처리할 때 성능에 영향을 줄 수 있다.
SELECT *
FROM employees;
- WINDOW SORT PUSHED RANK
- 윈도우 함수 (예: RANK, DENSE_RANK, ROW_NUMBER)를 사용하면서,
계산 결과를 정렬된 상태로 유지하는 작업. - 윈도우 함수의 특성상 특정 정렬 기준에 따라 계산된 결과를 필요로 할 때 사용.
- 윈도우 함수 (예: RANK, DENSE_RANK, ROW_NUMBER)를 사용하면서,
SELECT name, RANK() OVER (ORDER BY salary DESC)
FROM employees;
728x90
반응형
'개발 > ORACLE' 카테고리의 다른 글
Oracle 힌트절 (1) | 2024.11.07 |
---|---|
Oracle 인덱스 (0) | 2024.08.16 |
Oracle 튜닝 - 실행 계획 (0) | 2024.08.02 |
Oracle From 절에 2개 이상의 테이블 JOIN, (+) (0) | 2024.05.22 |
Oracle install 19c (0) | 2024.05.16 |