본문 바로가기

데이터베이스/오라클

(18)
집계함수 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. 바인드 변수를 바인딩하는 시점은 최적화 시점보다 나중인 실행시점이라는 사실이다. 이는 곧 히스토그램 정보를 사용하지 못해 정확한 카디널리티 파악이 어려워져 비효율적인 실행계획으로 시작될수 있다는 ..
DB Block, Extends, Segment 1. Data Blocks - DB I/O를 위한 최소한의 논리적인 데이터 단위 2. Extent - Block들을 논리적으로 연결한 Data File에 저장되는 저장단위 - 익스텐트 내 블록들은 물리적이 아닌 논리적으로 인접. - Segment에 논리적으로 인접한 Extent들은 물리적으로 인접하지 않을 수 있음. 3. Segment : - Extent들이 논리적으로 이어진(물리적으로 이어진 것은 아니다) 저장 단위 ( ex) Table ) - 테이블이나 인덱스 같은 Object등을 생성할시 Segment가 생성. - 파티션 테이블과 같은 Partition으로 생성된 경우 1:M 관계를 갖고 그 외에는 1:1 관계를 가짐 - 한 세그먼트는 자신이 속한 Table Space내 여러 Data file에 저..
Buffer Cache Hit Ratio 일반적으로 오라클은 필요한 데이터를 Block(오라클에서 I/O시의 기본적인 입출력 단위)단위로 읽는다. 그리고 Sort Mege Join을 통한 읽기나, 대용량 배치 서비스를 위한 설정을 추가하거나 하지 않는 한 SGA(System Global Area)내의 DB buffer cache를 경유하여 읽는다. 그러므로 Buffer Cache내에서 읽지못해 DISK를 통해 읽을 경우 Buffer Cache에 해당 데이터를 적재한 후에 읽는다. 물리적인 I/O가 위에 해당하는 Disk이고 논리적인 I/O는 Query + current이다. 위에 말한것처럼 항상 Buffer Cache를 경유하여 읽는다고 하였으므로 ((물리적으로 읽은 I/O) / (논리적으로 읽은 I/O)) * 100 인 Buffer Cache..