잊지 않겠습니다.

'Database'에 해당되는 글 2건

  1. 2009.06.24 Index 사용시에 주의할 사항
  2. 2009.06.08 1. 데이터 모델링 주요 개념

 



6 블록 이상의 테이블에 적용하라.
  오라클 데이터베이스에서 1개의 블록크기는 init<SID>.ora 파일에 정의되어 있는 DB_BLOCK_SIZE 파라메터의 값에 의해 결정됩니다. 만약 이 파라메터의 값이 8K (8192 byte)라면 9152 BYTE (8k X 6 블록) 이상 되는 크기의 테이블일 때 인덱스를 사용하는 것이 좋습니다. 다시 말하면, 테이블의 크기가 작은 경우라면 인덱스를 사용하지 않는 것이 더 효과적인 방법입니다. 

이유는 "PARALLEL OPTION"에서 소개된 것 처럼 전체 테이블 스캔인 경우 빠른 검색을 위해 DB_FILE_MULTIBLOCK_READ_COUNT 파라메터가 제공되고 이 파라메터에 의해 한 번에 읽을 수 있는 데이터 블록의 크기가 결정되기 때문에 테이블의 크기가 작은 경우에는 테이블 전체 스캔이 더 유리할 수 있습니다.

다른 예를 한가지 들어 보겠습니다. 만약, 2페이지 밖에 되지 않는 한 권의 책이 있다고 가정해 보겠습니다. 인덱스라는 타이틀이 설명되어 있는 페이지를 찾으려고 합니다.

첫 번째 방법은 먼저 목차를 검색하여 원하는 페이지를 찾은 다음 해당 페이지로 이동하는 방법입니다. 두 번째 방법은 직접 2 페이지를 검색하여 찾는 방법입니다. 한 권의 책을 테이블이라고 생각해 봅시다. 테이블의 크기가 작은 경우에는 인덱스를 찾고 해당 페이지를 검색하는 것이 직접 페이지를 검색하는 것 보다 빠르지 않을 수도 있습니다. 즉, 테이블의 크기가 6블록 이하(크기가 작음)인 경우에는 테이블 전체스캔이 더 빠를 수 있습니다.

컬럼의 분포도가 10 ~ 15% 이내인 경우
  분포도란 WHERE 조건절을 만족하는 행수가 테이블의 전체 행수에서 차지하는 비율을 의미합니다. 다음 공식을 참조하십시오.

 
  분포도 = ( 조건을 만족하는 행수 / 전체행수 ) X 100
   
  즉, 테이블에 100개의 행이 있고 WHERE 조건절을 만족하는 행수가 10개일 때 분포도는 10%가 됩니다. 인덱스를 통해 데이터를 빠르게 검색하는 메커니즘은 10 ~ 15% 의 분포도가 좋은 컬럼에 보다 빠르게 데이터를 찾아줍니다.

분포가 범위 이내라고 하더라도 절대량이 많은 경우에는 해쉬 클러스트를 검토하라.
  데이터를 검색하는 방법 중에 인덱스를 통한 검색방법으로 좋은 성능이 기대되지 않을 때 사용되는 검색기법이 클러스트를 이용한 방법입니다. 인덱스의 구조적 문제로 인해 더 이상의 성능향상이 기대되지 못한다면 클러스트 기법을 고려해야 합니다.

분포도가 범위이상 이더라도 부분범위의 검색이 가능하다면 인덱스를 사용하라.
  테이블의 데이터 분포를 살펴보면 매우 다양합니다. 컬럼의 값들이 골고루 좋은 분포를 보이는 테이블, 컬럼의 어떤 값은 좋은 분포도를 보이지만 어떤 값은 분포도가 너무 나쁜 경우의 테이블 등 매우 다양합니다. 모든 조건이 좋은 경우에는 별 문제가 없겠지만, 좋은 조건과 나쁜 조건이 같이 저장되어 있는 경우에는 분포도는 나쁘더라도 인덱스를 사용하는 것이 유리합니다. 

이런 경우에는, 분포도가 좋은 컬럼은 인덱스를 통해 검색하게 하고, 분포도가 나쁜 컬럼은 테이블 전체 스캔방법으로 검색하게 하는 실행계획을 결정하면 됩니다.

 
SQL > CREATE INDEX i_big_emp_deptno ON big_emp (deptno)
SQL > SET AUTOTRACE ON
SQL > SELECT empno, ename FROM big_emp
WHERE deptno = 80;    분포도가 좋은 컬럼은 인텍스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > SELECT /*+FULL(big_emp)*/
 

empno, ename

  FROM big_emp
  WHERE deptno = 10;     분포도가 나쁜 컬럼은 전체 인덱스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP'

인덱스 만을 검색할 수 있다면 분포도가 나쁘더라도 인덱스를 생성하라.
  인덱스를 통해 데이터를 검색하는 방법에는 2가지가 있습니다. 첫 번째 방법은 인덱스를 먼저 검색한 후 테이블로부터 조건을 만족하는 행을 검색하는 방법입니다. 다음 예제를 보십시오.

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
Select절에 열거된 컬럼들을 index에 존재하지 않기 때문에 인덱스 검색후 테이블로부터 해당 컬럼을 검색해야 함니다.
 
이번 예제도 인덱스를 통해 검색하는 방법입니다. 하지만 조금전에 실행된 SQL문과 차이점은 개발자가 실행한 SQL문의 SELECT절에 정의된 컬럼이 검색하려는 인덱스에 존재하기 때문에 인덱스만 검색하면 조건을 만족하는 행을 모두 찾게 되는 경우입니다. 
이러한 검색 방법을 빠른 인덱스 스캔(Fast Index Scan) 이라고 합니다. 

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > DROP INDEX i_big_emp_depton;

https://www.dbguide.net/dbqa/oracle_tune/common/detail1-2.html 에서 무단으로 긁어오기..
언제나 느끼는 것이지만.. 아는 것이 없다. 난. -_-
Posted by Y2K
,
식별자 (PK, FK)
: database에서의 index.

대표헝 여부에 따른 분류 : 주식별자, 보조 식별자
생성 여부 : 내부 식별자, 외부 식별자
단일 속성 여부 : 단일 식별자, 복합 식별자
대체 여부 : 원조 식별자, 대리 식별자

주식별자 / 보조 식별자
: Entity type을 유일하게 식별할 수 있게 하는 특징을 가짐.
: 해당 업무에 적합한 식별자를 주 식별자로 이용한다. (카드사에서 카드번호와 주민번호 중에서 카드 번호를 주 식별자로 이용하는 경우)

내부 식별자 / 외부 식별자
: 내부 식별자 : 자신의 entity type에서 스스로 생성되서 존재하는 식별자
: 외부 식별자 : 다른 entitiy type에서 관계에 의해 주식별자 속성을 상속받아서 사용되는 경우(FK)

단일 식별자 / 복합 식별자
단일 식별자 : 주식별자의 속성이 한가지 속성으로 구성된 경우
복합 식별자 : 주식별자의 속성이 두가지 이상의 속성으로 구성된 경우

원조 식별자 / 대리 식별자 
대리 식별자 : 여러개의 속성을 묶어서 하나의 속성을 만들어 주식별자로 사용하는 경우


관계(Relationship)
: 행위에 의한 관계, 존재에 의한 관계로 분류 가능
존재에 의한 관계 : 기본 entity type 사이의 관계를 의미
행위에 의한 관계 : event의 발생에 따라 생성되는 성격을 가지고 있다. 

정규화
특징
1. 정규화는 적절한 Entity type에 각각의 속성을 배치하고 Entity type을 충분히 도출해가는 단계적인 분석 방법이다.
2. 정규화 기술은 Entity type에 속성들이 상호 종속적인 관계를 갖는 것을 배경으로 종속관계를 이용하여 Entity type을 정제하는 방법이다.
3. 각각의 속성들이 데이터 모델에 포함될 수 있는 정규화의 원리를 이용하여 데이터를 분석하는 방법에서 활용될 수 있다. 
4. 정규화는 현재 데이터를 검증할 수 있고, 데이터의 표현관점에서 Entity type을 정의하는 데 이용할 수 있다. 
5. 정규화는 Entity type을 object 별로 분석하는 법이 아닌 개별 데이터를 이용한 수학적 접근 방법을 이용해 분석 한다. 

: 일반적으로 Object 분석 방법에 의해서 도출하게 된다. 그러나, Object 분석 방법에 의한 도출 역시 제 3 정규화 규칙이 모델링 작업의 기초에 관여하고 있다. 
: 정규화 규칙을 이용한 검증이 가능하다. 

정규화 단계
1차 정규화
: 복수의 속성값을 분리
: 복수의 속성값이 없는 경우에는 1차 정규화 대상이 아니다.

2차 정규화
: 주 식별자에 종속적이지 않은 속성의 분리
: 부분 종속적 속성의 분리
: 자신의 Table에 주식별자를 구성하는 속성이 복합 식별자인 경우에만 해당된다. 

3차 정규화
: 속성에 종속적인 속성의 분리
: 이전 속성(Transitive Dependency)의 분리
: 주식별자가 아닌 속성중에서 식별자가 되는 경우에 그 식별자와 그에 종속된 속성을 분리한다.

보이스-코드 정규화
다수의 주 식별자 분리
: 1, 2, 3차 정규화가 모두 마쳐진 후에 가능
: 주 식별자가 다수가 되는 경우에는 삭제, 업데이트, 입력시에 에러가 발생할 수 있기 때문에 최대한 없애는 것이 좋다.

4차 정규화
: Multi-Valued Dependency 속성 분리

5차 정규화
: 결합 종속인 경우는 두개 이상의 N으로 분리





Posted by Y2K
,