INDEX 는 데이타베이스내의 relation(테이블)에 대한 검색의 성능을 높여준다.
CREATE [UNIQUE] INDEX index_name
ON table_name (name_of_attribute);
CREATE [UNIQUE] INDEX index_name ON table_name
[USING acc_name] (column [ops_name] [,...]);
CREATE [UNIQUE] INDEX index_name ON table_name
[USING acc_name] (func_name() ops_name );
acc_name : ACCESS METHOD . 디폴트는 BTREE 이다.(BTREE,RTREE,HASH)
func_name : 사용자 정의 함수.
ops_name : operator class (int4_ops,int24_ops,int42_ops)
btree(sid int4_ops) 는 btree 를 이용한 INDEX 자료형이 4-BYTE 정수임.
디폴트 operator class 는 Field Type 이다.
현재 btree 는 7개까지의 Multi-Column INDEX를 지원한다.
example 1) INDEX 생성 1
CREATE INDEX indx1
ON supplier(sid);
supplier relation(테이블) 의 sname attribute(column) 을 INDEX 로 지정
example 2) INDEX 생성 2
CREATE INDEX indx2
ON supplier USING btree(sid int4_pos);
example 3) INDEX 생성 3
CREATE INDEX indx3
ON supplier USING btree(sid int8_ops);
example 4) INDEX 생성 4
CREATE INDEX indx4
ON supplier USING btree(sid, tid);
example 5) INDEX 삭제
DROP INDEX indx1;
DROP INDEX indx2;
DROP INDEX indx3;
DROP INDEX indx4;
SEQUENCE 는 순차적인 숫자 발생기이다.
CREATE SEQUENCE seq_name [INCREMENT increment]
[MINVALUE minvalue] [MANVALUE maxvalue]
[START start] [CACHE cache] [CYCLE]
INCREMENT : 이값이 -1 이면 -1 만큼 감소 , 3 이면 3씩 증가, 디폴트는 1 이다.
MAXVALUE : optional clause , 증가할수 있는 최고값을 명시적으로 지정
START : 시작값
CACHE : sequence 값을 먼저 메모리에 할당하여 빠른 ACCESS 를 가능케 한다.
CYCLE : 최고값으로 증가되면 다시 최소값으로 순환하게 한다.
CREATE SEQUENCE seq_name1 START 101;
SELECT NEXTVAL('seq_name1);
결과
nextval
-------
114
FUNCTION 은 새로운 함수를 정의한다.
CREATE FUNCTION func_name([type[,...]])
RETURNS return_type [with (attribute [,...])]
AS ' definition '
LANGUAGE 'language_name';
LANGUAGE : sql, pgsql, c 등이 있다.
CREATE FUNCTION test() RETURNS int4
AS ' SELECT 1 '
LANGUAGE 'sql';
실행
SELECT test() AS answer;
결과
answer
------
1
AS ' 와 ' 사이에 함수의 본문을 기입하면 된다. 참고로 문자열일 경우,
'seq_test1' 와 같은 경우 다음처럼 한다.
CREATE FUNCTION test() RETURNS int4
AS ' SELECT NEXTVAL(''seq_test1'') '
LANGUAGE 'sql';
여기서 NEXTVAL 은 SEQUENCE 관련 내장함수이다.
다음 예제의 이름은 test.sql 입니다. 다음 예제를 화일로 만들어 다음처럼 실행하시면 됩니다.
-------------------------------------------------------cut here!!
--code By nogadax@chollian.net /2000/02/18
--drop all object for safe_test
DROP SEQUENCE seq_test1;
DROP SEQUENCE seq_test2;
DROP SEQUENCE seq_test3;
DROP INDEX ind_test1;
DROP INDEX ind_test2;
DROP INDEX ind_test3;
DROP TABLE tab_test1;
DROP TABLE tab_test2;
DROP TABLE tab_test3;
DROP FUNCTION func_test();
--create sequence seq_test1,seq_test2,seq_test3
CREATE SEQUENCE seq_test1 START 101;
CREATE SEQUENCE seq_test2 START 1;
CREATE SEQUENCE seq_test3 START 1;
--create table tab_test1,tab_test2,tab_test3
CREATE TABLE tab_test1(
tab1_id int4 NOT NULL,
tab1_name text,
tab1_tel text,
teb1_memo text
);
CREATE TABLE tab_test2(
tab2_id int4 NOT NULL,
tab2_name text,
tab2_tel text,
teb2_memo text
);
CREATE TABLE tab_test3(
tab3_id int4 DEFAULT nextval('seq_test3') NOT NULL,
tab3_name text,
tab3_tel text,
tab3_memo text
);
--craete index
CREATE UNIQUE INDEX ind_test1 ON tab_test1(tab1_id);
CREATE UNIQUE INDEX ind_test2 ON tab_test2(tab2_id);
CREATE UNIQUE INDEX ind_test3 ON tab_test3 USING btree(tab3_id int4_ops);
--FUNCTION func_test()
CREATE FUNCTION func_test() RETURNS INT4
AS ' SELECT NEXTVAL(''seq_test1'') '
LANGUAGE 'sql';
--transaction 1
BEGIN;
INSERT INTO tab_test1 VALUES (func_test(),'jini1','000-0000','No_Memo1');
INSERT INTO tab_test2 VALUES (nextval('seq_test2'),'winob1','000-0001','No_Memo1');
INSERT INTO tab_test3 (tab3_name,tab3_tel,tab3_memo)
VALUES ('nogadax1','000-0003','No_Memo1');
INSERT INTO tab_test1 VALUES (func_test(),'jini2','100-0000','No_Memo2');
INSERT INTO tab_test2 VALUES (nextval('seq_test2'),'winob2','100-0001','No_Memo2');
INSERT INTO tab_test3 (tab3_name,tab3_tel,tab3_memo)
VALUES ('nogadax2','100-0003','No_Memo2');
INSERT INTO tab_test1 VALUES (func_test(),'jini3','200-0000','No_Memo3');
INSERT INTO tab_test2 VALUES (nextval('seq_test2'),'winob3','200-0001','No_Memo3');
INSERT INTO tab_test3 (tab3_name,tab3_tel,tab3_memo)
VALUES ('nogadax3','200-0003','No_Memo3');
INSERT INTO tab_test1 VALUES (func_test(),'jini4','300-0000','No_Memo4');
INSERT INTO tab_test2 VALUES (nextval('seq_test2'),'winob4','300-0001','No_Memo4');
INSERT INTO tab_test3 (tab3_name,tab3_tel,tab3_memo)
VALUES ('nogadax4','300-0003','No_Memo4');
INSERT INTO tab_test1 VALUES (func_test(),'jini5','400-0000','No_Memo5');
INSERT INTO tab_test2 VALUES (nextval('seq_test2'),'winob5','400-0001','No_Memo5');
INSERT INTO tab_test3 (tab3_name,tab3_tel,tab3_memo)
VALUES ('nogadax5','400-0003','No_Memo5');
END;
--transaction 2
BEGIN;
SELECT * FROM tab_test1;
SELECT * FROM tab_test2;
SELECT * FROM tab_test3;
VACUUM VERBOSE ANALYZE tab_test1;
VACUUM VERBOSE ANALYZE tab_test2;
VACUUM VERBOSE ANALYZE tab_test3;
END;
-------------------------------------------------------------------End !!