본문 바로가기

데이터베이스

(23)
복합키 vs 대표 ID PK 데이터를 식별하기 위해 키(PK)를 이용합니다. 복합키는 데이터를 대표하는 키가 여러 개의 컬럼으로 구성된 것을 의미합니다. 데이터를 더욱 효과적으로 찾기 위해 키에는 기본적으로 PK 인덱스가 생성됩니다. 인덱스는 키의 위치를 정리해둔 것으로 키가 등록/삭제 되었을 때 키의 위치 기록을 하는 수고를 감수하고, 조회할 때의 성능 이점을 얻기 위해 사용됩니다. 이때 PK를 대상으로 인덱스가 자동으로 생성되는데, 이것을 PK 인덱스라고 합니다. 복합키의 경우 조회 조건의 컬럼 조합에 따라 쿼리 성능이 많이 달라지게 됩니다. 복합키 내에서는 일반적으로 카디널리티가 낮은 순에서 높은 순으로 인덱스를 구성하면, 사용하는 쿼리에서도 무난하게 사용이 가능합니다. 하지만 상황에 따라 인덱스의 컬럼 순서를 변경하거나 추가..
Index RDB에는 데이터를 색인해서 빠르게 찾기 위해 도와주는 Index라는 개념이 존재한다. Mongo DB에도 해당 개념이 존재하는데, 이를 바로 Index라고 한다 ( 용어가 동일 하다 ? ) 이러한 Mongo DB에는 다양한 Index가 존재한다. 1. Single Field Index ( 단일 필드 인덱스 ) - 하나의 필드 인덱스를 사용하는 것을 단일 필드 인덱스라고 합니다. MongoDB에는 기본적으로 컬렉션에 _id라는 단일 필드 인덱스가 생성됩니다. 2. Compound Index ( 복합 인덱스 ) - 두 개 이상의 필드를 사용하는 인덱스를 복합 인덱스라고 부릅니다. - 아래와 같이 인덱스를 생성한다면, 아래 그림과 같이 userid는 오름차순으로 정렬됩니다. 그리고 같은 userid를 지니면..
집계함수 RollUp ROLLUP의 원리 위 이미지가 ROLLUP의 원리를 전부 설명해줍니다. 각 번호는 해당 칼럼으로 GROUP BY를 한 결과를 준다는 뜻입니다. 첫번째 GROUP BY절 같은 경우는 총 4개의 GROUP을 만든다는 뜻 입니다. 예를 들어, 회원유형, 기명/무기명 여부, 집계 대상 컬럼이 존재한다고 가정을 합시다. 결과값으로 나는 회원유형별, 회원유형별, 기명/무기명 여부 별 전체 집계 를 내고 싶다고 할때, 2번 case인 ( 회원 유형, 기명/무기명여부 ) 을 사용한다면, 선투컬럼을 기준으로 회원유형별 Group by 1개 1,2번을 기준으로 회원유형별, 기명/무기명 여부별 한개 그리고 3번인 전체 한가지의 경우를 낼수가 있다. 결론 데이터를 집계하고 싶고, 화면을 동적으로 구성하고 싶다면 RollUp..
테이블의 설계가 잘되었다라는걸 어떻게 증명할수 있을까? 나는 테이블을 설계할때 가장 주의 깊게, 심도있게 설계를 했다. 그렇다보니 당연한게 되었다. 왜 테이블 설계가 잘 되었다라는 걸 생각하지 못했었다. 너무 당연하게 여겨졌던 행동들이었다. 그런데, 가만히 생각해보면 나만 알고 있었다. 남을 설득시켜야 했는데, 그러기 위해서는 체계화 시킬 필요가 있었다. 그렇기에 체계화 해보려고 한다. 이론적인 부분을 설명하고 1정규화, 2정규화, 3정규화, BCNF정규화 내 경험에 비추어서 내가 세운 기준들을 말씀드리려 한다. 1정규화 : 컬럼의 원자이 유지되는가 이다 2정규화 : 특정 기본키에만 종속되는 부분적 종속이 없어야 한다. 3정규화 : 이행적 종속이 없어야 한다. A-> B, A->C일때, B->C를 결정하는걸 이행적 종속이라고 한다. BCNF정규화 : 모든 결..
Lock의 종류 오라클의 Row-level의 Lock에는 Shared Lock과 Exclusive Lock으로 2가지 유형이 존재한다. 1. SharedLock ( 공유 잠금, S Lock ) Shared Lock은 특정 Row를 읽을(read) 때 사용되어지는 Lock이다. Shared Lock끼리는 동시에 접근이 가능하다. 즉, 하나의 Row를 여러 트랜잭션이 동시에 읽을 수 있다는 것이다. 하지만 Shared Lock이 설정된 Row에 Exclusive Lock을 사용할 수는 없다. 즉, 특정 Row를 누가 읽고 있음으로써 Shared Lock이 설정되어 있는데, 다른 사용자가 그 데이터에 쓰기 작업을 하기 위해 Exclusive Lock을 걸 수 없다는 뜻이다. 일반적인 SELECT 쿼리는 Lock을 사용하지 않..
Partition Index 1. 비파티션 인덱스 2. 로컬 파티션 인덱스 3. 글로벌 파티션 인덱스 - 글로벌 파티션 인덱스는 테이블과 독립적인 구성을 갖도록 파티셔닝 하는것을 말한다. - 테이블은 파티셔닝 되어 있지 않을수 있다. - 독립적 구성의 가장 큰 제약조건은, 기존 테이블의 파티션 구성에 변경이 생길때마다 인덱스가 unusable상태로 바끄; 고 그때마다 인덱스를 재생성해야 한다는 것이다.
Batch I/O 인덱스를 경유하는 Table Access는 기본적으로 Single Block I/O를 통한 Random Access 방식으로 접근한다. 그렇기에 Table에 접근해야 하는 경우가 많다면 엄청난 부하를 일으키며 대부분의 성능저하를 유발하는 요인이다. 그렇기에 테이블 접근의 경우수가 많다면 MultiBlock I/O를 사용하는 Table Full Sacn을 사용하는 이유가 여기에 있다. 또한 인덱스는 기본적으로 Buffer Cache를 경유하기 때문에, 접근에 대한 Latch획득 과정또한 시스템에 부하를 주는 요인으로 꼽을 수 있다. 위의 표를 보듯이 결국은 좋은 성능을 내기 위해서는 랜덤 Access를 줄이는 작업을 수행해야 한다는 의미이다. 이 문제점을 해결하기 위해서 오라클 12c 이상의 버전에서는 배..
바인드 변수 기본적으로 오라클은 하드파싱과 소프트파싱을 통해 library cache에 실행계획을 저장한다. 하지만 실행 계획의 저장이 되는 기준은 SQL문이므로 바인드 변수가 아닌 상수를 통해 매번 변경이 되면 그때마다 하드파싱과 소프트 파싱을 병행해 시스템의 성능에 지장을 주게 된다. 그러므로 :custNo같은 바인드 변수명을 동일한 SQL문을 library cache에 저장해 이 cursor을 통해 해당 SQL문이 여러 프로세스에 의해 재사용될수 있게 하는것이다. 하지만 이런 바인드 변수에게도 부작용이 존재한다. 1. 바인드 변수를 바인딩하는 시점은 최적화 시점보다 나중인 실행시점이라는 사실이다. 이는 곧 히스토그램 정보를 사용하지 못해 정확한 카디널리티 파악이 어려워져 비효율적인 실행계획으로 시작될수 있다는 ..