목록원리와 해법 (36)
정미나닷컴
인덱스 설계 전략- 조건절에 항상 사용되거나, 자주 등장하는 컬럼들을 선정- '=' 조건으로 자주 조회되는 컬럼들을 앞쪽에 위치 -- 총 고객수 100만 명, 상품은 10만 개, 거래일자의 검색범위는 유동적인 테이블 [검색조건 1] WHERE 고객번호 = '0000001' AND 거래일자 BETWEEN '20150101' AND '20171001'; [검색조건 2] WHERE 상품번호 = '1' AND 거래일자 BETWEEN '20150101' AND '20171001'; [검색조건 3] WHERE 고객번호 = '0000001' AND 상품번호 = '1' AND 거래일자 BETWEEN '20150101' AND '20171001'; [검색조건 4] WHERE 거래일자 BETWEEN '20150101' A..
Bitmap Index (비트맵 인덱스) - Key 값에 중복이 없고, Key 값 별로 하나의 비트맵 레코드를 가짐 - 비트맵 상의 각 비트가 하나의 테이블 레코드와 매핑 row#0( 8001) flag: ------, lock: 0, len=35 col 0; len 2; (4): 42 4c 55 45 → 키 값 : BLUE col 1; len 6; (6): 01 00 9f 4c 00 00 → 시작 RowID col 2; len 6; (6): 01 01 a4 03 01 47 → 종료 RowID col 3; len 15; (15): 00 c1 ae bb fa 02 c1 a1 10 c1 94 19 c2 dc 07 → 비트맵- 시작 RowID와 종료 RowID만 갖고 있다가 테이블 액세스가 필요할 때면 각 비..
* 오라클의 B*Tree Index는 Unbalanced 상태에 놓일 일은 없지만 Index Fragmentation에 의한 Index Skew 또는 Sparse 현상으로 인덱스 스캔 효율이 저하될 수 있음 ☑ [Oracle] 오라클 인덱스 구조 - B*Tree Index 자세히 보기 Index Skew - 인덱스 엔트리가 왼쪽 또는 오른쪽에 치우치는 현상DELETE FROM T WHERE NO
인덱스 스캔 효율 - Sequential access의 선택도 향상을 위한 방법 ☑ [Oracle] 오라클 인덱스 스캔 방식 보러가기 [인] 인덱스 매칭도 - Sequential access의 효율은 선택도에 의해 결정 (같은 결과 건수를 내는데 얼마나 적은 레코드를 읽느냐) - 인덱스 컬럼이 조건절에 모두 '=' 조건으로 사용될 때 선택도가 가장 높음 - Leaf Block을 scan하면서 읽은 레코드가 모두 테이블 access -> 비효율X - 인덱스 컬럼 중 일부가 조건절에 생략되거나 '=' 조건이 아니더라도 그것이 뒤쪽 컬럼일 때 비효율X - 인덱스 선행 컬럼이 조건절에 누락되거나 between, 부등호, like 같은 범위검색 조건이면 비효율 발생 [비:B.I.] BETWEEN 조건을 IN-LI..
IOT (Index-Organized Table)- Table Random Access가 발생하지 않도록 처음부터 인덱스 구조로 생성된 테이블- Index leaf block = data block (모든 행 데이터를 리프 블록에 저장)- 정렬상태를 유지하며 데이터를 삽입(PK 컬럼 순)CREATE TABLE INDEX_ORG_T ( A NUMBER PRIMARY KEY, B VARCHAR(10) )ORGANIZATION INDEX; -- 일반적으로 사용되는 테이블은 '힙 구조 테이블'로 ORGANIZATION HEAP; 이 생략되어 있는 것 장점- 클러스터링 팩터가 좋음- Random이 아닌 Sequential Access 방식이므로 넓은 범위 access 시 유리- PK 인덱스를 위한 별도의 세그먼트..
기본 메커니즘 - 둘 중 작은 집합(Build Input)을 읽어 Hash Area에 해시 테이블을 생성하고, 반대쪽 큰 집합(Probe Input)을 읽어 해시 테이블을 탐색하면서 JOIN하는 방식 - 해시 테이블을 생성할 때나 탐색할 때 모두 해시 함수 사용- JOIN 과정에서 발생하는 Random 액세스 부하가 없음 (각각의 집합을 읽는 과정에서는 Random 액세스 발생 가능)- 해시 테이블을 생성하는 비용이 수반되므로 Build Input이 충분히 작아야 효율적* Hash Area는 PGA 메모리에 할당되는데 Build Input이 hash_area_size를 초과하게 되면 디스크 I/O가 추가로 발생하게되므로 성능이 많이 저하됨 declare l_bucket number;beginfor out..
기본 메커니즘 - Sort (양쪽 집합을 JOIN 컬럼 기준으로 정렬) → Merge (정렬된 양쪽 집합을 서로 Merge) SELECT /* ordered use_merge(d) */ E.EMP_NO, E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE D.DEPT_NO = E.DEPT_NO; ▼begin for outer in (SELECT DEPT_NO, EMP_NO, RPAD(ENAME, 10) ENAME FROM SORTED_EMP) loop -- outer loop for inner in (SELECT DNAME FROM SORTED_DEPT WHERE DEPT_NO = outer.DEPT_NO) loop -- inner loop dbms_output.put_line(o..
기본 메커니즘 for(i=0; i= 1500 --- ④ORDER BY SAL DESC; Answer :: ② -> ③ -> ① -> ④ * pk_dept : dept.dept_no* dept_loc_idx : dept.loc* pk_emp : emp.emp_no* emp_deptno_idx : emp.dept_no* emp_sal_idx : emp.sal Execution Plan ------------------------------------------------------------------------------0 SELECT STATEMENT1 0 SORT ORDER BY2 1 NESTED LOOPS3 2 TABLE ACCESS BY INDEX ROWID DEPT4 3 IND..