728x90
반응형
SMALL

Data Base/SQL 튜닝 50

Range partition, Hash partition, List partition, Composite partition

■ Range partition 1. 개요 - Oracle 8 버전부터 제공되는 파티션 방법 중 하나. - 데이터의 범위에 따라 파티션을 나누는 방식. - 이력성 데이터 조회에 특히 유리. 2. 주요 특징 1) 8버전 이후 도입: Range 파티션은 Oracle 8 버전부터 처음 도입. 2) 다양한 파티션 키: 여러 컬럼을 파티션 키로 지정 가능하며 최대 16개의 컬럼을 활용 3) maxvalue 파티션: - Range 파티션에서는 범위를 벗어나는 데이터는 maxvalue 파티션에 저장 - 범위가 정의되지 않은 데이터를 수용하는 역할 3. 예시 - 날짜 기준으로 범위를 나누는 경우, 각 날짜 범위에 해당하는 파티션을 생성. - 예시) 연도별로 파티션을 나누어 데이터를 저장하는 경우 등. 4. 활용- 주로..

PARTITION, 수동 파티셔닝(manual partitioning)

■ PARTITION 1. 정의 - 테이블 또는 인덱스를 파티션 단위로 나누어서 저장하는 기술. - 파티션 키에 따라 물리적으로 별도의 세그먼트에 데이터가 저장됨. - 보관 및 관리, 성능 향상 등을 목적으로 사용됨. 2. 특징 및 장점 1) 보관 관리 - 파티셔닝을 통해 테이블을 파티션 단위로 나누면 보관주기가 지난 데이터를 별도로 백업하고 삭제하는 일이 용이해짐. 2) 성능 향상 - 대용량 테이블에서 인덱스를 이용한 데이터 검색이 부담스러울 때, 파티션을 사용하면 파티션 단위로 부분 스캔이 가능해져 성능이 향상될 수 있음. - Full Table Scan이 필요할 때도 일부 파티션만 스캔하여 전체 테이블을 효과적으로 읽을 수 있음. (파티션 가지치기) 3. 파티션 가지치기 (Partition Prun..

통계 수집

#1) 테이블 통계 analyze table employees compute statistics for table; #2) 컬럼 통계 (단, 함부러 수행 하지 않는다.) analyze table employees compute statistics for all columns size 254; analyze table employees compute statistics for columns job_id size 20, department_id size 10; #3) 인덱스 통계 analyze index emp_emp_id_pk compute statistics; #) 통계 수집 -> 라이브러리 캐시 -> 실행계획(hard parsing) 생성-> latch 잡기 -> 겹합 발생 -> 대기발생 #1) 개별_..

join 조건 pushdown, BLOOM FILTER, 조건절 pushdown

■ join 조건 pushdown 1. 정의 - Join 조건 Pushdown은 뷰(View) 쿼리의 조인 조건절을 뷰 쿼리 블록 안으로 내리는 기술을 말합니다. 이는 드라이빙 테이블(Driving Table)에서 읽은 조인 컬럼 값들을 내부(inner) 쪽 뷰 쿼리 블록에서 참조할 수 있도록 하는 것이다. 2. 동작 방식 - 뷰 쿼리에 있는 조인 조건절이 뷰가 아닌 실제 테이블에 조인되도록 변경된다. - 이렇게 변경된 조인 조건절은 드라이빙 테이블의 조인 컬럼 값을 뷰 내부 블록에서 참조할 수 있도록 한다. - 조인 조건 Pushdown은 뷰를 사용하는 쿼리의 성능을 최적화하기 위한 방법 중 하나이다. 3. 특징 1) 성능 향상: Join 조건 Pushdown을 통해 뷰의 조인이 더 효율적으로 처리될 ..

SEMI JOIN, ANTI JOIN

■ SEMI JOIN 1. 정의 - 서브쿼리를 사용하여 조인을 수행하는 방법 중 하나이다. - 메인 쿼리(선행 테이블)의 각 행이 서브쿼리(후행 테이블)와 일치하는지 확인하고, 조건에 맞으면 해당 행을 결과에 추가한다. 서브 쿼리의 모든 일치 행을 찾지 않고, 한 번의 일치만 확인하면 되기 때문에 효율적이다. 2. 동작 방식 - 메인 쿼리의 각 행에 대해 서브쿼리를 실행하여 일치 여부를 확인한다. - 조인 조건에 맞으면 해당 행을 결과에 추가하고, 추가된 행은 더 이상 검색하지 않는다. - 메인 쿼리의 모든 행에 대해 이러한 작업을 반복한다. 3. 특징 1) 일치 여부 확인: 메인 쿼리의 각 행에 대해 서브쿼리의 일치 여부를 확인 2) 조인 종류: 주로 INNER JOIN과 유사한 방식으로 작동하며, O..

Query Transformation, 서브쿼리 처리 방식(in, exists)

■ Query Transformation(=: 쿼리 변환) - optimizer(실행계획을 생성)가 실행계획을 생성하기 전에 사용자가 작성한 SQL문 결과를 동일하나 비용이(cost 값) 더 적게 발생한 것 같으면 쿼리를 변경한다. (in보다는 exists) ■ 서브쿼리 처리 방식(in, exists) 1. filter 방식 메인 쿼리에서 읽히는 row마다 서브쿼리를 반복수행 하면서 조건에 맞는 데이터를 찾는 방식. select /*+ gather_plan_statistics */ * from employees where department_id in (select /*+ no_unnest */ department_id from departments); #) 실행 계획 확인 select * from ta..

pushing subquery, view merging, join 조건 pushdown

■ pushing subquery 1. 정의 - 실행 계획의 초기 단계에서 서브쿼리 필터링을 먼저 처리하여, 다음 수행 단계로 전달되는 행의 수를 줄일 수 있는 기능 - Unnesting되지 않은 서브쿼리의 처리 순서를 제어하여 최적화된 실행 계획을 구성하는 방법 중 하나이다. 2. 힌트 - `push_subq` 힌트는 Oracle Optimizer에게 서브쿼리를 최적화하는 방식을 알려주는 역할이다. - 이 힌트를 사용하면 서브쿼리의 필터링을 가능한 한 빨리 수행하도록 유도하여 효율적인 실행 계획을 생성할 수 있다. 3. 활용 - 서브쿼리가 Unnesting되지 않았을 때, 전체 테이블을 스캔하는 비효율적인 실행 계획을 방지하고자 할 때 Pushing Subquery를 사용한다. - Pushing Sub..

hash join

■ hash join 1. 정의 - 대량의 데이터에 대한 조인 연산에서 효과적으로 사용되는 조인 알고리즘 중 하나. - Nested loop join의 랜덤 액세스 부다과 Sort Merge Join의 정렬 작업 부담을 피하기 위해서 사용됨. 2. 동작원리 - 작은 쪽의 집합을 Build Table로 선택하여 Hash Table 을 생성. - 큰 쪽의 집합을 Probe 하여 Hash Table 을 탐색하여 조인 수행. - Hash Table은 Hash Area Size로 지정된 메모리 영역에 생성. 3. 조인 제약 조건 - Equal(=) 조건만 가능: Hash Join은 등호 조건에서만 사용 가능하며, 일반적으로 등호 조건에서 성능이 가장 좋음. 4. 효과적인 경우 - 작은 집합이 Build Table..

Sort Merge Join

■ Sort Merge Join(정렬 병합 조인) 1. 개념 및 설명 - 조인되는 건수가 많을때 효율적인 조인방법이다. - 대용량 데이터셋 간의 조인에서 사용되며, 정렬 작업에 대한 성능 문제가 발생할 수 있다. 2. 성능 및 힌트 - 조인 대상인 테이블이 크고 조인되는 건수가 많을때 유리하다. - sort에 대한 성능 문제가 있을 수 있으므로, 주의가 필요없다. - 사용가능한 힌트: 'use_merge()', 'leading()' 1) use_merge(): sort merge join 사용 힌트 2) leading(): 조인 집합 중 어느 쪽을 먼저 수행할지에 대한 힌트, 일반적으로 한 쪽 집합을 먼저 수행하는 것이 성능상 이점이 있다. 3. 주의사항 - 조인할 테이블이 대용량이거나 조인 건수가 많을..

join 실행 계획

# test # #) join 중의 data 확인 select /*+ gather_plan_statistics */ e.last_name, e.job_id, d.department_name, l.city from emp e, dept d, loc l where e.department_id = d.department_id and d.location_id = l.location_id and l.city = 'Seattle' and e.job_id = 'AD_VP'; #) 실행 계획 확인 select * from table(dbms_xplan.display_cursor(null, null, 'allstats last')); Id. 9 먼저 드라이빙 해줘야 한다. outer # 해결 방안_인덱스 설정 # #1)..

728x90
반응형
LIST