- 반복 수행되는 엑세스는 자신의 수행속도에 반복횟수를 곱한 만큼의 부하를 가져오므로 수행속도에 미치는 영향이 아주 크다.
- Nested Loop Join, Sub-Query, Fetch후 루프 내에서 반복되는 쿼리
- 테이블에는 아주 양호한 분포도를 가진 컬럼이 있기 마련이다.
- 인덱스 컬럼 순서를 정할 때등 여러 경우에서 크게 활용될수 있음
- 인덱스는 넓은 범위를 처리하게 될 때 많은 부담을 주게 된다.
- 전체 범위 처리 시, 넓은 범위 처리는 인덱스 사용 때 수행속도가 좋지 않을 수 있음.
- 처리 범위의 최대 크기와 평균 예상 범위, 자주 사용되는 정렬의 순서, 처리 유형을 수집하면 유용한 자료가 될 것임
- 빈번하게 사용된다는 것은 시스템 전반에 미치는 영향이 그 만큼 크기 때문에 아주 중요하다.
- 업무적인 측면에서 각 컬럼들간의 상호관계를 잘 파악해 보면 특정 컬럼들끼리 자주 조합하여 사용되는 경합형태를 찾을 수 있다.
- 중심이 되는 컬럼을 찾아 이와 연관되는 컬럼들을 검토
- End User는 조건의 범위는 넓게 부여하면서 최근의 데이터만 보려고 하는 경우가 많음. 빠른 응답까지 요구함
- 통계자료를 추출하는 경우는 대개 범위가 넓다.
- 넓은 범위 처리가 대부분 임. 클러스터나 잘 조합된 결합 인덱스 이용하는 것이 좋음.
시점: Test 단계 또는 정상 가동 중인 시스템의 인덱스 교정 시점
- 기능: 어플리케이션을 분석하여 SQL 문장을 Repository 에 저장. 손쉽게 SQL 문장을 가져올 수 있음.
- 한계: 동적 SQL 과 같은 쿼리는 가져오는데 한계가 있으며, 수행 횟수와 같은 자세한 사항은 알 수 없음
- 기능: 전체 커다란 trace 결과에 대해 하나의 상세한 레포트도 얻을 수 있으며 상용 SW에 따라 Advice 역할 까지 해주기도 함.
- 한계: 시스템에 큰 부하를 줌. 그러므로 trace 기간은 제한 되어야 하며 그 기간내의 분석 밖에 행할수 없음
- 기능: 서버에 부담을 덜 주므로 장기간 수집하는 것이 가능하다.
- 단점: trace에 비해 정보가 빈약하다.
어떤 어플리케이션에서 수행되었는지와 같은 장기간 수집을 하더라도 여전히 모든 SQL 구문 수집하는 것이 어렵다.
- 유사한 형태의 SQL들이 정렬되도록 출력
- SQL문장 별로 정렬하는 것 보다 조건절에 사용된 컬럼별로 정렬하는 것이 보다 유리
-대량의 동일 컬럼값을 가진 로우들을 하나의 클러스터에 저장하여 클러스터링 팩터를 향상
-오로지 검색의 속도향상을 위한 클러스터링이므로 대량의 트랜잭션처리되는 경우는 부하발생
-SALE_DEPT + SALEDATE
- TAB3, TAB4는 대용량의 데이터를 가짐
- TAB3 는 매우 빈번하기 COL3의 대량을 처리범위에서 TAB2와 TAB1을 조인
- TAB4 는 COL4로 자주 넓은 범위를 처리
- TAB1 + TAB2 + TAB3
- TAB1 + TAB2(COL1)
- CLUSTER(TAB3)
- (8000-100)*0.9=7110
- 평균로우 길이 100바이트로 가정
SELECT AVG( CASE WHEN row_cnt > 71 THEN 71 ELSE row_cnt END) average_row_count FROM ( SELECT cluster_key_columns, count(*) row_cnt FROM table_name WHERE sampling_conditions.... GROUP BY cluster_key_columns );
- AVG_ROW_LEN * average_row_count
- 7110/2000 =3.5
- 블록에 3개까지 단위클러스터가 존재.
CREATE CLUSTER sales_cluster (sale_date varchar2(8)) STORAGE ( storage_clause……) PCTFREE 10 PCTUSED 60 SIZE 2000;
CREATE INDEX sales_cluster_idx ON CLUSTER sales_cluster PCTFREE 2 STORAGE (INITIAL 20K NEXT 10K);
RENAME sales TO sales_copy ;
CREATE TABLE sales ( saleno varchar2(6) not null, sale_dept char(4), sale_date varchar2(8) not null, …………………………………………………………… ) CLUSTER sales_cluster (sale_date) ;
INSERT INTO sales SELECT * FROM sales_copy WHERE sale_date >= '20010101';
DROP TABLE sales_copy ; CREATE INDEX …………………………………………………;
SELECT SUM(count(*)) FROM sales WHERE sale_date between ‘20051201’ and ‘20051225’ AND sael_dept = ‘11200
SELECT /*+ CLUSTER(sales) */ SUM(count(*)) FROM sales WHERE sale_date between ‘20051201’ and ‘20051225’ AND sael_dept = ‘11200’