728x90
반응형

실행계획 - 데이터를 처리하고자할때, 수립되는 데이터 처리 방법 

 

실행계획을 하는 이유

 

- 비효율적인 부분 확인 가능 

- 실행계획을 통해 SQL 튜닝 포인트 도출 

 

EXPLAIN PLAN - 실행계획만 확인 가능한 방법 

 

SET AUTOTRACE

 

- 실행계획과 I/O관련 정보 확인 가능 

- 한 번의 명령으로 여러 개의 SQL에 대한 실행계획 볼 수 있음 

 

옵티마이저

 

하나의 프로세스로 사용자가 실행한 SQL을 해석하고 데이터 추출을 위한 실행 계획을 수립하는 프로세스 

 

오라클 

 

RBO(초창기버전부터 제공) 

 

CBO(Vlog부터 기본적인 설정으로 적용)

 

RBO(Rule Based Optimizer)

 

- 기본적으로 15개의 순위가 매겨진 규칙이 있음 

  -> 이를 기초로 해서 실행계획을 수립함. 

 

- SQL에 대한 실행계획이 하나 이상일 경우엔 

  순위가 높은 규칙을 이용

 

- 수립될 실행계획이 예측 가능하기에 

  개발자가 원하는 처리 경로로 유도 하기 쉬움 

 

CBO(Cost Based Optimizer)

 

- 대상 row들을 처리하는데 자원 사용 최소화함 

  궁극적으로 데이터를 빨리 처리하는게 목적 

 

- CBO에 영향을 미치는 비용 산정 요소 

  각종 통계정보,Hint,연산자,Index

 

- Cluster,DBMS버전,CPU/Memoy 용량 

Disk I/O등과 같이 매우 다양함 

 

통계정보 -> 주기적으로 생성

 

CBO의 성능을 최적의 상태로 유지시키기위해 테이블,

인덱스,클러스터 등을 대상으로 통계 정보 생성 

 

-> 정기적으로 ANALYZE 작업을 하는 것이 가장 중요 

 

-> 가장 효율적인 실행계획을 수립하기 위해 

    최소 비용을 계산할때 중요하게 사용

 

RBO

Rank  Access Path
1 Rowid에 의한 1row
2 클러스터 조인에 의한 1row
3 unique나 Primarykey를 사용한 해시클러스터 키에 의한 1row
4 Unique나 Primary key에 의한 1row 
5 클러스터 조인
6 해시 클러스터키
7 클러스터키
8 결합 칼럼 인덱스
9 단일 칼럼 인덱스
10 인덱스에 의한 유한영역
11 인덱스에 의한 무한영역
12 소트머지 조인
13 인덱스로 구성된 칼럼 최대 or 최소
14 인덱스로 구성된 칼럼 ORDER BY
15 인덱스 없이 전체 테이블 스킨 
(FTS:Full Table seam)

옵티마이저의 레벨별 설정 

 

Instance Level : initSID.ora를 이용해서 지정 

OPTIMMZER_MODE = 

[RULE/CHOOSE/FIRST_ROWS/ALL-ROWS(기본값)

 

Sesssion Level 

SQL > ALTER SESSION SET OPTIMIZER_MODE = 

[RULE/CHOOSE/FIRST_ROWS/ALL_ROWS]

 

State ment Level

SQL>SELECT/*First_rows*/

       ename 

FROM emp; 

 

RBO와 CBO의 비교 

 

SELECT e.ename,d.dname 

 FROM emp e,dept d 

WHERE e.deptno = d.depto 

 AND e.deptno = 10; 

CBO 

 

 

반응형
728x90
반응형

데이터베이스 

 

- 데이터 파일과 로그 파일로 구성됨 

- 데이터 파일 : mdf,ndf 확장자

- 로그 파일 : ldf 확장자

- 다양한 형태의 개체 포함 

(테이블,인덱스,프로시저,트리거,함수)

 

테이블 

 

- 데이터베이스 내의 존재하는 대표적인 개체 

  (데이터를 가지고 있다.)

- 시스템 테이블 & 사용자 테이블 

- 실제 데이터를 물리적으로 포함하고 있음

- 행과 열로 구성 됨

 

페이지 

 

- 페이지 파일을 구성하는 논리 단위 

- SQL Server의 기본 데이터 저장단위(8KB)

- 데이터를 쓸 때 행을 페이지에 기록함 

- 데이터를 읽을 때(SELECT)

  페이지 내의 모든 행이 읽혀짐

- 페이지 내의 행이 많을수록 I/O 효율 증가 

- 0 ~ N 사이의 순차적인 번호를 가짐 (페이지 번호)

 

레코드 100개를 읽어야 할 경우 (SELECT)

 

페이지(8KB)에 레코드 10개 들어있는 경우는 10번 

페이지(8KB)에 레코드 100개 들어있는 경우는 1번만

읽으면 되기 때문에 1번 읽어서 레코드 100개를 

읽어주는 것이 성능이 더 좋다. 

 

인덱스 이해 

 

EX) 인덱스는 주민센터다.

- 사람을 빨리 찾을 수 있게 해준다.

 

EX) 인덱스는 도서 검색 시스템이다. 

- 그 책을 가장 빨리 찾을 수 있게 해준다. 

 

EX) 인덱스는 다리다. 

-강 건너 그 곳에 가장 빨리 갈 수 있게 해준다.

(멀리 돌아갈 곳을 다리위로 가로질러서 건너간다.)

 

위의 3개의 공통점은 "빨리"이다. (인덱스 없이는 빨리 갈 수 없다.)

 

인덱스 장점 

 

 빠른 데이터 검색 

 - 찾는 데이터를 가지고 있다면 직접 주거나 

   없다면 어디에 있는지 알려준다. 

 

데이터 중복을 방지

- PRIMARY KEY 제약조건  

  (PK 생성시 UNIQUE Clustered Index 자동 생성됨)

- UNIQUE 제약조건

 

잠금 최소화 

- 최소 범위의 잠금을 가능하게 해 준다.

(인덱스를 참조하여 원하는 데이터를 빨리 찾을 수 있기 때문에 Update를 빨리하고 나오게 된다.)

- 동시성을 높여 준다.

(Update를 빨리하고 나오기 때문에 많은 사용자가 동시에 동일한 데이터를 엑세스 할 수 있게 된다)

 

인덱스 단점 

 

물리적인 공간 차지 

- 인덱스는 테이블처럼 데이터를 가짐 

- 테이블처럼 물리적인 공간을 차지함 

 

인덱스에 대한 유지관리 부담

- SELECT 문은 인덱스를 좋아함 

- INSERT 문은 인덱스를 별로 좋아하지 않음 

  (데이터를 추가하면 인덱스에도 등록해야해서)

 

데이터가 극히 적다면

- 인덱스가 있어도 사용되지 않을 수 있음 

- 얻는 효과보다 유지관리 부담이 클 수 있음 

 

인덱스 조각화 

 

내부 조각화

- 인덱스 페이지가 꽉 차지 않고 비어있는 상황 

- OLTP성 테이블의 인덱스라면 빈공간 확보(내부 조각화)가 필요하다.

- OLAP성 테이블에서는 빈공간이 많으면 조회할 때 읽는 페이지 수가 증가하여 성능이 떨어질 수 있다.

  (따라서 페이지 분할이 덜 발생하기 때문에 꼭 나쁘다고 할 수 없다.)

 

외부 조각화 

- 인덱스의 논리적인 순서와 물리적인 순서가 맞지 않는 경우로 성능에 도움이 되지 않으므로 제거해야 한다.

   (인덱스 순서가 흩어져 있는 것)

- 인덱스 리빌드 목적

  

인덱스 유지관리의 필요성 

 

- 재생성 또는 재구성 작업 자동화 

- 모든 인덱스를 대상으로 하는 것은 바람직 하지 않음 

 (인덱스 재생성 또는 재구성은 CPU 부하를 유발)

 

인덱스 조각모음은 인덱스 스캔(전체 조회)를 빠르게 해주는 것이지 인덱스 SEEK(조건으로 값 찾기)와는 상관이 없다.

만약 쿼리문에서 WHERE 조건을 지정해서 특정 값만 가져 오도록 쿼리를 만들었는데 인덱스 스캔한다면

쿼리 튜닝(인덱스 생성)이 필요하다.

 

테이블과 인덱스 

 

테이블의 존재 형태 2가지 

- 힙 테이블 

- 클러스터형 인덱스 테이블 

 

인덱스 종류 

- 클러스터 인덱스 

- 비 클러스터 인덱스 

 

힙이란 ? 

 

정렬 기준이 없이 저장 된 테이블의 존재 형태 

- 데이터 페이지 내의 행동들 간에 순서가 없음 

- 데이터 페이지들 간에도 순서가 없음 

 

- 클러스터 형 인덱스가 없는 테이블 

 

아무렇게나 쌓여 있음

 

힙의 장점과 단점 

 

- INSERT문이 좋아하는 테이블의 형태

- 새로운 행을 기존 페이지의 빈 곳에 추가하면 됨

- 빈 공간이 없으면 새로운 페이지에 추가하면 됨 

 

- SELECT문이 싫어하는 테이블 형태 

- 데이터가 극히 적으면 상관이 없음 

- 데이터가 많으면 원하는 데이터 찾기가 너무 힘듦

 

SELECT를 위한 테이블인가 INSERT를 위한 테이블인가. 

 

INSERT를 위한 테이블이라면 힙 테이블로 유지해야 하지만.

SELECT를 위한 테이블이라면 대처가 필요(인덱스 생성)

 

힙의 원하는 데이터 찾아가기 

 

Table Scan 

 

- 데이터를 찾을 수 있는 유일한 방법 

- 모든 데이터 페이지를 다 읽어야 함 (다 읽음)

- 참고 : IAM 페이지를 참조해서 

해당 데이터를 모두 읽게 됨 

 

클러스터 형 인덱스란 ? 

 

- 특정 열을 기준으로 데이터가 정렬됨 

- 물리적 정렬이 아닌 논리적 정렬 

- 정렬 기준의 열로 찾는데 빠른 성능을 보여줌 

 

- 테이블 당 하나의 클러스터 형 인덱스 설정 가능 

- 실제 데이터를 가지므로 하나만 존재 가능 

- 테이블을 여러 개 만들면 여러 개 존재 가능 

 

힙 -> 클러스터형 인덱스 

 

힙테이블 

클러스터형 테이블

인덱스 키 이름을 기준으로 데이터 페이지가 정렬되어 있다.

 

 

테이블 존재 형태의 문제 

 

힙 테이블로 둘 것인지, 클러스터형 테이블로 만들어서 정렬시킬 것인지 

장/단점이 있으니 충분한 고민이 필요 

 

클러스터형의 원하는 데이터 찾아가기 

 

Clustered Index Scan 

- 모든 데이터 페이지를 읽음 

- Table Scan과 크게 다를 바 없음 

- 데이터가 많은 경우 성능 문제 발생 

 

Clustered Index Seek 

- 특정 데이터를 클러스터 인덱스에서 찾음 

- 아주 빠른 성능을 보여줌

인덱스 구조

클러스터형 인덱스 유일성 지정 

 

UNIQUE Clustered Index 

- 인덱스 키 열에 중복된 데이터가 추가되는 것을 차단함

 

UNIQUE 속성을 생략하면 

- 기본적으로 UNIQUE 하지 않은 인덱스가 생성됨 

  그래서 내부적으로 유일성을 확보하기 위한 값이 사용됨 

  (공간 낭비가 되기 때문에 명시해 주는게 좋다)

 

UNIQUE 여부를 명확히 설정 

- 인덱스 키 열의 유일성을 우리가 아는게 중요한 것이 아니고 

  SQL SERVER가 아는 것이 중요

 

클러스터형 인덱스는 만능이 아님 

 

인명 전화번호부에서 서대문구 주민을 찾으려면 

 

- 전화번호부를 처음부터 끝까지 다 읽어야 함

  (이름으로 정렬되어 있기 때문)

 

A 열을 기준으로 정렬된 데이터에서 

 

- A로만 찾는다면 좋겠지만 

EX) WHERE A=10 (인덱스 활용)

 

- B 또는 C 등 다른 열로 찾는 경우 의미가 없어짐 

EX) WHERE B=5 (인덱스 활용 못함)

 

다양한 검색을 위한 추가적인 도움이 요구됨 

 

- 클러스터 인덱스의 부족함을 도와주는 비 클러스터인덱스가 필요 

 

힙 + 비 클러스터 형 인덱스 

 

비 클러스터 형 인덱스가 가진 것 

 

- 생성한 인덱스 키 열의 모든 데이터 

  name,age 컬럼으로 만들었다면 

  name,age + RID값을 가지고 있음 

 

RID

 

 힙 테이블이 데이터가 정렬되어 있지 

 않기 때문에 RID를 매칭시킴

 

RID를 갖는 이유 

 

- 주소를 딱 찍어주니 좋음 

- RID는 거의 변하지 않음 

- RID는 값이 크지도 않음 

 

비 클러스터 인덱스는 999개까지 만들 수 있음

 

- 불필요한 비 클러스터 인덱스를 너무 많이 만들면 성능 저하 

- 데이터와 별개로 저장되기 때문 

 

힙 + 비 클러스터 형 인덱스 

 

index Seek 

 

- Root페이지부터 찾아가기 

- 아주 빠른 성능을 보여 줌 

 

Rid Lookup 

 

- 힙 테이블을 찾아가는 과정

- 비 클러스터 형 인덱스가 가지 못한 데이터를 찾아가는 과정 

 

Index Scan

 

- 리프 수준의 모든 인덱스 페이지를 다 읽음 

 

총 정리 

 

- 비 클러스터 인덱스는 컬럼을 다 가지고 있지 않지만, 다 가지고 있을 수 있다.

 

- 쿼리는 빼가는 과정이다. 

  조회에 필요없는 컬럼을 제거 

  조회 화면을 변경

 

- 쿼리는 테이블이 아닌 인덱스로 날려야 한다 

  인덱스의 도움을 받지 못한 쿼리는 테이블로 날아가고 성능에 문제가 생길 수 있다. 

 

 

반응형

'IT > DB' 카테고리의 다른 글

tnsnames.ora 접속하는 방법  (0) 2021.10.26
오라클 클라이언트 및 패키지 설치 방법 (2021.10.26 기준)  (0) 2021.10.26
왜 데이터베이스 튜닝을 해야할까 ?? -  (0) 2021.10.14
쿼리란 ?  (0) 2021.10.14
DBMS와 SQL이란  (0) 2021.08.19
728x90
반응형

데이터베이스란 ? 

 

대량의 정보를 컴퓨터가 효율적으로 접근할 수 있도록 가공 및 저장한 것 

 

DBMS란 ?

 

다수의 사용자들이 데이터베이스 내의 데이터를 접근할 수 있도록 해주는 소프트웨어 도구의 집합

 

DBMS를 쓰지 않는다면

 

다수의 사람이 데이터를 공유하기 어렵다 

대량의 데이터를 다루기 어렵다 (txt,xls 등)

읽기/쓰기를 자동화하려면 프로그래밍 기술이 필요하다. 

만일의 사고에 대비 어렵다.

 

관계형 데이터베이스 - RDB 

 

관계형 데이터베이스는 키와 값의 간단한 관계를 2차원 표(테이블)형식으로 나타낸 데이터베이스이다. 

하나의 데이터베이스 안에는 여러 개의 테이블이 존재할 수 있다.

 

테이블

 

테이블은 행과 열로 이루어져 있다. 

 

테이블의 행은 레코드라고 브르며 데이터 한 건에 해당 

하나의 테이블은 적게는 수백개 많게는 수백만개의 레코드를 지님. 

 

 

테이블의 열에 해당하는 칼럼은 각기 구분하기 쉽게 이름을 붙여 분류 

칼럼은 특정한 데이터 타입을 가진다.

 

RDBMS는 일반적으로 클라이언트가 요청을 보내면 서버가 처리해주는 C/S구조로 되어있다.

클라이언트가 요청을 보낼때에 주로 사용하는 언어가 SQL이다.

 

사용자가 데이터를 조회하고 싶을때에 SQL문으로 작성한 요청을 RDBMS에 보내면 RDMBS는 요청된 데이터를 반환한다. 이 때 RDMBS는 2차원 표 형태의 데이터를 반환한다.

 

RDBMS의 종류 

 

어떤 RDBMS를 쓰는지에 따라 SQL 문법이 조금씩 달라진다. 쓰이는 인기 있는 RDBMS는 

아래와 같다.

 

Oracle DB - 가장 오래되었고 신뢰도도 높다. 뛰어난 기술력과 안정성을 가지고 있다. 대규모의 애플리케이션,

특히 은행 업계에서 쓰이며 유료로 사용 

MySQL - 오픈 소스이기 때문에 널리 쓰인다. 웹 개발 특히 PHP를 이용한 개발에 흔히 쓰인다. 오라클이 인수한 후

불안감 때문에 다른 곳으로 넘어가는 경우가 보임

Maria DB -오라클이 MySQL을 인수하면서 라이선스 문제가 불확실해지자 이에 반발하여 만들어졌다.

MySQL 5.5를 기반으로 만들어져 사용법이 거의 유사하고 호환성도 뛰어나다.

PostgreSQL - 버클리 대학의 프로젝트로 만들어진 오픈 소스 ORDBMS이다. 

(ORDBMS : 객체 - 관계형 데이터베이스 관리 시스템) SQL의 확장성과 표준을 준수하고 풍부한 기능을 지원한다.

SQL Server - 마이크로소프트가 개발한 RDBMS이기 때문에 윈도우 시스템 환경 지원 

SQLite - DB를 서버가 아닌 파일로 저장하는 DBMS이다. 기기에 가벼운 DB를 저장하는 목적으로 설계되었으며

대표적으로 안드로이드,iOS,mac OS에서 사용 

 

SQL 명령어 

 

DDL - 데이터베이스 스키마와 설명을 처리하는 정의하는 언어. 데이터베이스나 테이블 생성/변경/삭제 등의 작업이 여기 포함된다. 

DML - 데이터검색,삽입,변경.삭제를 수행하여 조작하는 언어.실질적으로 저장된 데이터에 처리할 때 사용 

DCL - 데이터에 접근할 수 있는 권한을 관리하는 언어

TCL - 트랜잭션을 다루는 언어 

 

반응형

+ Recent posts