달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2014. 7. 31. 10:26

Postgresql Pivot Work/PostgreSQL2014. 7. 31. 10:26

집계 테이블을 표현 할 때 흔히 격자형 형태로 표현하기를 원하는 경우들이 있다.

이런 경우 엑셀에서는 pivot 이라는 기능을 이용한다.

데이터베이스에서도 비슷한 상황이 존재할 수 있는데, 이를 위해서 DBMS마다 약간씩 다른 방법을 제공한다. Postgresql 의 경우는 아래은 방법을 제공한다.


SELECT a::date AS cdate,

       b.desc AS TYPE,

       (random() * 10000 + 1)::int AS val

FROM generate_series((now() - '10 days'::interval)::date, now()::date, '1 day'::interval) a,

  (SELECT unnest(ARRAY['OSX', 'Windows', 'Linux']) AS DESC) b;

위의 쿼리 결과는 아래와 같다.

cdate type val
2014-07-21 OSX 3128
2014-07-21 Windows 8118
2014-07-21 Linux 6699
2014-07-22 OSX 6364
2014-07-22 Windows 4439
2014-07-22 Linux 3727
2014-07-23 OSX 6010
2014-07-23 Windows 5006
2014-07-23 Linux 2249
2014-07-24 OSX 3664
2014-07-24 Windows 2377
2014-07-24 Linux 6907
2014-07-25 OSX 6145
2014-07-25 Windows 728
2014-07-25 Linux 5920
2014-07-26 OSX 6704
2014-07-26 Windows 1331
2014-07-26 Linux 1472
2014-07-27 OSX 5668
2014-07-27 Windows 1408
2014-07-27 Linux 6162
2014-07-28 OSX 6805
2014-07-28 Windows 4762
2014-07-28 Linux 5977
2014-07-29 OSX 8917
2014-07-29 Windows 9468
2014-07-29 Linux 7261
2014-07-30 OSX 1913
2014-07-30 Windows 1495
2014-07-30 Linux 5639
2014-07-31 OSX 5195
2014-07-31 Windows 4623
2014-07-31 Linux 3756

이런 결과의 격자형 형태를 위해 아래처럼 case를 이용한 쿼리를 작성하는 방법이 일반적이다.

select cdate

, sum(case when type = 'OSX' then val else 0 end) OSX

, sum(case when type = 'Windows' then val else 0 end) Windows

, sum(case when type = 'Linux' then val else 0 end) Linux

from (

SELECT a::date AS cdate,

  b.desc AS TYPE,

  (random() * 10000 + 1)::int AS val

FROM generate_series((now() - '10 days'::interval)::date, now()::date, '1 day'::interval) a,

 (SELECT unnest(ARRAY['OSX', 'Windows', 'Linux']) AS DESC) b

) a

group by cdate

order by 1;

결과는 아래와 같다.

cdate osx windows linux
2014-07-21 7095 287 1101
2014-07-22 9741 3417 3237
2014-07-23 6321 7028 9647
2014-07-24 569 8523 7655
2014-07-25 7371 4659 2482
2014-07-26 8352 9015 559
2014-07-27 604 5552 8965
2014-07-28 79 4691 1138
2014-07-29 3355 9816 2113
2014-07-30 4707 1285 2997
2014-07-31 2029 8379 3283


Postgresql 에서 제공하는 또다른 방법은 crosstab을 이용하는 벙법이다. 쿼리는 아래와 같다.

-- crosstab 을 이용하기 위한 extension 설치

CREATE EXTENSION tablefunc;


-- Query

SELECT *

FROM crosstab(

'SELECT

a cdate,

b.desc AS type,

(random() * 10000 + 1)::int AS val

FROM generate_series((now() - ''10 days''::interval)::date, now()::date, ''1 day''::interval) a,

(SELECT unnest(ARRAY[''OSX'', ''Windows'', ''Linux'']) AS DESC) b ORDER BY 1,2'

,'SELECT unnest(ARRAY[''OSX'', ''Windows'', ''Linux''])'

AS ct(cdate date, OSX int, Windows int, Linux int);

결과는 위의 case를 이용한 Query와 동일하다.


출처 : http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/

참고 : http://www.postgresql.org/docs/9.1/static/tablefunc.html


:
Posted by Elick

Overview

 

Installation

USER
Commad
Description
root  
 yum updateOS Update
 rpm -Uvh http://yum.postgresql.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpmPostgresql 9.2 repository 등록
 yum install postgresql92 postgresql92-server postgresql92-contribPostgresql 9.2 install
 service postgresql-9.2 initdbPostgresql 데이터베이스 초기화
postgres  
 postgresql.conf, pg_hba.conf 수정기본 설정
root  
 service postgresql-9.2 startPostgresql Servcie 실행
 wget "http://en.sourceforge.jp/frs/redir.php?m=iij&f=%2Fpghintplan%2F57713%2Fpg_hint_plan92-1.0.0-1.el6.x86_64.rpm"pg_hint_plan download
 yum localinstall pg_hint_plan92-1.0.0-1.el6.x86_64.rpmpg_hint_plan install
postgres  
 postgresql.conf 수정 : shared_preload_libraries = 'pg_hint_plan' 추가pg_hint_plan 환경 설정 변경
root  
 service postgresql-9.2 restartPostgresql 재시작
postgres  
 psqlpsql 실행
 

CREATE TABLE tbl (i int, j int);
INSERT INTO tbl SELECT x, x * 2 FROM generate_series (1, 10) x;
CREATE INDEX idx ON tbl (i);
VACUUM ANALYZE tbl;
EXPLAIN SELECT * FROM tbl WHERE i = 7;
/*+ IndexScan (tbl) */ EXPLAIN SELECT * FROM tbl WHERE i = 7;

실행계획 비교.

 

실행계획 확인

실행계획 확인
-bash-4.1$ psql
psql (9.2.3)
Type "help" for help.
postgres=# EXPLAIN SELECT * FROM tbl WHERE i = 7;
                    QUERY PLAN                    
---------------------------------------------------
 Seq Scan on tbl  (cost=0.00..1.12 rows=1 width=8)
   Filter: (i = 7)
(2 rows)
postgres=# /*+ IndexScan (tbl) */ EXPLAIN SELECT * FROM tbl WHERE i = 7;
                          QUERY PLAN                          
---------------------------------------------------------------
 Index Scan using idx on tbl  (cost=0.00..8.27 rows=1 width=8)
   Index Cond: (i = 7)
(2 rows)
postgres=# \q
-bash-4.1$


개인적 감상 : 이제 postgresql에서도 hint를 사용할 수 있다!!!


Hint List

  • 스캔 방식
    • SeqScan (table) 
      • 지정된 table에 대해 Seq Scan을 선택합니다.
    • TidScan (table) 
      • 지정된 table에 대해 Tid Scan을 선택합니다. 검색 조건에 ctid을 지정한 경우에만 유효합니다.
    • IndexScan (table index ...) 
      • 지정된 table에 대한 Index Scan을 선택합니다. index를 지정하면, 지정한 index에 비용이 최소가되는 Index Scan을 선택합니다. 
        그러나 index가 존재하지 않거나 지정된 index가 WHERE 절이나 JOIN 조건 등에 관련 않으면 Seq Scan을 선택합니다.
    • IndexOnlyScan (table index ...) 
      • 지정된 table에 대한 Index Onl??y Scan과 Index Scan 중 비용이 최소가되는 스캔 방식을 선택합니다.
         index를 지정하면, 지정한 index에서 Index Onl??y Scan과 Index Scan 중 비용이 최소가되는 스캔 방식을 선택합니다. 
        그러나 index가 존재하지 않거나 지정된 index가 WHERE 절이나 JOIN 조건 등에 관련 않으면 Seq Scan을 선택합니다. 
        또한 이러한 경우 외에도 index가 가지는 값뿐만 아니라 table의 값이 필요한 경우는 Index Scan을 선택합니다. PostgreSQL 9.2 이상이 필요합니다.
    • BitmapScan (table index ...) 
      • 지정된 table에 대해 Bitmap Scan을 선택합니다. 
        index를 지정하면, 지정한 index에 비용이 최소가되는 index를 선택합니다. 
        그러나 index가 존재하지 않거나 지정된 index가 WHERE 절이나 JOIN 조건 등에 관련 않으면 Seq Scan을 선택합니다.
    • NoSeqScan (table) 
      • 지정된 table에 대해 Seq Scan 이외 비용을 최소화하는 스캔 방식을 선택합니다. 
        그러나 다른 검색 방식을 선택할 수없는 경우는 Seq Scan을 선택합니다.
    • NoTidScan (table) 
      • 지정된 table에 대해 Tid Scan 이외 비용을 최소화하는 스캔 방식을 선택합니다.
    • NoIndexScan (table) 
      • 지정된 table에 대한 Index Scan 및 Index Onl??y Scan을 제외한 스캔 방식에서 비용을 최소화하는 스캔 방식을 선택합니다.
    • NoIndexOnlyScan (table) 
      • 지정된 table에 대한 Index Onl??y Scan 이외 비용을 최소화하는 스캔 방식을 선택합니다. (PostgreSQL 9.2 이상)
    • NoBitmapScan (table) 
      • 지정된 table에 대해 Bitmap Scan 이외 비용을 최소화하는 스캔 방식을 선택합니다.
  • 결합 방식
    • NestLoop (table table table ...) 지정된 table 간의 조인에 Nested Loop을 선택합니다.
    • HashJoin (table table table ...) 지정된 table 간의 조인에 Hash Join을 선택합니다.
    • MergeJoin (table table table ...) 지정된 table 간의 조인에 Merge Join을 선택합니다.
    • NoNestLoop (table table table ...) 지정된 table 간의 조인에 Nested Loop 이외의 결합 방식을 선택합니다.
    • NoHashJoin (table table table ...) 지정된 table 간의 조인에 Hash Join 이외의 결합 방식을 선택합니다.
    • NoMergeJoin (table table table ...) 지정된 table 간의 조인에 Merge Join 이외의 결합 방식을 선택합니다.
  • 조인 순서
    • Leading (table table table ...) 지정된 table을 지정한 순서대로 결합합니다.
  • GUC 매개 변수
    • Set (GUC 매개 변수 값) 쿼리 실행 계획을 작성하고있는 동안 만 지정된 GUC 매개 변수 값으로 변경합니다.


:
Posted by Elick
2013. 3. 13. 10:04

PostgreSQL Streaming Replication Work/PostgreSQL2013. 3. 13. 10:04

PostgreSQL Streaming Replication

Overview
  • 스트리밍 복제 (Streaming Replication)은 PostgreSQL 9.0 이상에서 사용 가능한 복제 기능.
  • Insert/Update/Delete, Create/Drop 가능한 1 개의 Master DB에 SELECT만 할 수 있는 여러 Standby DB에 복제하는 것
  • Standby DB의 변경 결과가 반영되기까지 약간의 지연이 있지만 비교적 지연은 적게, 마스터 DB에 영향 작은 복제 방식.
Purpose
  • 많은 SELECT Query의 Server 간 분산
  • Master DB 이상시 신속한 Fail over
  • Master DB의 Disk 장애에 대비한 실시간 Backup
9.0 에 비해 강화된 9.1의 기능
  • 동기화 복제 (변경 결과 도착 보장)
  • 기반 Backup의 간소화 (초기 Data 복제 도구)
  • 복제 상태를 확인하기위한 System view
  • Fail Over 지원 강화 (전용 명령 다른 Master Server에 다시 연결)
구성
  • Master 1EA(192.168.83.146), Slave 1EA(192.168.83.147)
구축 절차
  • Master
    • Postgresql 9.1 설치 (생략)
    • 복제용 사용자 생성

      -bash-4.1$ psql
      psql (9.1.7)
      Type "help" for help.
       
      postgres=# CREATE ROLE repl_user LOGIN REPLICATION PASSWORD 'xxxxxxxx';
      CREATE ROLE
      postgres=# \q
      -bash-4.1$
    • pg_hba.conf 수정

      vi $PGDATA/pg_hba.conf
      host all         all       127.0.0.1/32 trust
      host replication repl_user 127.0.0.1/32 md5
      host all         all       ::1/128      trust
      host replication repl_user ::1/128      md5
    • postgresql.conf 수정

      vi $PGDATA/postgresql.conf
      wal_level = hot_standby
      max_wal_sender = 2 # 대기 DB의 수 + 1
      # Archive 사용시
      archive_mode = on
      archive_command = 'cp "%p" /mnt/pgbackup/archive/"%f"'
      # Archive 미사용시
      archive_mode = off
      wal_keep_segments = 8 # 8-32가 기준
    • pg_basebackup 으로 Master를 Backup

      Base Backup
      -bash-4.1$
      -bash-4.1$ /usr/pgsql-9.1/bin/pg_basebackup -h localhost -U repl_user -D /mnt/pgbackup/cluster/ -xlog -c fast -P
      Password:
      35430/35430 kB (100%), 1/1 tablespace
      -bash-4.1$
  • Slave
    • Postgresql 9.1 설치 (생략)
    • Master의 Backup을 restore

      Master
      -bash-4.1$ rsync -ra /mnt/pgbackup/cluster/* root@192.168.83.147:/mnt/pgbackup/cluster/
      root@192.168.83.147's password:
      -bash-4.1$
      Slave
      -bash-4.1$ cd /mnt/pgbackup/cluster
      -bash-4.1$ cp -rf ./* /$PGDATA/
      -bash-4.1$
    • postgresql.conf 수정

      vi $PGDATA/postgresql.conf
      wal_level = minimal
      max_wal_sender = 0
      archive_command = 'cp "%p" /mnt/pgbackup/archive/"%f"'
      hot_standby = on
    • recovery.conf 생성

      vi $PGDATA/recovery.conf
      standby_mode = 'on'
      primary_conninfo = 'host=192.168.83.146 port=5432 user=repl_user password=xxxxxxxx'
  • Postgresql start
    • Master Start

      [root@localhost mnt]# service postgresql-9.1 start
      Starting postgresql-9.1 service:                           [  OK  ]
      [root@localhost mnt]#
    • Slave Start

      [root@localhost mnt]# service postgresql-9.1 start
      Starting postgresql-9.1 service:                           [  OK  ]
      [root@localhost mnt]#
복제상태 확인
  • Process
    • Master

      wal sender process 있는지 확인
      -bash-4.1$ ps -ef | grep postgres
      postgres  2927     1  0 Jan03 ?        00:00:00 /usr/pgsql-9.1/bin/postmaster -p 5432 -D /var/lib/pgsql/9.1/data
      postgres  2930  2927  0 Jan03 ?        00:00:00 postgres: logger process                                       
      postgres  2933  2927  0 Jan03 ?        00:00:01 postgres: writer process                                       
      postgres  2934  2927  0 Jan03 ?        00:00:01 postgres: wal writer process                                   
      postgres  2935  2927  0 Jan03 ?        00:00:00 postgres: autovacuum launcher process                          
      postgres  2936  2927  0 Jan03 ?        00:00:00 postgres: archiver process   last was 000000010000000000000006.00000020.backup
      postgres  2937  2927  0 Jan03 ?        00:00:00 postgres: stats collector process                              
      postgres  3194  2927  0 Jan03 ?        00:00:00 postgres: wal sender process repl_user 192.168.83.147(44356) streaming 0/7028558
      root      3227  2982  0 Jan03 pts/0    00:00:00 su - postgres
      postgres  3228  3227  0 Jan03 pts/0    00:00:00 -bash
      postgres  3695  3228  0 00:11 pts/0    00:00:00 ps -ef
      postgres  3696  3228  0 00:11 pts/0    00:00:00 grep postgres
      -bash-4.1$
    • Slave

      wal receiver process, startup process 있는지 확인.
      -bash-4.1$ ps -ef | grep postgres
      postgres  4212     1  0 Jan03 ?        00:00:00 /usr/pgsql-9.1/bin/postmaster -p 5432 -D /var/lib/pgsql/9.1/data
      postgres  4214  4212  0 Jan03 ?        00:00:00 postgres: logger process                                       
      postgres  4215  4212  0 Jan03 ?        00:00:00 postgres: startup process   recovering 000000010000000000000007
      postgres  4216  4212  0 Jan03 ?        00:00:01 postgres: writer process                                       
      postgres  4217  4212  0 Jan03 ?        00:00:00 postgres: stats collector process                              
      postgres  4218  4212  0 Jan03 ?        00:00:02 postgres: wal receiver process   streaming 0/7028558           
      root      4277  2961  0 Jan03 pts/0    00:00:00 su - postgres
      postgres  4278  4277  0 Jan03 pts/0    00:00:00 -bash
      postgres  4565  4278  9 00:12 pts/0    00:00:00 ps -ef
      postgres  4566  4278  0 00:12 pts/0    00:00:00 grep postgres
      -bash-4.1$

Fail Over
  • Master Service 중지

    Maseter Postgresql stop
    -bash-4.1$
    -bash-4.1$ exit
    logout
    [root@localhost mnt]# service postgresql-9.1 stop
    Stopping postgresql-9.1 service:                           [  OK  ]
    [root@localhost mnt]#
  • Slave 에서 DDL 실행 : 실패

    Slave Postgresql 상태 확인 및 DDL 실행
    -bash-4.1$
    -bash-4.1$ exit
    logout
    [root@localhost mnt]# service postgresql-9.1 status
     (pid  4212) is running...
    [root@localhost mnt]# su - postgres
    -bash-4.1$ psql -d db_test_01
    psql (9.1.6)
    Type "help" for help.
    db_test_01=# create table t_test_02 (col1 int);
    ERROR:  cannot execute CREATE TABLE in a read-only transaction
    db_test_01=# \q
    -bash-4.1$
  • pg_ctl promote 실행

    -bash-4.1$
    -bash-4.1$ /usr/pgsql-9.1/bin/pg_ctl promote -D $PGDATA
    server promoting
    -bash-4.1$
  • Slave 에서 DDL 실행 : 성공

    -bash-4.1$
    -bash-4.1$ psql
    psql (9.1.6)
    Type "help" for help.
    postgres=# create table t_test_02 (col1 int);
    CREATE TABLE
    postgres=# \q
    -bash-4.1$


Reference : 
http://lets.postgresql.jp/documents/technical/replication/1/


개인적 소감 : 생각보다 간단한 복제 설정이었음. 극단적인 환경에서 사용해보지 않아 성능적인 부분은 보장할 수 없지만, 평범한 환경에서라면 충분히 쓸만한 듯 함.

:
Posted by Elick
2011. 6. 8. 15:01

PostgreSQL 8.0 성능 점검 사항 Work/PostgreSQL2011. 6. 8. 15:01

bloged : http://blog.naver.com/kbsps?Redirect=Log&logNo=120033062011
원문 : http://www.postgresql.or.kr/wiki.php/documents/PerfList
by Josh Berkus and Joe Conway
 
PostgreSQL 서버 설정을 위한 다섯가지 하드웨어 기초

1. Disks > RAM > CPU
만약에 PostgreSQL 서버를 구입하려고 한다면 고성능의 disk array와 평범한 CPU, 충분한 RAM을 가지고 있는 서버에 지출하라. 돈이 좀 남는다면 RAM을 보강하도록하라. 다른 ACID 기반의 RDMBS들과 마찮가지로 PostgreSQL도 매우 많은 양의 I/O를 필요로 하며 아주 희귀한 경우에만 SCSI card보다 CPU를 더 필요로 한다. 이것은 8개의 CPU가 달린 대규모 서버는 물론 작은 서버에도 적용되는 원칙이다. 만약 저렴한 CPU를 구입하면서 절약한 비용으로 고성능 RAID와 다수의 디스크를 구입할 수 있다면 그렇게 하도록 한다.

2. 디스크가 많을 수록 좋다.
디스크가 여러개 있다면 PostgreSQL과 대부분의 OS들은 database를 동시에 여러 디스크에서 읽고 쓰는 병렬 작업을 할 것이다. 트렌젝션을 처리하는 시스템에서 I/O를 병렬화 하면 엄청난 성능상의 차이가 생기며 RAM에 전체 Database를 넣지 못해서 Disk를 사용해야 하는 어떤 어플리케이션의 성능도 눈에띄게 향상 시킨다. 요즘 시판 되는 디스크들의 용량이 워낙 커서 디스크 하나만 사용하거나 디스크 두개로 RAID 1 미러링을 구성하는 것으로 충분하다고 생각될 수 있겠지만 4개 6개 또는 14개의 디스크를 사용하면 성능이 배가되는 것을 발견할 수 있을 것이다. 그리고 아직까지는 IDE보다 SCSI가 분명하게 DB 전송량이 높다. 심지어 Serial ATA를 사용한다고 해도 말이다.

3. Database와 트렌젝션 log를 분리한다.
이미 어지간한 규모의 디스크 어레이를 구입했다고 가정한다면 모든 것을 단일 RAID에 넣는 것 보다 나은 선택들이 남아 있다. 그중 하나는 database 트렌젝션 log(pg_xlog)를 독립된 전용 디스크 자원(어레이 또는 일반 하드 디스크)에 저장하는 것이다. 이렇게 하면 저장이 빈번한 database의 경우 성능을 12%가량 향상시킬 수 있다. 이 방법은 느린 SCSI나 IDE 디스크를 가지고 있는 소규모 시스템에 특별히 중요하다. 두개의 디스크만 가지고 있는 서버라고 할지라도 트렌젝션 로그를 OS가 설치된 시스템 디스크에 두어 어느정도 이득을 얻을 수 있다.

4. RAID 1+0/0+1 > RAID 5
불행히도 3개의 디스크로 구성된 RAID 5은 대형 서버 업체들이 만드는 보급형 서버들의 표준이 되어왔다. 이것은 아마도 PostgreSQL을 위한 가장 느린 어레이 구성일 것이다. 이 구성에서는 일반 SCSI 디스크보다도 50% 정도 느린 질의 성능 정도만 기대할 수 있다.
대신에 둘 또는 넷, 여섯개의 디스크로 구성된 RAID 1, 1+0, 0+1를 생각해 볼 수 있다. 디스크가 6개 이상 되면서 부터는 RAID 5도 어느 정도 사용할만해지며, 성능 비교시 개별 디스크 컨트롤러에 더 영향을 받는 경향이 생긴다. 이것은 싸구려 RAID 카드의 책임일 가능성이 크다. 종종 소프트웨어 RAID를 쓰는 것이 서버에 따라오는 Adatec사의 내장형 카드를 쓰는 것보다 낫다.

5. 어플리케이션들은 충돌 없이 서로 잘 작동해야 한다.
많은 기관에서 볼 수 있는 또 다른 큰 오류는 동일한 서버 자원을 얻기 위해 PostgreSQL과 경쟁하는 여러 다른 어플리케이션들을 한 서버에 작동시킨다는 것이다. 그 중 최악은 PostgreSQL과 다른 RDBMS들을 같은 기계에 넣는 것이다. 두 DBMS는 디스크 대역폭과 OS 디스크 케쉬를 얻기 위해서 서로 싸울 것이고 결국 둘다 형편없는 성능으로 작동할 것이다. 문서 서버들과 보안 로깅 프로그램들도 역시 비슷하게 궁합이 좋지 않다.
PostgreSQL은 메모리만 충분하다면 CPU와 RAM을 많이 사용하는, apache 같은 어플리케이션들과 기계를 공유 할 수 있다.

postgresql.conf 파일에서 조정하기 원할 만한 12가지 설정
 
postgresql.conf에는 진짜 깜짝 놀랄만한 새 옵션들이 추가 되었다. 심지어 지난 다섯 버젼에서부터 친숙해 있던 옵션들도 이름과 양식이 변경되었다. 이는 데이터베이스 관리자에게 보다 많은 제어권을 주기 위한 것이다.
다음의 설정들은 대부분의 DBA들이 변경되기 원했을 - 특히 다른 무엇보다 성능에 중점을 두고 - 것들이다. 대부분의 사용자들이 건드리지 않을 것 같으면서도 반드시 찾게될 한두가지 아주 특별한 설정들이 있긴한데 이들은 "Power PostgreSQL"이 출판되기를 기다려야 할 것이다.

1. 연결
listen_addresses : 7.4의 tcp_ip와 virtual_hosts 설정을 대체한다. 대부분의 설치에서는 기본 값이 localhost인데 이렇게 하면 콘솔에서만 접속할 수 있다. 많은 DBA들은 PostgreSQL을 네트워크로 접근할 수 있도록 이것을 모든 인터페이스를 뜻하는 "*"로 바꾸기 원할 것이다. pg_hba.conf 파일을 수정해서 권한을 적당하게 조절하는 작업이 뒤따라야 한다. 지난 버젼의 개선 사항으로써, 기본 값인 localhost는 많은 브라우저 기반의 유틸리티들이 loopback 인터페이스인 127.0.0.1 번 IP로 DB에 연결 할 수 있게 허용한다.
max_connections : 지난 버젼과 같이 예상되는 동시에 접속 연결 숫자를 지정해 주어야 한다. 높은 값은 보다 많은 공유 메모리(shared_buffers)를 요구한다. 매번 연결할 때 마다 PostgreSQL과 OS에서 생기는 부담은 매우 크기 때문에 많은 수의 사용자들을 대상으로 서비스 해야 한다면 connection pool을 사용하는 것이 중요하다. 예를 들어 중급의 단일 CPU를 가진 32비트 리눅스 서버는 150명의 활성화된 연결이 있을 때에 상당한 시스템 자원을 소비할 것이며 600개의 연결은 하드웨어 상의 한계에 해당할 것이다. 물론 튼튼한 하드웨어는 보다 많은 연결을 받아 줄 것이다.

2. 메모리
shared_buffer : 명확히 하자면 이 숫자는 PostgreSQL이 작업하는데 사용할 전체 메모리가 아니다. 이것은 PostgreSQL이 실제 작업을 처리할 때에 사용하는 할당된 메모리 블럭으로 기계가 가지고 있는 RAM의 작은 일부가 될 것이다. PostgreSQL은 이 외에도 OS 디스크 케쉬도 사용한다. 불행이도 정확한 공유 버퍼 크기는 전체 램, 데이터베이스 크기, 연결 수, 질의의 복잡도가 고려된 복잡한 계산이 필요하다. 그러므로 어림짐작으로 적당한 숫자를 지정하고 조율을 하기 위해서 서버 모디터링(특히 pg_statio 뷰들)을 하는 것이 낫다.
전용 서버에서는 8MB와 400MB(1000에서 50000개의 8k 페이지) 사이가 유용한 값일 것 이다. 공유 버퍼를 증가시켜야 하는 요인으로서는 데이터베이스의 처리량 증가, 대량의 복잡한 질의, 대량 동시 DB 연결, 장기간 실행되는 프로스듀어와 트랙젝션, 활용가능한 여분의 램, 보다 빠른거나 보강된 CPU 등이 있다. 일반적인 예상과는 반대로 너무 과도하게 공유 버퍼를 활당하면 스케닝에 걸리는 시란 때문에 실 성능이 낮아질 수 있다. 아래는 여러 경험들과 리눅스에서 이뤄진 TPC 실험의 결과로 얻은 몇가지 예시들이다.

노트북, 셀러론 프로세서, 384MB RAM, 25MB DB: 12MB/1500
애슬론 서버, 1GB RAM, 10GB의 의사결정 지원 DB: 120MB/15000
PIII 4CPU 서버, 4GB RAM, 40GB/150 동시연결의 중량급 트렌젝션 시스템: 240MB/30000
Xeon 4CPU 서버, 8GB RAM, 200GB/300 동시연결의 중량급 트렌젝션 시스템: 400MB/50000 
주의할 것은 공유 버퍼와 몇가지 메모리 설정값을 증가시킬 때에는 OS의 시스템 V 관련 설정도 수정해 줘야 한다. Postgresql 설명서에서 관련된 부분을 참고하도록 한다.

work_mem : 지금까지 sort_mem으로 사용되었었지만 소트, 집합과 몇가지 지시자들을 처리하는데 사용되면서 이름이 변경되었다. work_mem은 공유 메모리가 아니어서 매번 필요할 때 마다 - 질의 하나가 실행 할때마다 한번 이상 - 할당이 된다. 여기에 지정하는 값은 단위 작업마다 할당할 수 있는 최대값으로 이보다 큰 공간이 필요할 경우에는 디스크를 사용하게 된다. 이 설정 값은 실행 프로그램들과 공유 버퍼가 차지하는 공간을 제외한 가용메모리를 쿼리당 메모리를 필요로 하는 작업 수와 예상되는 최대 동시 처리 질의 수를 곱한 값으로 나눈 값에 기초해서 얻을 수 있다. 또한 매번 처리되어야 하는 질의가 필요로 하는 work_mem의 양도 고려해야 한다. 큰 자료를 처리할 때에는 더 많은 메모리가 필요하다. 질의가 단순하고 많은 동시 처리를 해야 하는 웹 어플리케이션의 경우 일반적으로 이 값을 매우 낮게 설정한다. 보통 512K에서 2048K라면 충분하다. 반면에 160라인의 쿼리와 천만 행의 집합처리 이뤄지는 의사결정 지원 어플리케이션은 무척 많이 필요하다. 메모리가 많은 서버에서는 500M 정도 생각할 수 있다. 다용도의 데이터베이스에서는 특정 질의에 보다 많은 RAM을 지정해 주기 위해서 이 파라메터를 DB 연결 마다 - 질의가 실행될 때에 - 지정 할 수 있다.
maintenance_work_mem : VACUUM, ANALYZE, CREATE INDEX와 외래키 추가시에 PostgreSQL이 사용하는 메모리의 양으로 지난 버젼에서는 vacuum_mem으로 알려졌었다. 이들 작업을 가능한 빠르게 하기 위해서는 테이블의 크기가 커짐에 따라 그리고 여분의 메모리가 많을 수록 이 값을 높게 해야 한다. 가장 큰 테이블이나 인덱스가 디스크 상에서 차지하는 크기의 50%에서 75% 정도를 사용하는 것이 좋으며 크기를 측정할 수 없는 상황에서는 32MB에서 256MB 정도를 사용하도록 한다.

3. 디스크와 WAL
checkpoint_segments : 쓰기 작업에 사용되는 트렌젝션 로그의 디스크 케쉬 크기를 정의한다. 읽기를 주로하는 웹 데이터베이스에서는 무시해도 좋지만 트렌젝션을 처리해야하는 데이터베이스나 대용량 자료가 부가되는 보고용 데이터베이스에서는 이 값을 크게 하는 것이 성능에 큰 영향을 준다. 자료의 양에 따라서 이 값을 12에서 256 세그먼트 사이에서 증가시키는데 처음에는 보수적으로 작은 값에서 시작해서 로그에 경고 메세지가 나오기 시작할 때에 숫자를 키우도록 한다. 필요로 하는 디스크의 용량은 (checkpoint_segments * 2 +1) * 16MB으로 32로 지정했을 대에 1GB 정도의 용량이 된다. 따라서 충분한 디스크 공간이 확보되도록 해야한다.
max_fsm_pages : 부분적으로 비어있는 페이지를 추적하기 위한 저장소 크기를 지정한다. 이 페이지들의 빈 공간에는 새 자료가 저장될 것이다. 올바르게 이 값을 지정하면 VACUUM이 빨라지고 VACUUM FULL과 REINDEX를 실행해야 하는 상황을 방지 할 수 있다. vacuum이 실행되고 그 다음 vacuum이 실행되는 사이에 갱신이나 삭제 작업으로 건드려지는 데이터 페이지의 총 수보다 약간 커야 한다. 이 값을 측정하는 두가지 방법 중 하나는 VACUUM VERBOSE ANALYZE을 실행하는 것이다. 또 다른 하나는 autovacuum을 사용 한다면 이 값을 데이터베이스에서 사용하는 총 데이터 페이지값의 백분율을 나타내는 -V 설정값에 따라 지정하는 것이다. fsm_pages는 매우 작은 양의 메모리만 요구하므로 충분한 값을 주는데 인색하지 않는 것이 좋다.
vacuum_cost_delay : 만약에 큰 테이블을 가지고 있고 동시에 많은 양의 쓰기 작업이 이뤄지고 있다면 VACUUM의 처리시간을 길게 하는 대신에 I/O에 부담을 적게 주는 이 새 기능을 사용하기 원할 것이다. 이 기능은 아주 새로운 것이라서 이에 종속된 5가지 복잡한 설정들로 성능 테스트를 몇번 해보지 못했다. vacuum_cost_delay를 0 이외의 값으로 증가시키면 이 기능은 작동 한다. 50에서 200ms 사이에서 합리적인 수치를 사용하도록 한다. 세밀한 조정을 위해서 vacuum_cost_page_hit를 증가시키고vacuum_cost_page_limit를 감소시키면 vacuum 작업들의 충격을 완화시키고 대신 더 오래 작업을 하게 만들 것이다. Jan Wieck의 트렌젝션 처리 테스트에서 delay는 200, page_hit는 6, limit는 100으로 했더니 vacuum의 충격이 80%이상 감소했고 실행 시간은 3배 늘어났다.

4. Query Planner
이들 설정들은 질의를 어떻게 실행할지 계획을 세울 때에 작업 비용을 최소화 하고 최고의 가능한 질의 수행 계획을 도출하도록 해준다. 귀찮더라도 봐야할 가치가 있는 설정들은 다음 두가지이다.
effective_cache_size: query planner에게 케쉬될 것이라 예상될 수 있는 가장 큰 데이터베이스 객체의 크기를 알려준다. 전용 서버라면 보통 RAM의 2/3정도로 설정 할 수 있다. 다용도 서버에서는 다른 어플리케이션이 사용하는 메모리 용량과 OS 디스크 케쉬가 얼마나 되는지 예측해서 그 만큼을 빼도록 한다.
random_page_cost : index로 읽혀지는 데이터 페이지를 탐색하는데 소요되는 평균 비용의 예측값이다. 빠른 디스크 어레이를 가진 빠른 기계의 경우 3.0, 2.5나 심지어 2.0까지 작은 값을 줄 수 있다. 그러나 데이터베이스의 처리되는 부분이 RAM보다 큰 경우가 많다면 기본 값인 4.0까지 되돌리는 것이 낫다. 반면에 질의 성능에 따라 이 값을 조정하는 방법도 있다. 만약 인덱스 스켄 대신에 시퀀셜 스켄을 선호하는 것이 부당해 보인다면 이 값을 낮추어 본다. 만약 타지 말아야 할 느리 인덱스를 상용한다면 높여 본다. 테스트는 다양한 여러 종류의 질의로 해야 하고 2.0 이하로는 낮추지 말아야 한다. 만약 2.0보다 낮춰야 할 것 같다면 계획자 통계 같은 다른 영역의 설정을 바꿔보도록 한다.

5. Logging
log_destination : 지난 버젼의 직관적이지 않은 syslog 설정을 대치한다. OS의 관리용 로그(syslog나 eventlog)나 분리된 PostgreSQL log(stderr)을 사용하도록 선택할 수 있다. 전자는 시스템 모니터링에 유리하며 후자는 DB 문제 해결과 튜닝에 유리하다.
redirect_stderr: 분리된 PostgreSQL log를 사용하기로 결정 했다면 이 설정은 코멘드 라인 리디렉션 대신에 PostgreSQL에 내장된 유틸리티를 사용해서 파일에 로그를 저장 할 수 있게 해주며 자동으로 log를 로테이션 해준다. 이 값을 True로 하고 log_directory에 log가 저장될 디렉토리를 알려주도록 한다. log_filename과 log_rotation_size, log_rotation_age의 기본값은 대부분의 사람들에게 적합할 것이다.

6. Autovacuum과 당신
8.0을 유용하게 사용하기 원한다면 VACUUM과 ANALYZE를 포함한 유지보수 계획을 수립하려고 할 것이다. 만약 가지고 있는 데이커베이스가 상당히 균일한 정도의 데이터 저장이 일어나면서도 대규모의 자료 저장과 삭제가 필요 없거나 빈번히 재시작되지 않는다면 일정 스케쥴에 따라 실행되는 vaccum 보다는 pg_autovacuum을 설치하는 것이 낫다는 뜻이다. 이유는 다음과 같다.

테이블들이 그 사용 정도에 따라 vacuum 되면 읽기만 한 테이블들은 제외된다.
데이터베이스의 사용량이 증가함에 따라 vacuum되는 빈도도 자동으로 증가한다.
사용 안하는 공간을 계산하기 쉽고 필요 이상의 공간을 사용하지 않도록 한다. 
autovacuum을 설치하려면 PostgreSQL 소스의 contrib/pg_autovacuum 디렉토리에 있는 모듈을 간단히 컴파일 하면 된다. 윈도우에서는 ?PGInstall 패키지 안에 autovacuum이 포함되어 있다. README에 상세히 나와있는데로 stats 설정들을 켜야 한다. 설정을 했으면 PostgreSQL을 실행 한 이후 autovacuum을 별도의 프로세스로 실행한다.

이 프로세스는 PostgreSQL을 정지 시키면 자동으로 멈출 것이다.

autovacuum의 기본 설정값은 역시 매우 보수적이면서 매우 작은 데이터베이스에 보다 적합하도록 되어 있다. 저자는 보통 다음과 같이 약간 공격적인 설정을 사용한다.
-D -v 400 -V 0.4 -a 100 -A 0.3
이 설정은 테이블이 400 row + 40%의 테이블이 갱신되거나 삭제되었을 때에 vacuum이 실행 되도록 하며 100 row + 30%의 테이블이 생성, 갱신, 삭제된 후에analyze 한다. 이 설정을 사용할 때에는 max_fsm_pages를 데이터베이스의 페이지 수의 50%로 설정하는데 이 수가 부족해서 database에 필요이상 디스크 용량을 차지하지 않다는 확신이 있다. 현재 OSDL에서 다양한 설정으로 테스트 하고 있으며 곧 이 이상의 심한 수치도 적용해 볼 것이다.

vacuum delay 옵션을 설정하기 위해서 postgresql.conf 대신에 autovacuum을 사용할 수도 있다. vacuum delay는 매우 큰 테이블이나 인덱스를 가지고 있는 시스템에서는 절대적으로 중요해질 수 있다. 설정을 하지 않았다면 적절치 못한 시점에서 실행되는 autovacuum이 중요한 db 작업을 정지 시킬 수 있다.

불행히도 8.0의 autovacuum에는 앞으로 없어졌으면 하는 두가지 심각한 한계가 있다.

장기간 유지되는 메모리가 없다.autovacuum은 데이터베이스를 재시작할 때 마다 모든 작동 추적 정보를 잃어 버린다. 따라서 일상적인 재시작을 한다면 재시작 바로 전이나 후에 전체 데이터베이스에 대해 vacuum analyze를 해야 한다. 
서버가 얼마나 바쁜지 주의하지 않는다. 원래는 vacuum을 시작하기 전에 시스탬 부하를 점검할 계획이 있었다. 그러나 지금은 그런 기능이 없다. 따라서 극단적인 부하가 절정일 때에는 autovacuum이 오히려 방해가 된다. 

Copyright (c) 2005 by Josh Berkus and Joe Conway. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/).
:
Posted by Elick
2011. 1. 12. 17:08

Windows xp, Virtual Box, CentOS, PostgreSQL Work/PostgreSQL2011. 1. 12. 17:08

Windows에 PostgresSQL을 설치해보았으니 이제 Linux 에도 해보자.
설치까지는 별거 없었다.
역시 Test 환경을 만드는 것이 쉽지 않았다.
팀내 SE분이 아니었으면 엄청난 삽질을 했을 것으로 예상된다.(SE님 감사합니다 (--)(__))

. Virtual Box 설치 : 무리없음.
. Virtual Box로 CentOS설치 : image file 있으면 무리없음.
. Virtual Box에 Guest Addon 설치 : 무리 없음.
. Virtual Box의 CentOS에 PostgreSQL 설치 : 무리없음.
. 내 PC에서 Virtual Box의 CentOS의 PostgreSQL를 접속 : 이것이 생소했다. 아래처럼 설정한다.
1. 내 PC(windows xp)에서 [제어판]->[새 하드웨어 추가] 실행.
이 하드웨어를 컴퓨터에 이미 연결했습니까? -> yes
설치된 하드웨어 -> 새 하드웨어 장치 추가
원하는 작업을 선택하십시오. -> 목록에서 직접 선택한 하드웨어 설치
일반 하드웨어 종류 -> [네트워크 어댑터]
제조업체 -> [Microsoft], 네트워크 어댑터 -> [Microsoft Loopback Adapter]
다음, 마침
2. [내 네트워크 환경] -> [속성] 을 보고 새로운 [로컬 영역 연결 n] 이 추가되어 있는 것을 확인.
  새로 생성된 [로컬 영역 연결 n]의 [속성]에서 [인터넷 프로토콜(TCP/IP)] 의 속성을 편집한다.
다음 IP 주소 사용 선택
IP 주소 : 192.168.n.1
서브넷 마스크 : 255.255.255.0
기본 게이트웨이: (비워둔다)
3. Virtual Box에서 네트워크 카드가 2장인 것으로 인식하게 네트워크 카드를 추가한다.
Virtual Box의 CentOS power off
Virtual Box의 메뉴 중 [설정]
왼쪽 메뉴 중 [네트워크] 선택 
어댑터가 4개 보인다.
특별한 설정을 하지 않았다면, [어댑터1]은 NAT로 연결된 것을 확인할 수 있다.
[어댑터 2]를 사용하기로 한 후 [브릿지 어댑터] 로 설정한다.
[확인] 클릭 후 CentOS Startup
4. Virtual Box의 CentOS에서 해당 Loopback Adapter의 IP 대역을 사용하게 한다.
Gnom에서 작업.
[System] -> [Administration] -> [Network] 실행
Inactive 되어 있는 Device를 선택.
[Statically set IP addresses] 를 선택.
Address :192.268.n.2
Subnet mask:255.255.255.0
[OK] 선택
PostgreSQL startup
5. 내 PC에서 5432 port가 해당 IP로 연결되는지 확인
telnet 192.168.n.2 5432
6. 연결 잘 되면 완료. 연결 잘 안되면 처음부터 다시 확인.

. 다음에는 처음부터 잘 정리해서 올려볼가??
:
Posted by Elick
2011. 1. 11. 11:54

PostgreSQL - fsync Work/PostgreSQL2011. 1. 11. 11:54

PostgreSQL이 설치 된 후 Data Directory에 보면, postgresql.conf 라는 설정 파일이 있다.
이 설정 파일의 parameter 들 중 fsync 에 대해서 test해 본 결과를 기록한다.
이 옵션의 의미는 사용자가 시스템 콜 혹은 DML, DDL 등의 결과를 메모리에서 Disk로 내려쓰는 일을 하는 것을 의미한다.
언제 어떤 조건에서 내려쓰는지는 찾지 못했지만, 기본적으로 시간 날때 마다 쓰는 듯 한 느낌...
(좀 더 공부를..ㅠㅠ)

아래는 Test 결과...

create table t_20110110_03 ( name varchar(30) );
create table t_20110110_04 ( name varchar(30) );

SELECT COUNT(*) FROM t_20110110_02; -- 4,292,608

INSERT INTO t_20110110_03 SELECT * FROM t_20110110_02;
-- fsync off : 13860 ms
INSERT INTO t_20110110_04 SELECT * FROM t_20110110_02;
-- fsync on :  25125 ms

truncate table t_20110110_03;
truncate table t_20110110_04;

INSERT INTO t_20110110_03 SELECT * FROM t_20110110_02;
-- fsync on : 23516 ms
INSERT INTO t_20110110_04 SELECT * FROM t_20110110_02;
-- fsync off : 13860 ms

마지막 2개의 해당 쿼리를 실행할 때의 Phisical Disk Write 모습..

화면에 제대로 안잡혔는데... 위의 모습으로 보아 디스크의 효율적인 사용은 fsync off가 더 나은 듯 하다.
당연한 이야기 이지만, 상황에 따라 잘 써야 할 듯...
:
Posted by Elick
2011. 1. 6. 17:55

PostgreSQL Install - Windows Work/PostgreSQL2011. 1. 6. 17:55

[Installation Download]
 http://www.enterprisedb.com/products/pgdownload.do#windows 에서 필요한 설치 File을 Download 한다.
실제 postgresql-9.0.1-1-windows.exe 를 Download하여 실행하면 별 문제없이 설치된다.

[.NET에서 PostgreSQL을 연결하기 위해서는 아래처럼 해야 한다는데... 확인이 필요하다.]
 http://cafe.naver.com/idea30.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=109
:
Posted by Elick
2011. 1. 6. 17:54

PostgreSQL Install - CentOS Work/PostgreSQL2011. 1. 6. 17:54

옛날 옛날에는  ftp://ftp.postgresql.org 로 부터 소스를 다운로드 받아서 설치를 해야 하는 상황이 있었다고 한다.
오늘날에는 그렇게 하지 않아도 간단히 설치를 할 수 있다.
현재 KIPI의 전략사업기획팀에 설치된 Test Server는 CentOS 5.5 이고, 이 경우 root로 바로 설치가 가능하다.
root로 설치를 하는 것이 과연 올바른가에 대한 문제는 여전히 남아있지만, 현재는 그렇게 설치되어 있다.

[설치방법]
. 설치 : yum -y install postgresql postgresql-server postgresql-odbc postgresql-jdbc postgresql-devel
. 설치확인 : rpm -qa | grep postgresql

위 처럼 설치하면, 기본적으로 PostgreSQL 7.xx version이 설치된다.

[기본설정]
설치가 종료된 후 기본적인 설정을 해 주어야 평상시 사용하는 것처럼 외부에서 DBMS에 접속 및 질의를 할 수 있다.
-----------------------------------------------------------------------------
vi /var/lib/pgsql/data/postgresql.conf
#-- 외부에서 접근할 수 있도록 아래 내용을 수정
listen_address='*'
port = 5432
max_connections = 100
vi /var/lib/pgsql/data/pg_hba.conf
#-- 외부에서 접근할 수 있도록 아래 내용을 추가
host    all         all         0.0.0.0/0               password
-----------------------------------------------------------------------------
[PostgreSQL의 시작과 종료]
PostgreSQL의 시작과 종료는 root로 한다. (이 부분은 root로 설치했으므로 root로 해야 할 듯..)
. 시작:/etc/init.d/postgresql start
. 종료:/etc/init.d/postgresql stop

[PostgreSQL 설치 후 postgres 계정 암호 설정]
외부에서 PGAdmin으로 접속을 위해서 postgres의 패스워드를 지정하자.
psql 로 접속한 후에 아래의 명령어로 설정하면 된다.
ALTER USER postgres WITH ENCRYPTED PASSWORD '<password>';


:
Posted by Elick