반응형

🔑 Database

5. DB에서 인덱스를 사용하는 이유는 무엇인지 설명하시오.

👉🏻 DBMS의 인덱스는 검색 속도를 높이기 위한 기술입니다. 인덱스는 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는데는 빠르지만 새로운 값을 추가(INSERT), 삭제(DELETE), 수정(UPDATE)하는 경우에는 쿼리문 실행 속도가 느려집니다. 즉, DBMS에서 인덱스는 데이터의 저장 성능을 희생하고 그 대신 데이터의 읽기 속도를 높이는 기능이라고 할 수 있습니다. 

인덱스를 사용하면 좋은 경우에는 WHERE절에서 자주 사용되는 Column, 외래키가 자주 사용되는 Column, JOIN에 자주 사용되는 Column이 있습니다. 반면 인덱스 사용을 피해야 하는 경우는 Data 중복도가 높은 Column, DML이 자주 일어나는 Column이 있습니다.

Clustered Index

👉🏻 순서대로 정렬되어 있어서 값을 찾을 때 해당 부분에서만 찾으면 됨

👉🏻 정렬되어 있기 때문에 삽입 시에 오래걸림

👉🏻 한 테이블 당 하나만, PK와 비슷

👉🏻 범위 검색에 좋음

👉🏻  존재하는 PK 사이에 삽입할 시 매우 오래걸림

* Auto-increment

Non-Clustered Index

👉🏻 인덱스와 간접 참조되어 있음

👉🏻  정렬되지 않았기 때문에 삽입 시 오래 걸리지 않음, 해시 테이블 사용하여 빠름

👉🏻 한 테이블에 여러 개

👉🏻 삽입 시 추가 작업 필요(인덱스 생성)

👉🏻 카디널리티가 높아질수록 쓰면 좋음

* 카디널리티는 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표, 카디널리티가 높을수록 중복 수치가 낮아짐


출처: https://wooaoe.tistory.com/47?category=822650 [개발개발 울었다]

반응형
반응형

 

 

 

 

 

 

 

 

 

1. 동시성 제어 기법

1) 잠금 -> 대부분 이 방법 사용

: 트랜잭션의 실행 순서를 강제로 제어한다.

 

2) 타임스탬프

: 최대한 병행 수행을 보장하나,

: 직렬 가능한 스케줄에 위배될 가능성이 있으면 실행 취소한다.

 

 

 

 

2. 잠금

: 하나의 트랜잭션을 수행하는 동안 특정 데이터 항목에 대해 다른 트랜잭션이 동시에 접근하지 못하도록 하는 기법이다.

 

 

 

 

 

1) 공유 잠금 (S-lock)

 

2) 배타 잠금 (X-lock)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

 

 

1. 동시성 제어

: 다중 사용자 DBMS에서 필요하다.

: 동시에 실행되는 트랜잭션들 간에 간섭이 발생하여 일관성이 깨지지 않도록 트랜잭션 실행 순서를 제어하는 기법이다.

 

 

 

2. 트랜잭션에서의 연산

1) read(x)

: 이름이 x인 데이터베이스 항목을 트랜잭션의 지역변수 x로 읽어들인다.

x는 테이블, 레코드, 필드 등

 

2) write(x)

: 지역변수 x에 저장된 값을 데이터베이스 항목 x에 저장한다.

** write 연산 수행 시 그 결과가 디스크에 저장될 수도 있고 그렇지 않을 수도 있다.

 

대부분의 dbms는 성능 향상을 위해 메모리 buffer를 사용한다.

 

 

 

 

 

 

3. 동시성 제어가 필요한 이유

: 트랜잭션들에 정의된 명령들 간 끼어들기가 가능하다.(interleaving)

 

- 스케줄

: 끼어들기 방식에 의해 실행되는 순서

: 스케줄은 전적으로 운영체제의 권한이다.

: 사용자는 어떠한 스케줄로 트랜잭션들이 실행되는지 미리 예측하기 어렵다.

 

- 끼어들기 방식의 문제점

: 서로간의 간섭에 의해서 잘못된 데이터를 생성할 수 있다.

: 갱신 분실, 연쇄 복귀, 불일치 분석 현상이 발생가능하다.

 

 

 

 

4. 갱신 분실

T1이 read를 수행하고 write 하기 전에 T2가 read를 다시 수행하면 x값이 overwrite 되어서 사라진다.

 

 

 

 

5. 연쇄 복귀

: T3가 복귀(rollback)하면 T4에서 한 수행도 복귀되어야 한다.

but T4가 이미 완료된 이후라면 복귀 불가능하다.(지속성 위배)

완료되지 않은 트랜잭션의 쓰기 연산에 의해 갱신된 데이터를 다른 트랜잭션이 읽었기 때문에 (dirty read)

 

 

 

 

 

 

 

 

 

6. 불일치 분석

 

 

 

 

 

7. 끼어들기로 인한 문제점 해결방안

 

1) 트랜잭션들을 하나씩 순차적으로 실행한다.

2) 직렬 스케줄 생성 -> 시스템 성능 저하 발생

3) 직렬 가능한 스케줄 생성 -> 끼어들기를 최대한 허용하면서 직렬 스케줄과 동일한 결과를 갖도록 실행 순서를 제어한다.

 

 

 

6. 직렬 스케줄

: 각 트랜잭션의 연산들이 끼어들기 방식으로 실행되지 않고, 순차적으로 실행되는 스케줄이다.

 

 

 

 

 

7. 직렬 가능한 스케줄

: 직렬 스케줄과 실행 결과가 동일한 스케줄이다.

 

- 직렬 가능한 스케줄인지 판단하는 방법

: 스케줄에 나타난 연산들의 순서를 바꿔 직렬 스케줄을 만들 수 있으면 직렬 가능한 스케줄이다.

 

 

ex) C1와 C2의 실행 순서를 바꿔 직렬 스케줄로 만들 수 있들 수 있으면 직렬 가능 스케줄

 

 

- C1, C2의 실행 순서를 바꿀  수 있는 경우

 

: C1과 C2가 서로 다른 데이터 항목에 대한 연산일 경우 -> 교환 가능하다.

: C1과 C2가 같은 데이터 항목이지만,

C1과 C2가 모두 read 연산일 경우, -> 교환 가능하다.

C1과 C2 중 하나라도 write 연산일 경우, -> 교환 불가능하다.

 

 

 

 

 

 

1) 직렬 스케줄로 변환 가능한 경우

 

 

 

 

2) 직렬 스케줄로 변환 불가능한 경우

 

: 직렬 스케줄로 바꾸기 위해서는 (1)과 (4)의 순서를 바꾸거나 (2)와 (3)의 순서를 바꿔야 하는데,

같은 데이터이고 write 가 들어가기 때문에 바꿀 수 없다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

1. 트랜잭션이란?

: 하나의 논리적인 작업 단위를 구성하는 연산들의 집합이다.

: 실행 중 멈추거나 중단되지 않는 최소 작업 단위

: 데이터베이스 응용 프로그램은 트랜잭션의 집합이다.

 

 

 

 

 

1) 트랜잭션의 예 1

 

 

-> 만약 이체 업무 중간에 멈춘다면?

계좌에 잘못된 정보가 저장되므로 

모든 연산을 완벽히 수행하던지, 아예 처음상태로 돌아가던지 해야 한다. -> all or nothing

 

 

 

2) 트랜잭션의 예 2

: 다중 사용자 환경에서 트랜잭션이 동시에 실행되는 다른 트랜잭션에 의해 영향을 받는다.

 

- 예금 인출이 동시에 두 지점에서 이루어진다면 오류가 발생한다.

 

 

 

3) 따라서,

앞의 상황이 발생하지 않도록 사전에 DBMS에서 트랜잭션 처리 기능을 갖춰야 한다.

 

 

 

 

 

 

 

 

 

 

2. 트랜잭션이 지켜야 할 조건

- ACID 특성

Atomicity(원자성)

:  트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지, 아니면 실행 전 상태로 되돌아가야 한다.(all-or-nothing)

 

Consistency(일관성)

: 트랜잭션 실행 전과 후에 데이터베이스 내용이 일관성이 있어야 한다.

 

Isolation(고립성)

: 트랜잭션이 실행되는 과정에서 갱신된 데이터는 그 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조할 수 없다.

 

Durability(지속성/영속성)

: 트랜잭션이 성공적으로 완료되면 그 갱신된 내용은 영구적으로 

 

 

 

 

 

 

 

 

 

1) 원자성 : 트랜잭션은 성공하거나 실패하거나 둘 중 하나!

-> 실패하더라도 원래 상태로 되돌려놔야 한다.

 

2) 일관성 : 계좌이체 전과 후의 두 계좌의 잔액의 합은 동일해야 한다.

 

3) 고립성 : 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 하는 특성이다.

 

 

 

* 고립성이 만족되는지 확인하려면? 

- 동시에 실행하는 트랜잭션들의 실행 결과가 순차적으로 실행된 결과와 동일한지 확인하면 된다.

 

 

* 해결 방법 *

- 각 트랜잭션을 순차적으로 실행한다. 다만, 다중 프로그래밍 환경에서 순차적으로 하는 것은 성능 면에서 문제 발생한다.

- 상호 간의 간섭이 일어나지 않도록 하는 기법이 필요하다.

 

 

 

 

4) 지속성 : 트랜잭션이 성공적으로 완료되면 그 갱신된 내용은 영구적으로

 

 

 

 

 

 

3. 트랜잭션 상태 전이

 

 

- 동작 : 트랜잭션이 시작되고 연산들이 정상적으로 실행중인 상태

- 부분완료 : 트랜잭션에 정의된 모든 연산의 실행이 끝난 상태

- 완료 : 트랜잭션이 성공적으로 종료된 상태

- 실패 : 트랜잭션이 성공적으로 완료되지 않고 더 이상 실행되지 못 하는 상태

- 중단 : 실행 이전으로 복귀된 상태

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

 

1. B+ tree 인덱스

: 관계형 데이터베이스에서 가장 널리 사용되는 인덱스 구조이다.

 

 

 

 

1) 차수가 n인 B+tree

차수 : 한 노드에서 하위 자식 노드를 가리키는 주소의 개수이다.

 

중간 노드 구조

 

P1 ~ Pn : 자식 노드를 가리키는 포인터

Key1 ~ Keyn-1 : 검색 키

Pi+1이 가리키는 하위 노드의 모든 검색 키는 Keyi 보다 크고 Keyi+1보다 작거나 같다.

 

 

 

 

 

 

 

 

2) B+tree 의 특징(차수가 n이라고 가정)

: 단말 노드에 레코드의 주소를 저장한다.

- 레코드의 검색 키 값에 따라 인덱스 엔트리들이 정렬된 형태이다.

- 단말 노드들이 검색 키 순서에 따라 연결된다.(다음 노드의 주소를 포함)

 

: 루트 노드에서 단말 노드까지의 모든 경로의 길이가 같다. (balanced tree)

: 루트 노드는 최소 2개, 최대 n개의 자식 노드를 가진다.

: 루트와 단말 노드를 제외한 중간 노드들은 최소 [n/2] (올림기호), 최대 n개의 자식 노드를 가진다.

 

K개의 검색 키 값을 포함하는 B+tree의 높이 = [lognK]

 

 

 

 

 

3) B+tree 의 성능

: 차수가 10이고 검색 키의 값이 10,000개 이면 B+tree의 높이는 4를 넘지 않는다.

 

 

 

 

 

 

 

 

 

2. 복합 인덱스

: 두 개 이상의 필드에 대해 정의되는 인덱스이다.

 

 

- 인덱스 엔트리들은 검색키의 값은 순서대로 정렬된다.

- 효율적인 검색을 위해 B+ tree 구성이 가능하다.

 

 

 

1) 복합 인덱스 정렬 방법

: 검색 키 값이 숫자인 경우 크기로 정렬 가능하다.

: 문자열인 경우 사전식 순서에 따라 정렬한다.

: 문자열 / 숫자가 아닌 경우, 엔트리들 간에 대소 관계 정의가 필요하다.

 

 

 

 

 

 

 

 

 

 

 

2) 복합 인덱스의 효과

: 복합키 필드들에 대한 동등 조건을 포함하는 질의 처리 성능을 향상시킨다.

 

SELECT *
FROM TAKES
WHERE STU_ID = '1292001' AND CLASS_ID = 'C101-01';

 

: 복합 인덱스가 정의된 필드만을 이용하는 질의는 테이블 조회 없이 복합 인덱스 조회만으로 처리 가능하다.

 

 

 

 

 

 

3) 복합 인덱스 주의사항

: 관련 필드의 순서에 따라 인덱스의 효과가 달라진다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 해시 인덱스

: 해시 함수를 기반으로 인덱스 엔트리를 저장한 인덱스이다.

 

버켓(bucket) 

: 인덱스 엔트리가 저장되는 공간이다. 블락보다는 큰 개념

: 해시함수 값을 버켓 번호로 사용한다.

 

 

 

 

 

 

 

1) 인덱스 구성 방법

: 인덱스 구성에 사용될 검색 키 필드를 설정한다.

: 레코드의 필드 값에 해시 함수를 적용하여 버켓 번호를 생성한다.

 

 

2) 인덱스 사용 방법

: 검색할 필드 값을 해시 함수에 적용하여 버켓 번호를 생성한다.

해당 버켓 안에 들어있는 인덱스 엔트리들 중 원하는 필드 값을 포함한 엔트리를 검색한다.

엔트리에 포함된 레코드 주소를 이용한다.

 

 

 

3) 해시 함수

: 해시 값은 입력값에 상관없이 균등하게 분포되어야 한다.

해시 함수의 예

H(x) = x % N

 

 

 

 

 

4) 버켓 오버플로우

: 일반적으로 버켓의 크기는 고정되어 있다.

: 버켓에 엔트리가 다 차는 경우 오버플로우가 발생한다.

: 새로운 버켓을 생성하여 기존 버켓과 연결해야 한다. (bucket chaining)

: 오버플로우가 많이 발생할수록 인덱스 성능이 저하된다.

 

 

 

 

 

 

 

 

 

4. B+ tree 인덱스 vs 해시 인덱스

1) 해시 인덱스

: 동등 비교 조건을 갖는 검색에 유리하다. (=)

 

 

2) B+ tree 인덱스

: 범위 조건을 포함한 검색에 유리하다. (<=, >=)

-> 검색 키 순서대로 정렬 및 연결되어 있기 때문이다.

 

 

 

 

5. 인덱스 분류

- 대응 밀집도에 따라

1) 희소 인덱스

: 테이블의 일부 코드에 대해서만 인덱스 엔트리를 생성한다,

 

2) 밀집 인덱스

: 테이블의 모든 코드에 대해서 인덱스 엔트리를 생성한다,

 

 

 

- 클러스터링 유무에 따라

1) 클러스터 인덱스

: 인덱스가 설정된 필드 값의 순서대로 레코드들이 인접하여 저장된다.

- 주로 기본 키에 대해 설정된다.

- 희소 인덱스 또는 밀집 인덱스 형태 모두 가능

 

2) 비클러스터 인덱스

: 인덱스 필드 값의 순서가 레코드들의 물리적 저장 위치와 무관하다.

: 반드시 밀집 인덱스 구조를 가진다.

 

 

 

 

 

 

6. 클러스터 인덱스

: 범위 조건 검색에 효과적이다.

 

 

 

: 정렬을 포함하는 질의에 효과적

 

 

 

 

 

 

 

 

 

 

 

 

 

7. 오라클의 인덱스 생성 구문

 

1) 일반 인덱스

 

 

예)

CREATE INDEX DEPT_INDEX ON DEPARTMENT(DEPT_NAME)

 

 

- dept_name의 값이 중복되지 않은 경우

CREATE UNIQUE INDEX DEPT_INDEX ON DEPARTMENT (DEPT_NAME)

 

 

 

 

2) 복합 인덱스

 

1) 

CREATE INDEX STU_INDEX2 ON STUDENT(NAME, ADDRESS)

 

 

 

 

 

 

 

3) 인덱스 삭제

 

DROP INDEX DEPT_INDEX

 

 

 

 

 

 

 

 

 

 

8. 언제, 어디서 인덱스를 만들어야 할까?

 

<유리한 경우>

- 테이블 레코드 수가 많을 때

- where 절에 자주 사용되는 필드일 때

- 조인 연산에 참여하거나 널이 많은 필드일 때

 

<불리한 경우>

- 테이블 레코드 수가 적을 때

- where 절에 거의 사용되지 않는 필드

- 삽입, 삭제, 수정이 자주 발생하는 테이블

- 서로 구별되는 유일 값의 개수가 적은 필드

: 여러 레코드들이 동일한 값을 가지므로 질의의 선택도가 낮음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

 

1. B+ tree 인덱스

: 관계형 데이터베이스에서 가장 널리 사용되는 인덱스 구조이다.

 

 

 

 

1) 차수가 n인 B+tree

차수 : 한 노드에서 하위 자식 노드를 가리키는 주소의 개수이다.

 

중간 노드 구조

 

P1 ~ Pn : 자식 노드를 가리키는 포인터

Key1 ~ Keyn-1 : 검색 키

Pi+1이 가리키는 하위 노드의 모든 검색 키는 Keyi 보다 크고 Keyi+1보다 작거나 같다.

 

 

 

 

 

 

 

 

2) B+tree 의 특징(차수가 n이라고 가정)

: 단말 노드에 레코드의 주소를 저장한다.

- 레코드의 검색 키 값에 따라 인덱스 엔트리들이 정렬된 형태이다.

- 단말 노드들이 검색 키 순서에 따라 연결된다.(다음 노드의 주소를 포함)

 

: 루트 노드에서 단말 노드까지의 모든 경로의 길이가 같다. (balanced tree)

: 루트 노드는 최소 2개, 최대 n개의 자식 노드를 가진다.

: 루트와 단말 노드를 제외한 중간 노드들은 최소 [n/2] (올림기호), 최대 n개의 자식 노드를 가진다.

 

K개의 검색 키 값을 포함하는 B+tree의 높이 = [lognK]

 

 

 

 

 

3) B+tree 의 성능

: 차수가 10이고 검색 키의 값이 10,000개 이면 B+tree의 높이는 4를 넘지 않는다.

 

 

 

 

 

 

 

 

 

2. 복합 인덱스

: 두 개 이상의 필드에 대해 정의되는 인덱스이다.

 

 

- 인덱스 엔트리들은 검색키의 값은 순서대로 정렬된다.

- 효율적인 검색을 위해 B+ tree 구성이 가능하다.

 

 

 

1) 복합 인덱스 정렬 방법

: 검색 키 값이 숫자인 경우 크기로 정렬 가능하다.

: 문자열인 경우 사전식 순서에 따라 정렬한다.

: 문자열 / 숫자가 아닌 경우, 엔트리들 간에 대소 관계 정의가 필요하다.

 

 

 

 

 

 

 

 

 

 

 

2) 복합 인덱스의 효과

: 복합키 필드들에 대한 동등 조건을 포함하는 질의 처리 성능을 향상시킨다.

 

SELECT *
FROM TAKES
WHERE STU_ID = '1292001' AND CLASS_ID = 'C101-01';

 

: 복합 인덱스가 정의된 필드만을 이용하는 질의는 테이블 조회 없이 복합 인덱스 조회만으로 처리 가능하다.

 

 

 

 

 

 

3) 복합 인덱스 주의사항

: 관련 필드의 순서에 따라 인덱스의 효과가 달라진다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts