시스템 카탈로그
1. 개요
- 어떤 DB 시스템 내에 있는 릴레이션, 뷰, 인덱스, 사용자 접근 권한 등 여러 객체에 관한 메타데이터를 그 DB의 시스템 카탈로그(system catalog)라 한다. 다른 이름으로 데이터 사전(data dictionary), 시스템 테이블(system table)이라고도 한다.
- 시스템 카탈로그는 DB 시스템 내 여러 정보를 조회할 때 사용되는데, 특히 DBMS에 입력된 쿼리를 최적화해서 레코드를 검색하는 것과 같은 경우에 사용되므로 DB 시스템의 효율적 사용이라는 관점에서 시스템 카탈로그의 관리는 중요한 문제가 된다.
- 시스템 카탈로그는 일반적으로 DB 시스템 내 각 객체마다 그 객체의 정보가 담긴 릴레이션의 형태로 그 DB 시스템 내에 존재하며, SQL 표준은 INFORMATION_SCHEMA라는 이름의 릴레이션 집합을 통해 각 릴레이션에 접근하도록 한다(예를 들어, DB 시스템 내의 릴레이션들에 관한 메타데이터는 INFORMATION_SCHEMA.tables라는 릴레이션에 담겨있는 식). 다만 모든 DBMS가 이를 따르는 것은 아니며 다른 이름으로 시스템 카탈로그가 담긴 릴레이션에 접근하는 경우도 있다.
- 메타데이터가 담긴 릴레이션에 대해서는 사용자가 정보를 직접 수정/삭제/삽입할 권한이 주어지지 않는다. 따라서 어떤 사용자가 시스템 카탈로그가 아닌 어떤 일반 릴레이션의 스키마를 변경할 권한이 있는 경우, DDL을 사용해 그 릴레이션의 스키마를 변경하는 것은 가능하나, 시스템 카탈로그 정보가 담긴 릴레이션을 직접 조작하는 쿼리를 입력하는 식으로 그 릴레이션의 스키마를 변경할 수는 없다.
2. DBMS의 쿼리 처리 과정에서 시스템 카탈로그를 활용하는 방법
1
SELECT field1*3 FROM table1 WHERE field1 > 0 AND field2 = "아침"
위와 같은 쿼리가 입력됐을 때 DBMS는 시스템 카탈로그를 확인해 다음과 같은 처리를 진행한다.
(1) table1라는 릴레이션이 DB 내에 있는지 확인한다.
(2) table1라는 릴레이션 내에 field1, field2라는 속성이 있는지 확인한다.
(3) field1의 변수형이 수식을 쓸 수 있는 변수형인지, field2의 변수형이 문자열인지 확인한다.
(4) 쿼리를 입력한 사용자가 table1 및 이 릴레이션의 field1, field2 속성에 대해 접근 권한이 있는지 확인한다.
(5) WHERE 구문에 나타나는 field1, field2 속성에 대한 인덱스가 DB 내에 존재하는지 확인한다.
-
둘 다 없다면 순차탐색을 하고, 하나만 있다면 그 하나를 기준으로 조건에 맞는 레코드를 탐색한다.
-
둘 다 인덱스가 있다면, 시스템 카탈로그를 확인하여 둘 중 어느 조건을 만족하는 레코드 수가 더 적은지를 확인하고 그 조건에 해당하는 속성을 기준으로 레코드를 탐색한다.
- ‘어떤 조건을 만족하는 레코드 수’를 비교하기 위해 시스템 카탈로그에 저장해두는 값으로서 선택률(selectivity)이라는 개념이 있다. 그 릴레이션에 속하는 전체 레코드 개수 중 조건을 만족하는 레코드 수의 비율로 계산한다.
3. 시스템 카탈로그의 통계 정보
- 쿼리 처리 과정에서 DBMS가 시스템 카탈로그 내에서 확인하는 통계 정보로 선택률 등의 정보가 있으며, 이러한 통계 정보는 DBMS에 새 쿼리가 입력될 때마다 함께 업데이트 될 수 있는 정보라 할 수 있다. 예를 들어 DBMS에 새로 쿼리가 입력됐는데 그 쿼리에 어떤 속성에 관한 조건식이 있다면 그 쿼리가 입력됨으로써 그 속성에 관한 선택률을 업데이트할 수 있는 정보가 생긴 셈이다. 그러나 실제로는 갱신의 overhead가 크기 때문에, 실제 DBMS에서는 새로 쿼리가 들어왔다 해서 매번 새로 선택률을 갱신하지는 않고 주기적으로 통계 정보를 갱신한다. (갱신 빈도는 인덱스 크기, 변경되는 데이터의 양 등의 요인에 의해 높아지거나 낮아질 수 있다.)