1. Altibase SQL 소개#
이 장에서는 Altibase SQL의 특징과 구성에 대해서 간략하게 소개하고 있다.
SQL 개요#
SQL(Structured Query Language)은 데이터베이스 객체를 정의하고 관리하며, 데이터베이스의 데이터를 조작하고 검색하기 위한 언어이다. 이 절은 Altibase의 SQL 특성에 대해 기술한다.
Altibase SQL 특징#
빠른 질의 성능#
Altibase의 경우 대부분의 질의들에 대해 SQL 준비 (PREPARE)과정 후 실행하기 전까지 시스템 카탈로그 정보가 변하지 않는 점에 착안해서 준비과정에서 최적화된 실행 계획 트리(execution plan tree)를 만들어 두고 실행시에는 이 실행 계획 트리를 사용하도록 하여 실제 질의가 반복 실행될 때의 수행속도를 대폭 향상시켰다. 이와 같은 방법은 초기 데이터베이스 스키마 생성 후 데이터 정의어(DDL) 구문의 수행은 거의 일어나지 않고 데이터 조작어(DML) 구문의 수행이 빈번한 응용 애플리케이션에 매우 유용하다.
SQL/92 표준 지원#
Altibase SQL은 SQL/92 표준 사양을 지원하므로 다른 데이터베이스의 SQL 사용 경험이 있는 사용자들은 별도의 숙지 없이 Altibase를 쉽게 사용할 수 있다.
강력한 부질의(subquery) 지원#
일반적으로 부질의는 SELECT 구문, CREATE TABLE ~ AS SELECT 구문, INSERT ~ SELECT 구문의 수식과 IN 절에 주로 사용된다. 여기에 사용되는 부질의는 대부분 여러 칼럼의 여러 레코드를 검색해 준다.
Altibase의 경우 부질의의 결과가 하나의 값(한 레코드의 한 칼럼)일 경우, 그 부질의는 상수값 대신에 사용할 수 있으며 부질의는 빠른 검색을 지원하므로, 여러 SQL문으로 처리하는 것보다 부질의를 포함하는 SQL문으로 처리하는 것이 더 낫다. 따라서 복잡한 응용 애플리케이션에서 부질의는 유용하다.
다양한 시스템 제공 함수 지원#
SQL/92의 표준 사양 이외에 Altibase는 사용자에게 유용한 다양한 시스템 함수를 지원한다.
질의 최적화와 실행 계획#
질의 성능을 높이기 위해서는 SQL구문을 효과적으로 작성해야 한다. Altibase가 SQL구문을 처리하는 방식을 이해하는 것은 최적화된 SQL구문을 작성하는데 도움이 될 것이다.
Altibase에서의 SQL문 처리 과정은 크게 준비(PREPARE) 과정과 실행(EXECUTE) 과정으로 나뉘어진다.
- 준비 과정
SQL문의 문법을 분석하여 정당성을 검사하고 최적화 한 후 실행 계획을 수립해 실행 계획 트리(execution plan tree)를 생성하는 과정이다. 이 과정에서 메타 테이블에 접근해 테이블과 인덱스 정보 등을 읽어서 최적화된 접근 계획을 수립한다.
따라서 클라이언트가 direct execution 대신에 준비와 실행을 나뉘어서 수행한다면, 준비 후 메타의 변경이 일어나지 않아야 준비(PREPARE) 과정에서 생성된 실행 계획 트리가 실행시에 수정 없이 그대로 사용될 수 있다. 예를 들어, 준비 과정에서 존재했던 인덱스가 실행 과정에서는 존재하지 않는다면 준비 과정에서 인덱스를 사용하는 것으로 최적화된 실행 계획 트리는 실행 과정에서는 무효한 것이 되어 사용할 수 없게 된다. - 실행 과정
준비 과정에서 생성된 실행 계획에 따라 질의문을 실제로 수행하는 과정이다. 클라이언트가 호스트 변수를 사용한 SQL문을 prepare 한 후 호스트 변수 값을 변경하면서 여러번 수행하는 경우, 준비 과정은 한번 수행되고 변수값 설정과 실행 과정은 여러번 수행된다.
SQL문 분류#
Altibase가 지원하는 전체 SQL문은 다음과 같이 분류된다.
- 데이터 정의어 (DDL)
- 데이터 조작어 (DML)
- 데이터 제어어 (DCL)
이 장에서는 각 SQL문에 대해 간략히 소개한다.
자세한 사용방법은 3장 데이터 정의어, 4장 데이터 조작어, 5장 데이터 제어어를 참조한다.
데이터 정의어(DDL)#
DDL(Data Definition Language)은 데이터베이스 객체를 정의하고 변경하는데 사용된다.
SQL 문 | 설명 |
---|---|
ALTER DATABASE | 데이터베이스 정의 변경 |
ALTER INDEX | 인덱스 정의 변경 |
ALTER JOB | 작업(JOB) 변경 |
ALTER REPLICATION | 이중화의 정의 변경 |
ALTER SEQUENCE | 시퀀스의 정의 변경 |
ALTER TABLE | 테이블의 정의 변경 |
ALTER TABLESPACE | 테이블스페이스 정의 변경 |
ALTER TRIGGER | 트리거 정의 변경 |
ALTER USER | 사용자의 암호 변경 |
ALTER VIEW | 뷰 재 컴파일 |
CONJOIN TABLE | 논 파티션드 테이블을 파티션드 테이블의 파티션으로 변환 |
CREATE DATABASE | 데이터베이스 생성 |
CREATE DIRECTORY | 저장 프로시저 내에서 파일 처리를 위한 디렉토리 객체 생성 |
CREATE INDEX | 인덱스 생성 |
CREATE JOB | 작업(JOB) 생성 |
CREATE QUEUE | 큐 생성 |
CREATE REPLICATION | 이중화 생성 |
CREATE SEQUENCE | 시퀀스 생성 |
CREATE SYNONYM | 객체의 별칭(시노님) 생성 |
CREATE TABLE | 테이블 생성 |
CREATE TABLESPACE | 테이블스페이스 생성 |
CREATE TRIGGER | 트리거 생성 |
CREATE USER | 사용자 생성 |
CREATE VIEW | 뷰 생성 |
DISJOIN TABLE | 파티션을 논 파티션드 테이블로 변환 |
DROP DIRECTORY | 디렉토리 객체 삭제 |
DROP INDEX | 인덱스 삭제 |
DROP JOB | 작업(JOB) 삭제 |
DROP QUEUE | 큐 삭제 |
DROP REPLICATION | 이중화 삭제 |
DROP SEQUENCE | 시퀀스 삭제 |
DROP SYNONYM | 시노님 삭제 |
DROP TABLE | 테이블 삭제 |
DROP TABLESPACE | 테이블스페이스 삭제 |
DROP TRIGGER | 트리거 삭제 |
DROP USER | 사용자 삭제 |
DROP VIEW | 뷰 삭제 |
FLASHBACK TABLE | 휴지통의 테이블 복원 |
GRANT | 권한 부여 |
PURGE TABLE | 휴지통의 테이블 제거 |
RENAME | 테이블 이름 변경 |
REVOKE | 권한 취소 |
TRUNCATE TABLE | 테이블의 모든 레코드 삭제 |
[표 1‑1] 데이터 정의어 목록
메타 정보가 변경되는 위의 DDL 구문들이 수행되면 그 세션의 현재 시작되어 있는 트랜잭션은 종료되고 새로운 트랜잭션으로 그 DDL 문이 처리된 후 그 트랜잭션은 종료된다. 즉 DDL 문은 하나의 트랜잭션으로 처리되는 SQL문들이다. 다시 말해서 AUTOCOMMIT 모드가 비설정(OFF)된 상태에서 데이터 조작어(DML)를 수행하고 명시적으로 커밋(COMMIT)을 호출하지 않았다 하더라도 위의 SQL문들을 수행하면 Altibase 내부적으로 이전에 수행된 데이터 조작어(DML)들이 모두 묵시적으로 커밋된다. 즉, 위 DDL문을 수행하기 전에 수행된 DML 트랜잭션은 DDL문 수행 후 롤백문을 이용해 철회될 수 없다.
데이터 조작어(DML)#
DML(Data Manipulation Language) 문은 데이터를 조작하는데 사용된다. 데이터 정의어(DDL)와 달리 AUTOCOMMIT 모드가 비설정(OFF) 되어 있는 상태에서 DML문을 수행하면 수행 후 묵시적으로 커밋되지 않는다. 따라서, AUTOCOMMIT 모드가 비설정(OFF)된 상태에서 어떤 트랜잭션이 여러 개의 DML문을 수행하고 롤백(rollback)을 호출하면 그 트랜잭션은 철회된다.
SQL 문 | 설명 |
---|---|
DELETE | 데이터의 삭제 |
INSERT | 데이터의 삽입 |
LOCK TABLE | 특정한 모드에서 테이블 잠금 |
SELECT | 데이터의 검색 |
UPDATE | 데이터의 변경 |
MOVE | 한 테이블에서 다른 테이블로 데이터 이동 |
ENQUEUE | 메시지를 큐에 삽입 |
DEQUEUE | 메시지를 큐에서 꺼내고 큐에서 삭제 |
[표 1‑2] 데이터 조작어 목록
데이터 제어어(DCL)#
DCL(Data Control Language) 문은 데이터를 제어하는데 사용된다.
세션 제어문과 트랜잭션 제어문은 각 세션에만 영향을 미치고 다른 세션에는 영향을 미치지 않는다.
이중화 객체 제어문#
SQL 문 | 설명 |
---|---|
ALTER REPLICATION...STOP/FLUSH | 이중화 객체 제어 |
[표 1‑3] 이중화 객체 제어문 목록
데이터베이스 링크 객체 제어문#
SQL 문 | 설명 |
---|---|
ALTER DATABASE LINKER | 데이터베이스 링크 시작, 종료 |
[표 1‑4] 데이터베이스 링크 객체 제어문 목록
시스템 제어문#
SQL 문 | 설명 |
---|---|
ALTER SYSTEM | 프로퍼티 변경, 체크포인트와 데이터베이스 백업 수행 |
[표 1‑5] 시스템 제어문 목록
세션 제어문#
SQL 문 | 설명 |
---|---|
ALTER SESSION | 세션의 프로퍼티 변경 |
[표 1‑6] 세션 제어문 목록
트랜잭션 제어문#
SQL 문 | 설명 |
---|---|
COMMIT | 트랜잭션 정상 종료 |
ROLLBACK or ROLLBACK TO SAVEPOINT savepoint_name |
트랜잭션 전체 철회 또는 savepoint_name 시점으로 트랜잭션 부분 철회 |
SAVEPOINT savepoint_name | 트랜잭션내에서 마커 설정 |
SET TRANSACTION | READ-ONLY 또는 READ-WRITE 트랜잭션 시작, 또는 트랜잭션의 ISOLATION LEVEL 설정 변경 |
[표 1‑7] 트랜잭션 제어문 목록
감사(Audit) 제어문#
SQL 문 | 설명 |
---|---|
AUDIT | 감사 조건 설정 |
DELAUDIT | 감사 조건 삭제 |
NOAUDIT | 감사 조건 해제 |
[표 1‑8] 감사 제어문 목록