뷰의 장점
- 뷰는 복잡한 질의를 간단하게 표현할 수 있게 함
- 데이터 무결성을 보장하는데 활용됨
- 기본적으로 뷰를 통해 튜플을 추가하거나 수정할 때 튜플이 뷰를 정의하는 SELECT문의 WHERE절의 기준에 맞지 않으면 뷰의 내용에서 사라짐
- 뷰를 정의할 때, WITH CHECK OPTION을 명시했다고 가정
- 뷰는 데이터 독립성을 제공함
- 뷰는 데이터베이스의 구조가 바뀌어도 기존의 질의(응용 프로그램)를 다시 작성할 필요성을 줄이는 데 사용될 수 있음
- Ex) 응용 프로그램의 요구사항이 변경되어 기존의 EMPLOYEE가 EMP1, EMP2로 나뉘어 졌을 때, 기존의 SELECT문은 EMP1과 EMP2에 대한 SELECT문으로 변경해야 할 필요가 새임
- 그러나 VIEW를 정의한다면 응용 프로그램에서 초기 EMPLOYEE 릴레이션을 접근하던 SELECT문은 계속해서 수행가능함
- 뷰는 데이터 보안 기능을 제공함
- 뷰는 뷰의 원본이 되는 기본 릴레이션에 직접 접근할 수 있는 권한을 부여하지 않고 뷰를 통해 데이터를 접근하도록 하기 때문에 보안 메커니즘으로 사용할 수 있음
- 뷰는 일반적으로 기본 릴레이션의 일부 애트리뷰트들 또는 일부 튜플들을 검색하는 SELECT문으로 정의되므로 뷰를 통해서 기본 릴레이션을 접근하면 기본 릴레이션의 일부만 검색할 수 있음
- Ex) EMPLOYEE 릴레이션의 SALARY 애트리뷰트는 숨기고 나머지 애트리뷰트에 대해서 사용자들이 접근할 수 있게 하려면 SALARY를 제외하고 EMPLOYEE의 모든 애트리뷰트를 포함하는 뷰를 정의하고, 사용자에게 뷰에 대한 SELECT 권한을 허가
- 동일한 데이터에 대한 여러 가지 뷰를 제공함
- 뷰는 사용자들의 그룹이 각자 특정한 기준에 따라 데이터를 접근하도록 함
뷰의 갱신
- 뷰에 대한 갱신도 기본 릴레이션에 대한 갱신으로 변환됨
- 아래의 갱신들이 성공적으로 수행될 수 있는가?
- 갱신 1: 한 릴레이션 위해서 정의된 뷰에 대한 갱신 (조건부 가능)
- 갱신 2: 두 개의 릴레이션 위에서 정의된 뷰에 대한 갱신 (불가)
- 갱신 3: 집단 함수 등을 포함한 뷰에 대한 갱신(불가)
- 갱신이 불가능한 뷰
- 한 릴레이션 위에서 정의되었으나 그 릴레이션의 기본 키가 포함되지 않은 뷰
- 기본 릴레이션의 애트리뷰트들 중에서 뷰에 포함되지 않은 애트리뷰트에 대해 NOT NULL이 지정되어 있을 때
- 집단 함수가 포함된 뷰
- 조인으로 정의된 뷰
시스템 카탈로그
- 시스템 카탈로그는 데이터베이스의 객체(사용자, 릴레이션, 뷰, 인덱스, 권한 등)와 구조들에 관한 모든 데이터를 포함
- 시스템 카탈로그를 메타데이터라고 함. 메타데이터는 데이터에 관한 데이터라는 의미
- 시스템 카탈로그는 사용자 및 질의 최적화 모듈 등 DBMS 자신의 구성요소에 의해서 사용됨
- 시스템 카탈로그는 관계 DBMS마다 표준화되어 잇지 않아서 관계 DBMS마다 서로 다른 형태로 시스템 카탈로그 기능을 제공함
- 시스템 카탈로그는 데이터 사전(data dictionary) 또는 시스템 테이블 이라고도 부름
시스템 카탈로그가 질의 처리에 어떻게 활용되는가?
- SELECT문이 문법적으로 정확한가를 검사함
- SELECT문에서 참조하는 EMPLOYEE 릴레이션이 데이터베이스에 존재하는가를 검사함
- EMPLOYEE 릴레이션에 SELECT절에 열거된 애트리뷰트와 WHERE절에서 조건에 사용된 애트리뷰트가 존재하는가를 확인함
- SALARY 애트리뷰트가 수식에 사용되었으므로 이 애트리뷰트의 데이터 타입이 숫자형( 정수형이나 실수형) 인가를 검사하고, TITLE이 문자열과 비교되었으므로 이 애트리뷰트의 데이터 타입이 문자형(CHAR(n) 또는 VARCHAR(n) 등) 인가 등을 검사함
- 이 질의를 입력한 사용자가 EMPLOYEE 릴레이션의 EMPNAME, SALARY 애트리뷰트를 검색할 수 있는 권한이 있는가를 확인함
- TITLE 애트리뷰트와 DNO 애트리뷰트에 인덱스가 정의되어 있는지 확인함
- 두 애트리뷰트에 각각 인덱스가 존재한다고 가정하자, DBMS가 두 인덱스 중에서 조건을 만족하는 튜플 수가 적은 것을 선택하기 위해서는 관계 데이터베이스 시스템에 데이터베이스 외에 추가로 정보(카디널 리티 등)를 유지해야 함
- 한 릴레이션의 전체 튜플 수와 그 릴레이션에 정의된 각 인덱스에 존재하는 상이한 값들의 개수를 유지한다면 어느 인덱스를 사용하는 것이 유리한가를 예상할 수 있음
- EMPLOYEE 릴레이션의 전체 튜플 수는 7이고, TITLE 애트리뷰트에는 사원, 대리, 과장, 부장, 사장 다섯 가지 값이 존재한다고 가정하고
- DNO 애트리뷰트에는 1, 2, 3의 세 가지 값들이 존재한다고 가정했을 때
- TITLE 애트리뷰트에 정의된 인덱스가 DNO에 정의된 인덱스보다 대상 튜플들을 더 좁혀 주므로 유리함.
질의 최적화
- DBMS가 질의를 수행하는 여러 가지 방법들 중에서 가장 비용이 적게 드는 방법을 찾는 과정
- 질의 최적화 모듈이 정확한 결정을 내릴 수 있도록 DBMS는 자체 목적을 위해서 시스템 카탈로그에 다양한 정보를 유지함
- 사용자가 질의 최적화 모듈을 깊이 있게 이해할 필요는 없지만 질의 최적화 모듈이 정확한 수행 방법을 결정하기 위해서는 릴레이션에 관한 다양한 통계 정보가 정확하게 유지돼야 한다는 것을 알고 있는 것이 바람직
관계 DBMS의 시스템 카탈로그
- 사용자 릴레이션과 마찬가지 형태로 저장되기 때문에 사용자 릴레이션에 적용되는 회복 기법과 동시성 제어 기법을 동일하게 사용할 수 있음
- 시스템 카탈로그는 사용자 릴레이션처럼 SELECT문을 사용하여 내용을 검색할 수 있음
- 시스템 카탈로그에는 릴레이션, 애트리뷰트, 인덱스, 사용자, 권한 등 각 유형마다 별도의 릴레이션이 유지됨
- EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션에 대해서 시스템 카탈로그에 어떤 정보들이 유지되는가를 이해하기 쉽도록 시스템 카탈로그를 매우 단순화하여 설명함
- 릴레이션에 관한 정보를 유지하는 릴레이션의 이름이 SYS_RELATION, 애트리뷰트에 관한 정보를 유지하는 릴레이션의 이름이 SYS_ATTRIBUTE라고 가정
시스템 카탈로그의 갱신
- 어떤 사용자도 시스템 카탈로그를 직접 갱신할 수 없음
- 즉 DELETE, UPDATE 또는 INSERT문을 사용하여 시스템 카탈로그를 변경할 수 없음
- EMPLOYEE 릴레이션의 소유자인 KIM이 EMPLOYEE 릴레이션에서 MANAGER 애트리뷰트를 삭제하기 위해서
ALTER TABLE EMPLOYEE DROP COLUMN MANAGER;
- 라고 하는 대신에 아래와 같이 시스템 카탈로그에 대해 DELETE문을 사용하면 DBMS가 거절함
DELETE FROM SYS_ATTRIBUTE
WHERE AttRelId = 'EMPLOYEE' AND AttName = 'MANAGER';
시스템 카탈로그에 유지되는 통계 정보
- 릴레이션마다
- 튜플의 크기
- 튜플 수
- 각 블로의 채우기 비율
- 블록킹 인수
- 릴레이션의 크기(블록 수)
- 뷰마다
- 뷰의 이름
- 뷰의 정의
- 애트리뷰트마다
- 애트리뷰트의 데이터 타입과 크기
- 애트리뷰트 내의 상이한 값들의 수
- 애트리뷰트 값의 범위
- 선택율(조건을 만족하는 튜플 수/전체 튜플 수)
- 사용자마다
- 접근할 수 있는 릴레이션과 권한
- 인덱스마다
- 인덱스 된 애트리뷰트 (키 애트리뷰트 또는 비 키 애트리뷰트)
- 클러스터링 인덱스/비 클러스터링 인덱스 여부
- 밀집/희소 인덱스 여부
- 인덱스의 높이
- 1단계 인덱스의 블록 수
MS SQL Server의 시스템 카탈로그
- 통계 정보는 UPDATE STATISTICS문을 사용하여 수동으로 갱신할 수 있음
- SQL Server는 릴레이션의 데이터가 변경될 때 주기적으로 통계 정보를 자동으로 갱신함
- 통계 정보를 갱신할 필요성이 있는가를 확인하기 위해서 샘플링 방법을 사용함
- 통계 정보가 갱신되는 빈도는 애트리뷰트 또는 인덱스의 크기와 변경되는 데이터의 양에 따라 결정됨
- 모든 릴레이션들에 대한 구성을 정의하는 데이터를 시스템 테이블이라고 부는 특수한 테이블 집합에 저장함
- 사용자나 응용 프로그램이 정보 스키마 뷰, Transact-SQL문 및 함수, 시스템 저장 프로시저 등을 사용하여 시스템 테이블에 저장된 정보를 검색함
- 시스템 테이블을 사용하여 사용자 KIM이 소유한 대체들을 찾기 위해 쿼리 분석기의 편집기 창에서 질의 수행 시
- OWNER는 개체를 소유한 사용자의 식별자, NAME은 개체의 이름을 나타냄
- xtype은 개체의 유형
- C는 CHECK 제약 조건
- D는 DEFAULT값 제약 조건
- F는 외래 키 제약조건
- PK는 기본 키 제약 조건
- U는 사용자 릴레이션
- UQ는 UNIQUE 제약조건
- V는 뷰를 나타냄
SELECT SYSUSERS.NAME AS OWNER, SYSOBJECTS.NAME, SYSOBJECTS.xtype
FROM SYSOBJECTS, SYSUSERS
WHERE SYSOBJECTS.UID = SYSUSERS.UID
AND SYSUSERS.NAME = 'KIM';
- INFORMATION_SCHEMA를 사용하여 사용자 KIM이 소유한 릴레이션이나 뷰에 관한 정보를 검색하기 위해 질의 수행 시
- TABLE_CATALOG는 데이터베이스의 이름
- TABLE_SCHEMA는 릴레이션이나 뷰를 소유한 사용자의 식별자
- TABLE_NAME은 릴레이션이나 뷰의 이름
- TABLE_TYPE은 릴레이션의 유형으로서 BASE TABLE 또는 VIEW가 될 수 있음
SELECT *
FROM INFROMATION_SCHEMA.TABLES
WHERE TABLE_SCEHMA='KIM';
- INFORMATION_SCHEMA를 사용하여 사용자 KIM이 소유한 EMPLOYEE 릴레이션의 애트리뷰트 정보를 찾기 위해서 질의 수행 시
- COLUMN_NAME은 애트리뷰트의 이름
- ORDINAL_POSITION은 애트리뷰트의 번호(ID)
- DATA_TYPE은 데이터 타입
- COLUMN_DEFAULT는 애트리뷰트의 디폴트 값
SELECT COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEE';
- EMPLOYEE 릴레이션이 사용하는 디스크 공간 정보를 알기 위해서 시스템 저장 프로시저를 수행
- name은 릴레이션의 이름
- rows는 튜플의 수
- reserved는 예약된 총 공간
- data는 실제로 사용되는 공간
- index_size는 인덱스가 사용하는 공간
- unused는 사용되지 않은 공간
sp_spaceused EMPLOYEE;
- EMPLOYEE 릴레이션의 부서 번호를 애트리뷰트인 DNO에 대해 인덱스를 생성하고, 생성된 인덱스를 통해서 통계 정보 확인
- Updated는 통계가 마지막으로 갱신된 날짜와 시간
- Rows는 릴레이션의 튜플 수
- RANGE_HI_KEY는 DNO 애트리뷰트에 나타나는 상이한 값들
- EQ_ROWS는 DNO 값이 1인 튜플의 수, 2인 튜플의 수... N인 튜플의 수를 나타냄
CREATE INDEX EMPDNO_IDX ON EMPLOYEE(DNO);
DBCC SHOW_STATISTICS(EMPLOYEE, EMPDNO_IDX);
- 릴레이션에 정의된 인덱스에 관한 정보를 검색하려면 sp_helpindex를 실행
- index_name은 인덱스의 이름
- index_description은 인덱스에 관한 설명
- index_keys는 인덱스가 정의된 애트리뷰트를 나타냄
출처
'Computer Science > DataBase' 카테고리의 다른 글
트랜잭션(2) (0) | 2022.04.22 |
---|---|
트랜잭션(1) (0) | 2022.04.22 |
뷰와 시스템 카탈로그(1) (0) | 2022.04.20 |
릴레이션 정규화 (0) | 2022.04.20 |
물리적 데이터베이스 설계 (0) | 2022.04.15 |