목록오라클 (59)
정미나닷컴
* 오라클의 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..
Index Range Scan - B*Tree 인덱스의 가장 일반적이고 정상적인 형태의 액세스 방식(수직적 탐색 후 필요한 범위만 수평적 탐색) - 항상 빠른 속도를 보장하진 않음 - 인덱스 스캔 범위를 얼만큼 줄일 수 있느냐, 테이블 액세스 횟수를 얼만큼 줄일 수 있느냐가 관건 => 인덱스 설계와 SQL 튜닝의 핵심 원리 - 인덱스를 구성하는 선두 컬럼이 조건절에 사용되어야 함 Index Full Scan - 수직적 탐색없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방식 - 최적의 인덱스가 없을 때 차선책(인덱스 선두 컬럼이 조건절에 없을 경우) - 최종 결과값이 적을때 Table Full Scan보다 Index Full Scan이 훨씬 효율적 Index Unique Scan - 수직적 ..
쿼리의 조건절에 인덱스 선두 컬럼이 사용된 경우(인덱스가 B*Tree 형태일 때)옵티마이저는 인덱스의 Root부터 탐색을 시작해 Branch를 거쳐 원하는 레코드 키값이 존재하는 Leaf 까지 도달한다. 이 때 Root -> Branch -> Leaf 에 도달하는 과정(Leaf node의 시작점을 찾는 과정)을 수직적 탐색,Leaf node의 시작점에서부터 원하는 범위까지를 scan하는 과정(인덱스는 정렬 상태이므로)을 수평적 탐색,수평적 탐색을 통해 get한 RowID를 이용해 궁극적으로 원하는 데이터가 있는(Select 절에 명시된 컬럼 데이터) 테이블까지 도달하는 과정을 Table Random Access라고 한다. 하지만 주의해야 할 점은 조건절에 인덱스 컬럼을 사용한다고 해서 무조건 인덱스 활용..