Data/SQLP

· Data/SQLP
스칼라 서브 쿼리스칼라 서브 쿼리의 캐싱 효과스칼라 서브 쿼리를 사용하면 내부적으로 캐시를 생성하고, 여기에 서브 쿼리에 대한 입력 값과 출력 값을 저장한다.메인 쿼리로부터 같은 입력 값이 들어오면 서브쿼리를 실행하는 대신 캐시된 출력값을 리턴한다.스칼라 서브 쿼리를 수행할 때 빠르게 입,출력 값을 찾기 위해 해싱 알고리즘을 사용하며, 입력 값의 카티널리티가 높을수록 효과가 좋다.고급 조인 기법부등호 조인과 Between 조인은 생략함1. 인라인 뷰 활용요약해서 말하면 필터링 할 것을 미리 걸러주고 목적을 수행하면 된다는 것이다.아래는 집계함수 사용시 인라인 뷰 사용 전과 후 예시이다,사용 전select min(t2.상품명) 상품명, sum(t1.판매수량) 판매수량, sum(t1.판매금액) 판매금..
· Data/SQLP
1. 기본 메커니즘Hash 조인은 NL 조인이나 소트 머지 조인이 효과적이 못한 상황을 해결하기 위한 방식이다.아래는 Oracle의 실행 계획이다.select /*+ ordered use_hash(e) */ d.deptno, d.dname, e.empno, e.ename from dept d, emp e where d.deptno = e.deptno Execution Plan ------------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=654 Bytes=35K) 1 0 HASH JOIN (Cost=5 Card=654 Bytes=35K) 2 1 TABLE ..
· Data/SQLP
두 테이블 각각 정렬한 다음에 두 집합을 머지하면서 조인을 수행한다. 만약 조인 컬럼에 인덱스가 있으면소트 단계를 거치지 않고 곧바로 조인할 수도 있다.Oracle은 조인 연산자가 부등호, 조인 조건이 없어도 소트 머지 조인이 실행하지만, SQL Server는 = 일때만 동작1. 기본 메커니즘쿼리 예제 및 실행계획SELECT /*+ ORDERED USE_MERGE(E) */ D.DEPTNO, D.DNAME, E.EMPNO, E.ENAMEFROM DEPT D, EMP EWHERE D.DEPTNO = E.DEPTNOExecution Plan ------------------------------------------------------------- 0 SELECT STATEMENT Optimizer..
· Data/SQLP
기본 메커니즘일반적인 프로그래밍의 루프문과 동일하게 동작한다.힌트로 조인 순서도 정할 수 있다.SELECT /*+ ORDERED USE_NL(D) */ E.EMPNO, E.ENAME, D.DNAMEFROM EMP E, DEPT DWHERE D.DEPTNO = E.DEPTNOSELECT /*+ LEADING(E) USE_NL(D) */ E.EMPNO, E.ENAME, D.DNAMEFROM DEPT D, EMP EWHERE D.DEPTNO = E.DEPTNONL 조인 수행 과정 분석아래 조인문에서 조건절 비교 순서가 어떻게 되는지 분석해보자SELECT /*+ ORDERED USE_NL(E) */ E.EMPNO, E.ENAME, D.DNAME, E.JOB, E.SALFROM DEPT D, E..
· Data/SQLP
R.A 발생량을 줄인다.S.A에 의한 선택 비중을 높인다.1. 인덱스 선행 컬럼이 범위 조건일 때의 비효율기본적으로 인덱스 구성 컬럼이 조건절에서 모두 = 조건으로 비교되면 리프블록을 스캔하면 읽은 레코드가 버릴 게 하나 없이 최상이다.인덱스 컬럼 중 일부가 = 조건이 아니더라도 그 것이 뒤쪽일 경우 비효율의 가능성이 낮다.예를 들어 [아파트시세코드 + 평형 + 평형타입 + 인터넷매물] 이라는 인덱스가 있다고 가정할 때 아래와 같이 맨 끝이 범위 조건이라도 인덱스 비효율이 발생하지 않는다.WHERE 아파트시세코드 =:a AND 평형 = :b AND 평형타입 between :c and :d근데 만약 선행 컬럼이 조건절에 누락되거나, between, 부등호, like 같은 것이 있으면 비효율이 발생한다.좀 ..
· Data/SQLP
인덱스 컬럼 추가아래와 쿼리를 조회할 때 PK 이외에 [deptno +job] 순으로 구성된 emp_x01 인덱스 하남나 있는 상태에서 다음 쿼리를 수행하려고 한다. 만족하는 조건이 1개인데 6개의 R.A가 발생했다.SELECT /*+ INDEX(EMP EMP_X01) */ ename, job, salFROM EMPWHERE DEPTNO = 30AND SAL >= 2000[deptno + sal] 순으로 바꿔주면 좋겠지만 실 운영에서는 인덱스를 함부로 바꾸기 쉽지 않다. 어딘가에서는 해당 인덱스를 쓸 수 있기 때문이다.아래와 같이 인덱스 컬럼 조합을 [depthno + job + sal] 로 바꿔주면 큰 효과가 있다. 인덱스 스캔량은 줄지 않았지만,R.A가 줄었다. 늘 말하지만 R.A를 최소화하는 것이 ..
· Data/SQLP
쿼리에서 참조되는 컬럼이 인덱스에 모두 포함되는 경우가 아니라면, Random Access 가 일어난다.실행 계획에서는 Table Access By ROWID 라고 표시된다.------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 52 | 2 (0)| | 1 | TABL..
· Data/SQLP
인덱스 기본 원리에서 설명했듯이, B-Tree 인덱스를 정상적으로 사용하려면 범위 스캔 시작지점을 찾기 위해 루트 블록부터 리프 블록까지의 수직적 탐색 과정을 거쳐야 한다. 만약 인덱스 선두 컬럼이 조건절에 사용되지 않으면, 범위 스캔을 위한 시작점을 찾을 수 없어 옵티마이저는 인덱스 전체를 스캔하거나 테이블 전체를 스캔한다.인덱스 선두 컬럼이 조건절에 사용되더라도 범위 스캔이 불가능하거나 인덱스를 아예 사용 못하는 경우가 있다.1. 범위 스캔이 불가능하거나 인덱스 사용이 불가능한 경우아래의 3가지 경우는 인덱스 범위 스캔이 불가능하지 Index Full Scan은 사용가능하다. 컬럼을 가공할 때SELECT *FROM 업체WHERE substr(업체명, 1, 2) = '대한'부정형 비교를 사용할 때SEL..
· Data/SQLP
1. B-Tree 인덱스아래는 Index Fragmentation에 관한 개념이다.Unblanced Index 위 그림 처럼 delete 작업 때문에 인덱스가 불균형 상태에 놓일 수 있다.즉 다른 리프 노드에 비해 루트 블록과의 거리가 더 멀거나 가까운 리프 노드가 생길 수 있다는 것인데, B-Tree 에서는 발생하지 않는다.B-Tree의 B는 Balanced의 약자로서 인덱스 루트에서 리프 블록까지 어떤 값을 탐색하더라도 읽는 블록 수가 같음을 의미한다.Index Skew인덱스 엔트리가 왼쪽 또는 오른쪽으로 치우는 치는 현상대량의 `delete`작업을 마치고 나면 위의 이미지와 같이 발생한다고 한다.Oracle의 경우 텅 빈 인덱스 블록을 커밋하는 순간 freelist로 반환되지만 인덱스 구조 상에는 ..
· Data/SQLP
3.1.1, 3.1.2 (P541~551)인덱스 구조가. 인덱스 기본 구조가장 일반적으로 사용되는 B-Tree 구조출처: https://bhupeshpadiyar.medium.com/oracle-indexes-and-types-of-indexes-in-oracle-with-example-3c407727a943예시한 인덱스 칼럼은 양의 정수만 저장할 수 있는 데이터 타입이라고 가정하고 그린 것B-tree 인덱스는 맨 위쪽 루트 블록에서부터 브랜치를 거쳐 맨 아래 리프 블록까지 연결되는 구조루트 블록에서 리프 블록까지 거리를 깊이 라고 함루트 블록과 브랜치 블록은 각 하위 노들의 데이터 값 범위를 나타내는 키 값과 그 키 값에 해당하는 블록을 찾는데 필요한 주소 정보를 가짐리프 블록은 인덱스 키 값과 그 키..
cozyong_dev
'Data/SQLP' 카테고리의 글 목록 (2 Page)