database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Tutorials 5832 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 5832
PostgreSQL 8 : TableSapce
작성자
조성준(openphp)
작성일
2005-01-25 21:25ⓒ
2005-01-30 20:12ⓜ
조회수
15,695

홈페이지 : http://www.openphp.com , http://www.openpython.com 

안녕 하십니까? 조성준 입니다.

 

PostgreSQL 8에 새로 적용된 Table Space 기능에 대해 설명 하겠습니다.

 

- Table Space -

 

Table Space는 탁자의 공간? 은 아닙니다. Oracle,Infoformix등 사용 *DBMS를 써보신분은 아시는기능으로

기존에 PostgreSQL의 경우 환경변수 PGDATA나 따로 -D 옵션으로 설정한 폴더에 모든 디비 파일이 모이게 됩니다.

 

Table Space는 한곳에 집중시키는 형태를 분활하는 역활을 합니다.

가정을 해보면

 

1번 하드 : SCSI 15,000 RPM 72G

2번 하드 : SCSI 7,200 RPM 32G

3번 하드 : IDE 7,200RPM Buffer 8MB 200G

 

인경우음. 비유가 좀 이상하지만. SCSI는 안정성과 동시 접근성이 좋습니다. IDE는 Single접근이나 저렴한 비용등의 장점이 있습니다.

우리가 디비나 테이블이나 Index를 만들때 등등 기타 상황에 따라 각 테이블이나 Index등 자료릐 사용이

어떤건 매우매우 자주 되고 어떤건 거의 보관성데이타 (회계분기별 데이타나 년별 보관데이타)같은것이 있을수 있습니다.

 

이런경우 기존의 방식으로 한곳에 다 넣지만 위같은 경우 3번 하드는 용량도 엄청많지만 IDE라는 성능과

플래터의 성능등 여러가지면에서 자주 데이타를 불러오지는 않지만 용량은 많이 차지하는 통계 테이타를 넣어 넣고

 

엄청나게 select나 update,delete가 일어 나는 것은 1번에 , 기초데이타등 select가 많이는 아니지만 적당히 필요할것이

전체쿼리에 30% 정도쯤된다 뭐 이런경우 2번에 식으로 넣어두면

 

전체적인 하드웨어 리소스를 잘 분배 하여 사용하고 특성을 잘 살릴수도 있습니다.

 

이것이 Table Space의 기능입니다.

 

but. 하지만 PostgreSQL8 의 TableSpace는 상용디비 (즉 돈내고 사야하는 디비)정도의 TableSpace기능을 지원하지 않습니다.

간단히 플드별 테이블 스페이스 지정이라던지. 세세한건 않되지만 현재로써는

 

디비 , 테이블 , 인덱스등을 지원합니다 즉.! create 명령 라인에서는 지정이 가능 하다는 것입니다. 당연히 alter로 변경도 가능

 

그럼 간단히 테스트를 해보죠.

 

* 테스트 *

 

주의! : 테이블 스페이스는 디스크에 폴더를 만드는 것으로 기본적으로 시스템명령으로 만들어 주어야 합니다.

또한 PostgreSQL Daemon의 수유주 기본적으로 postgres 계정과 postgres그룹으로 되어 있든

해당 폴더의 소유주와 그룹을 지정해주어야 합니다.

 

- 폴더 생성 + 소유자/그룹 지정 -

[list]

mkdir -p /tmp/tmpgo

mkdir -p /tmp/tmpgo2

chown -R postgres:postgres /tmp/tmpgo

chown -R postgres:postgres /tmp/tmpgo2

[/list]

 

- 디비 설정해보기 -

 

 

     

    pgbench=# CREATE TABLESPACE tmpgo location '/tmp/tmpgo';

    CREATE TABLESPACE

     

    pgbench=# CREATE TABLESPACE tmpgo2 location '/tmp/tmpgo2';

    CREATE TABLESPACE

     

    pgbench=# select * from pg_tablespace;

    spcname | spcowner | spclocation | spcacl

    ------------+----------+-------------+--------

    pg_default | 1 | |

    pg_global | 1 | |

    tmpgo | 1 | /tmp/tmpgo |

    tmpgo2 | 1 | /tmp/tmpgo2 |

    (4 rows)

     

 

 

위에서 처럼 간단히 tablespace를 지정하고 폴더위치를 정해줄수 있다.

 

select * from pg_tablespace로 시스템카타로그 테이블로 보아도 되지만 Quick?은 \\db 를 통해

TableSpace를 볼수 있다.

 

CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'

 

create tablespace에 추가적인 문법에는 owner와 location이 있다 owner는 postgresql 내부의 사용 account를 적어 주시면 되면

않적어 주시면 기본적으로 현재 psql 접속 계정으로 잡힙니다.

location은 역시나 폴더정보입니다.

 

- 실제 폴더 정보 -

 

 

     

    535389

    +---837046

    +---837051

    PG_VERSION - (8.0)

     

 

 

실제 TableSpace로 지정한 위치에는 PG_VERSION가 내부구분번호로 되어있는 폴더와 해당 데이타 저장용으로 쓰는

파일들이 들어 있습니다.PG_VERSION은 버전이 표기되어있다.

$PGDATA로 설정된 메인 디비 테이블 Space에는 로그등도 같이 남지만 TableSpace로 따로 잡아 놓은곳에는

실제 파일만 기록보관 되는것 같습니다.

 

 

- 적용해보기 -

 

1. Table 에 TableSpace 지정

 

     

    pgbench=# create table tablespace_test (a varchar(255) , b bigint ) TABLESPACE tmpgo;

    CREATE TABLE

    pgbench=# create table tablespace_test2 (a varchar(255) , b bigint ) TABLESPACE tmpgo2;

    CREATE TABLE

    pgbench=# \d tablespace_test

    Table "public.tablespace_test"

    Column | Type | Modifiers

    --------+------------------------+-----------

    a | character varying(255) |

    b | bigint |

    Tablespace: "tmpgo"

     

    pgbench=# \d tablespace_test2

    Table "public.tablespace_test2"

    Column | Type | Modifiers

    --------+------------------------+-----------

    a | character varying(255) |

    b | bigint |

    Tablespace: "tmpgo2"

     

 

 

기존에 하던 create table 명령으로 간단히 해결되면 table describe를 보면 Tablespace가 잡혔다는 것이 보일것이다.

필드별로 못하는게 다소 아쉽기는 한대목이긴하지만.. 그거야 방법은 많기에 약간의 아쉬움이 Free Software의 매력아니겠는가.

 

언능 실력을 늘려 저 아쉬움을 내가 해결해서 patch를 공유할수 있기를 바랄뿐입니다...음.. 초보티는 언제 벚나..

 

2. Index 에 TableSpace 지정

 

 

     

    pgbench=# create index tbs_test_a_x on tablespace_test (a) TABLESPACE tmpgo2;

    CREATE INDEX

    pgbench=# create index tbs_test2_a_x on tablespace_test (a) TABLESPACE tmpgo;

    CREATE INDEX

    pgbench=# \di

    List of relations

    Schema | Name | Type | Owner | Table

    --------+---------------+-------+----------+-----------------

    public | tbs_test2_a_x | index | postgres | tablespace_test

    public | tbs_test_a_x | index | postgres | tablespace_test

    (2 rows)

     

 

 

역시 간단히 Index 에 대해 테이블 스페이스 지정도 가능하다. Uniqu 역시 가능하다.

 

3. Alter TableSpace의 부족

 

역시나혹시나 해서 Alter Tabspace Help를 보니 역시나 PostgreSQL은 Alter명령은 항시 약한것 같다.

 

create에서 설정한 location은 변경이 불가능하다. -.-';

 

 

     

    pgbench=# alter tablespace tempgo location '/tmp/tmpgo/11';

    ERROR: syntax error at or near "location" at character 25

    LINE 1: alter tablespace tempgo location '/tmp/tmpgo/11';

    ^

    pgbench=# \h alter tablespace

    Command: ALTER TABLESPACE

    Description: change the definition of a tablespace

    Syntax:

    ALTER TABLESPACE name RENAME TO newname

    ALTER TABLESPACE name OWNER TO newowner

     

 

 

alter table에서 테이블이나 , alter index등에서는 tablespace 변경이 가능하니.

혹여 기존에 A라는 테이블 스페이스에 위치를 바꾸실려면 B를 만들어 넣고 A로 설정한걸 모두 B로 바꾸어야 한다.

 

4. Dtop Table Space 주의

 

drop tablespace 명령으로 지울때 이미 그 tablespace 정보를 이용중인게 있다면

에러가 발생한다.

 

 

     

    pgbench=# drop tablespace tmpgo;

    ERROR: tablespace "tmpgo" is not empty

     

 

 

따로 옵션을(cascade같은) 주어 해당 TableSpace로 설정된것은 지워주는 편리함이 있다면 좋기는하지만.

실수에 의한 삭제를 염두한다면 별문제는 없어 보인다.

 

역시 설계단계에서 잘 생각을 해야할것이며, 변경될때는 적절한 삽질과 손가락 관절의 절임을 느끼면 될듯.

 

 

뭐 많은걸 바라는건 아니지만 Field별 Table Space 지정정도만 언능 지원을 해주면 적용 범위가 늘어 날것 같지만

차차 9.0에 기대를 걸어 봐야 할듯 싶다.

 

일단 맨위에 애기를 던져드렸는데 저런 사유말고도 참으로 많으니 NFS로 연결된 폴더에 특정 Table만

여러대의 디비서버에서 공유하게 한다던지 활용방안은 많으니

 

여러분의 기발한 생각으로 TableSpace를 멎지게 이용해보시기 바랍니다...

[Top]
No.
제목
작성자
작성일
조회
5845PostgreSQL 8 : Install -한글부분수정 [3]
조성준
2005-01-28
30532
5834PostgreSQL 8 : PostgreSQL.conf 설정하기 [2]
조성준
2005-01-25
19563
5833PostgreSQL 8 : PITR [2]
조성준
2005-01-25
10035
5832PostgreSQL 8 : TableSapce
조성준
2005-01-25
15695
5831PostgreSQL 8 : SavePoint - 간단정리
조성준
2005-01-25
9488
5830PostgreSQL DB Connect Poll : pgpool - 설정과가동
조성준
2005-01-25
11868
5829PostgreSQL DB Connect Pool : pgpool - 기본
조성준
2005-01-25
15305
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다