본문 바로가기
Database/PGSQL

INDEX, SEQUENCE, FUNCTION(1)

by 반화넬 2007. 6. 4.
반응형
1. INDEX, SEQUENCE, FUNCTION(1)
1.1 Create Index
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

  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;


1.2 Create SEQUENCE
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    : 최고값으로 증가되면 다시 최소값으로 순환하게 한다.

example

   
    CREATE  SEQUENCE  seq_name1 START 101;
    SELECT  NEXTVAL('seq_name1);


    결과
   
    nextval
    -------
        114

1.3 Create FUNCTION
FUNCTION 은 새로운 함수를 정의한다.


 CREATE  FUNCTION  func_name([type[,...]])
    RETURNS  return_type [with (attribute [,...])]
    AS ' definition '
    LANGUAGE 'language_name';


 LANGUAGE : sql, pgsql, c 등이 있다.
 

example

  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 관련 내장함수이다.



1.4 예제
다음 예제의 이름은 test.sql 입니다. 다음 예제를 화일로 만들어 다음처럼 실행하시면 됩니다.


nogadax=> \i /usr/local/src/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  bigint
      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 !!
반응형