본문 바로가기

Oracle DB

(36)
고급 SQL 활용 / DML 튜닝 고급 SQL 활용 (1) CASE문 활용 - 여러 번 테이블을 ACCESS하는 경우 CASE문을 활용하여 1번만 액세스 EX) NVL( SUM (CASE WHEN COLUMN = VALUE THEN COLUMN END), 0 ) (2) UNION ALL을 활용한 M:M 관계의 조인 - FULL OUTER JOIN을 대체할 용도로 UNION ALL 활용 가능 -> FULL OUTER JOIN을 할 경우 테이블을 각각 2회씩 ACCESS, UNION ALL 1번 (4) 페이징 처리 (5) WINDOW 함수 활용 (6) WITH 구문 활용 - 자주 쓰는 SELECT FROM 절일 경우 WITH 구문을 통해 한번 선언하고 테이블처럼 어디에서나 이용 가능하게 활용 가능하다. DML 튜닝 (1) 인덱스 유지 비용 ..
소트 튜닝 (1) 소트와 성능 가) 메모리 소트 / 디스크 소트 - 메모리 소트 : 정렬작업을 메모리 내에서. INTERNAL (OPTIMAL) SORT라고도 함 - 디스크 소트 : 메모리 내에서 못하여 디스크 공간까지 사용. 느림. EXTERNAL SORT - PGA -> CGA / UGA - CGA : CALL이 진행되는 동안만 필요한 정보 저장 (PRIVATE 변수) - UGA : CALL을 넘어 다음 CALL 까지 계속 참조되는 정보 저장 (PUBLIC 변수) - DML 문장, SELECT 문장 중 한 단계 앞선 단계의 정렬은 CGA - SELECT 문장 중 가장 마지막 단계에서 정렬된 데이터는 UGA 나) 소트를 발생시키는 오퍼레이션 (1) SORT AGGREGATE : AGGRREGATE 함수 사용시 발..
쿼리 변환 1. 쿼리 변환이란? - 휴리스틱 쿼리 변환 : 결과만 보장된다면 무조건 쿼리 변환 수행. 일종의 RBO. 경험적으로 항상 더 나은 성능을 보일 것이라는 옵티마이저 개발팀의 판단 반영 - 비용 기반 쿼리 변환 : 변환된 쿼리의 비용이 더 낮을 때 사용하며 낮이 않을 경우 원본 쿼리를 이용해 최적화 한다. 2. 서브쿼리 UNNESTING - NESSTED 서브쿼리는 메인 쿼리와 부모 자식이라는 종속적이고 계층적인 관계이며 논리적인 관점에서 그 처리과정은 IN, EXISTS를 불문하고 NL 조인과 비슷한 필터 방식을 이용하며 이 방식이 항상 최적의 수행 속도를 보장 못함 - 옵티마이저는 동일한 결과를 보장하는 조인문으로 변환 후 최적화하는 서브쿼리 UNNESTING 혹은 원본 쿼리를 이용해 최적화하여 서브쿼..
서브쿼리 / 집합연산 / Join - Using , On, Outer Join 1. 집계 함수 (Aggregation Fuction) - NULL값은 집계 함수 연산 참여 X - NULL + 숫자 = NULL 2. Sub-Query - 연관 서브쿼리 : 서브쿼리에 메인쿼리 칼럼 보유. 메인쿼리가 먼저 수행 후 조건 확인 - 비연관 서브쿼리 : 서브쿼리에 메인쿼리 칼럼 미 보유. 서브쿼리 먼저 수행 후 메인에 결과 값을 제공. - 단일 행 서브쿼리 : 서브쿼리 결과 값이 항상 1건 이하. 단일 행 비교 연산자와 함께 사용 - 다중 행 서브쿼리 : 서브쿼리 결과 값이 여러 건. 다중 행 비교 연산자와 함께 사용 ex) IN - 다중 칼럼 서브쿼리 : 반환하는 칼럼이 2개 이상인 경우 -> SQL SERVER 불가! 3. 집합 연산자 - UNION ALL : 합집합, 중복 허용 - UN..
계층쿼리 / 선분이력 끊기 / 데이터 복제를 통한 소계 1. 계층 쿼리 - START WITH : 시작 점 지정 - CONNECT BY ~ PRIOR ~ : 진행 경로 설정 - ORDER SIBLINGS BY : 같은 레벨별 정렬 기준 - LEVEL : 루트부터 각 레벨 별 1씩 증가 - CONNECT_BY_ISLEAF : LEAF = 1, NON LEAF = 0 - CONNECT_BY_ROOT : 루트 데이터 출력 - CONNECT_BY_PATH : 전체 경로 표시 *CONNECT BY 절에서 Column 나온다면 연결된(하위혹은 상위) 데이터 비출력 *WHERE 절에서 Column 나온다면 그 관련 데이터만 비출력 2. 선분이력 끊기 - 월말 기준으로 선분을 끊는 경우 Select greatest (a.시작일자, b.시작일자) 시작일자, least (a...
윈도우 함수 함수 구분 함수 설명 비고 순위 RANK 순위 1,2,2,4,5 DENSE_RANK 동일 순위를 1건으로 1,2,2,3,4 ROW_NUMBER 동일 순위 미 인정 1,2,3,4,5 집계 SUM, MAX, MIN, AVG, COUNT 합계, 최대, 최소, 평균, 건수 행 순서 FIRST_VALUE, LAST_VALUE 파티션 내 첫 번쨰, 최종 값 LAG, LEAD 이전 레코드, 이후 레코드 값 비율 CUME_DIST 파티션 내 데이터 값에 대한 누적 비율 결과 값 0~1 사이 PERCENT_RANK 파티션 내의 row 개수에 대한 누적 비율 RATIO_TO_REPORT 파티션 내의 비율 NTILE 인자 값으로 전체 로우 개수를 나누고, 인자 값의 순서를 결정 ntile(4) over(order by sa..
조인의 원리 및 활용 1. Nested Loop 조인 - Random Access 위주의 조인방식 -> Index 필수! - 조인을 한 레코드씩 순차적으로 진행 - 대용량 처리시 치명적 한계점 발생 -> 좁은 범위에서만 쓰임 -> OLTP 환경에 적합 - 인덱스 구성 전략이 매우 중요! 2. Sort merge 조인 - 소트 단계 : 양쪽 집합을 조인 컬럼 기준으로 정렬 - 머지 단계 : 정렬된 양쪽 집합을 merge - 조인을 위해 실시간으로 인덱스를 생성하는 것과 같은 효과 - 양쪽 집합을 정렬 후 NL조인과 같은 방식으로 진행하지만, PGA 영역에서 처리 -> 빠름! - 소트 부하만 감수한다면 버퍼 캐시에서 조인하는 NL조인 보다 유리 - 조인 컬럼에 인덱스 유무와 상관없이 조인 - 사용하는 경우 : Firtst 테이블..
인덱스 구조 및 이해(2) 4. 테이블 Random Access 부하 - Row ID의 구조 1) 확장적구조 (8i 부터) - 데이터 오브젝트(Index, Table 등) 번호 (6자리) - 데이터 파일 번호 (3자리) - 블록번호 (6자리) - 로우번호 (3자리) 2) Restricted 구조 (8i 이전) - 블록번호, 파일번호, 로우번호 Sequential Access Random Access - 하나의 블록에서 순차적으로 읽는다. - 알차게 빼 먹는다 - Index Leaf Block에서 Read / Full Scan - 적은 비용 - Full Scan일 경우 Multi Block I/O 가능 - 주로 하나의 블록에서 하나의 레코드만 - 높은 비용 . 낮은 효율 - Rowid 이용 테이블 Access - DBA를 이용한 인..