DB/SQL 66

소트 수행 과정

메모리 공간 종류 1. 메모리 소트(in memory sort) : 전체 데이터의 정렬 작업을 메모리 내에서 완료하는 것 2. 디스크 소트(to-dist sort) : 할당받은 sort area내에서 정렬을 완료하지 못해 디스크 공간까지 사용하는 경우 과정 [SGA] -> [PGA] -> [temp tablespace] --(merge)--> [PGA] 1. 소트할 대상 집합을 SGA버퍼캐시를 통해 읽어들인다. 2. sort area에서 정렬을 시도한다. 3. 양이 많을 때는 정렬된 중간집합을 temp 태이블스페이스에 임시 세그먼트로 저장한다. 4. 최종 결과집합을 얻기 위해 merge한다

DB/SQL 2022.08.15

인덱스 엑세스 조건, 인덱스 필터 조건

인덱스 엑세스 조건 - 인덱스 스캔 범위를 결정하는 조건절 - 수직적 탐색을 통해 스캔 시작점을 결정하는 데 영향을 미치는 조건절 - 또한 인덱스 리프 블록을 스캔하다가 어디서 멈출지 결정하는데 영향을 미치는 조건절 - 첫번째 범위검색 조건절 이전까지 조건절이 인덱스 엑세스 조건이다 인덱스 필터 조건 - 테이블로 엑세스를 할지 결정하는 조건절 - 첫번째 범위검색 조건절 이후부터가 인덱스 필터 조건이다 그림

DB/SQL 2022.08.11

인덱스 탐색과정

인덱스 탐색과정 - 인덱스 tree가 위와 같고, 조건절이 where c1='B' and c2=3이라고 가정하자 - 루트 블록에서 조건에 맞는건 (B,3)이지만 그 직전 데이터인 (A,3)의 리프블록에서 부터 스캔을 시작 해야 조건에 맞는 모든 데이터를 찾을 수 있다. - 스캔시작구간은 리프블록2의 네번째 데이터(B,3), 종료구간은 리프블록3의 두번째(B,3) - 루트블록속 데이터들의 하위블록들은, 루트블록속 데이터들보다 항상 크거나 같다. - 루트블록속 가장 왼쪽 레코드를 LMC(LeftMost Child)라고 한다.

DB/SQL 2022.08.11

인덱스 손익 분기점

인덱스 손익 분기점이란 - index range scan이 table full scan보다 느려지는 시점 - table full scan은 추출 건수와 상관없이 어차피 테이블을 전체 스캔하는 것이기 때문에 소요 시간이 항상 같다 - index range scan은 추출 건수가 많아짐에 따라 소요시간이 늘어난다.(인덱스 스캔 + 테이블 랜덤 엑세스, 테이블 랜덤엑세스로 인한 시간 소요가 주요원인) - 이때 CF(clustering factor)가 나쁘면 손익분기점이 빨리 오고, 좋으면 손익분기점이 늦게 온다

DB/SQL 2022.08.10

인덱스 스캔 종류

index range scan - 루트 인덱스에서 리프 블록까지 수직적으로 탐색 후 필요한 범위만 스캔하는 것 - 선두 칼럼을 가공하지 않은 상태로 조건절에 사용해야 함(그렇지 않으면 인덱스를 타지 않음) index full scan * 모든 인덱스를 수평적으로 탐색 * table full scan과 비교시 - 테이블면적이 크면 table full scan이 시간이 많이 걸리므로 index full scan이 유리 - 찾는 개수가 많으면 테이블 엑세스가 많아지므로 애초부터 table full scan이 유리 index unique scan - "=" 조건으로 탐색하는 경우에 작동 index skip scan - 다중 조건에서 첫번째 조건으로 skip할 수 있는 구간을 skip하며 찾는것 - 선두 칼..

DB/SQL 2022.08.08

인덱스 수직적 탐색과 수평적 탐색

수직적 탐색과 수평적 탐색 수직적 탐색 - 정렬된 인덱스 레코드 중 조건을 만족하는 첫 번째 레코드를 찾는 과정 - 즉 인덱스 스캔 시작지점을 찾는 과정 - 루트 노드부터 시작해서 아래로 내려온다 수평적 탐색 - 수직적 탐색 후 찾고자 하는 데이터가 더 나타나지 않을 때 까지 인덱스 리프 블록을 수평적으로 스캔 - 인덱스 리프 블록끼리는 서로 앞뒤 블록에 대한 주소값을 갖음 (double linked list 구조) - 인덱스 스킨을 끝낸 후 테이블 스캔을 하기 위해 ROWID를 얻는다.

DB/SQL 2022.08.08

반정규화 기법

계산된 컬럼 추가 - 총 판매액, 평균잔고, 계좌 평가 등을 미리 계산하고, 결과를 특정 칼럼에 추가 테이블 수직 분할 - 하나의 테이블을 두 개 이상의 테이블로 분할하여 새로운 테이블을 만드는 것. 테이블 수평 분할 - 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법 테이블 병합 - 1:1관계의 테이블을 하나의 테이블로 병합하여 성능 향상 - 1:N관계의 테이블을 병합하여 성능을 향상시킨다. - 슈퍼 타입과 서브 타입 관계가 발생하면, 테이블을 통합하여 성능을 향상시킨다 * 슈퍼타입, 서브타입 1. 고객 엔티티(슈퍼타입)는 개인고객(서브타입)과 법인 고객(서브타입)으로 분류 2. 베타적관계는 서브엔티티중 하나만(고객은 개인고객이거나 법인고객 둘중 하나만 될 수 있음), 포괄적 관계는 서브엔..

DB/SQL 2022.02.18

옵티마이저 조인

nested loop 조인 - 하나의 테이블에서 데이터를 먼저 찾고 그 다음 테이블을 조인 - 먼저 조회하는 테이블을 외부 테이블, 그 다음 조회하는 테이블을 내부 테이블이라고 한다. - 외부테이블의 크기가 작은것을 먼저 찾는것이 중요 - random access가 많이 발생하므로 이를 줄여야 성능 향상. Sort merge 조인 - 두 개의 테이블을 sort_area라는 메모리 공간에 모두 로딩하고 sort수행 - 두개의 테이블이 sort가 완료되면 두개의 테이블을 merge - sort가 발생하기 때문에 데이터양이 많아지면 성능이 떨어진다 hash 조인 - 두 개의 테이블 중에서 작은 테이블을 hash 메모리로 로딩하고, 두개의 테이블의 조인키를 사용하여 해시 테이블을 생성 - 해시함수를 사용해서 ..

DB/SQL 2022.02.18

옵티마이저

옵티마이저란? - SQL의 문법적 오류를 확인한다 - SQL의 실행 계획을 수립하고, SQL을 실행하는 데이터베이스 관리 시스템의 소프트웨어 - 가장 빠른 데이터 접근 경로를 작성하고 채택한다. (동일한 결과가 나오는 SQL도 어떻게 실행하느냐에 따라 성능이 달라진다) ex) A 테이블과 B 테이블의 and연산을 할 때 크기가 작은 테이블을 먼저 읽어올 때 속도가 빨라진다. 옵티마이저 특징 - 데이터 딕셔너리에 있는 오브젝트 통계, 시스템 통계 등의 정보를 사용해서 예상되는 비용을 산정한다 - 최저비용을 가지고 있는 계획을 선택해서 SQL을 실행한다. 옵티마이저 실행 계획 - 개발자가 sql실행시 파싱(parsing)을 실행하여 sql의 문법 검사 및 구문분석 수행 - 옵티마이저가 규칙기반 or 비..

DB/SQL 2022.02.18

테이블 파티션의 종류

Range Partition - 값의 범위를 기준으로 여러 개의 파티션으로 데이터를 나누어 저장하는것 - ex) 봉급을 기준으로 200~4000이하인 파티션과, 5000~7000천 이상인 파티션 생성 List Partition - 특정 값을 기준으로 분할하는 방법 - 부서번호가 10번인 파티션과, 20번인 파티션으로 분류 Hash Partition - 데이터베이스 관리시스템이 내부적으로 해시함수를 사용하여 데이터를 분할 - 데이터베이스 관리 시스템이 알아서 분할하고 관리하는것

DB/SQL 2022.02.17

group by 관련함수

ROLLUP - 계층별로 group by를 수행 - rollup 뒤에 컬럼이 두개이상오면, 순서에 따라 결과가 달라짐 - 예시 SELECT DEPTNO,JOB,sum(sal) FROM table GROUP BY ROLLUP(DEPTNO,JOB) - 결과 GROUPING SET - 조합별 group by 쌍을 확인한다. - 예시 SELECT JOB,DEPTNO,count(*) FROM table GROUP BY GROUPING SETS(JOB,DEPTNO) - 결과 CUBE - 조합별, 소계 등 모든 경우의 group by 쌍을 확인한다. - 코드예시 SELECT DEPARTMENT_ID,JOB_ID,SUM(SALARY) FROM table GROUP BY GROUPING CUBE(DEPARTMENT_I..

DB/SQL 2022.02.15