PostgreSQL FAQ

마지막으로 고친 날짜 : 1998년 5월 7일

한글판 관리 : 정직한 ( honest@hitel.net )

최신문서는 postgreSQL 웹사이트, http://postgreSQL.org 에서 볼 수 있습니다.

리눅스에 관련된 질문들은 다음 문서에 정리되어 있습니다.
http://postgreSQL.org/docs/faq-linux.shtml

Irix 에 관련된 질문들은 다음 문서에 정리되어 있습니다.
http://postgreSQL.org/docs/faq-irix.shtml

------------------------------------------------------------------------

질문들 :

  1. 일반적인 질문
    1. PostgreSQL 이 무엇입니까??
    2. PostgreSQL 은 어디에서 실행될 수 있습니까?
    3. PostgreSQL 을 어디에서 구할 수 있을까요?
    4. PostgreSQL 의 저작권은 어떻게 됩니까?
    5. PostgreSQL 에 대한 지원
    6. 최신버전의 PostgreSQL
    7. PostgreSQL 의 상용버전이 있습니까?
    8. PostgreSQL 에 관해 어떤 문서들이 있습니까?
    9. PostgreSQL 은 SQL 의 어떤 버전을 사용합니까?
    10. PostgreSQL 의 이전버전에서 사용하던 데이타베이스들을 PostgreSQL 에서 사용할 수 있나요?
    11. PostgreSQL 을 위한 ODBC 드라이버가 있습니까?
    12. 웹페이지에 PostgreSQL 을 연결시키기위한 도구로는 어떤 것이 있습니까?
    13. PostgreSQL 에 GUI (graphical user interface) 가 있나요? 리포트 제너레이터는요? 내장 질의어 인터페이스는 있습니까?
    14. 어떻게 해야 SQL 을 배울 수 있나요?
    15. PostgreSQL 과 연결할 수 있는 프로그래밍 언어에는 어떤 것이 있습니까?

  2. 설치/설정에 대한 질문
    1. initdb 가 실행되지 않습니다.
    2. postmaster 를 실행키려고 하면 다음과 같은 메시지가 나옵니다. "FindBackend: could not find a backend to execute..." "postmaster: could not find backend to execute..."
    3. 시스템이 콤마(,) 와 소수점(.), 그리고 날짜 형식 등을 혼동하는 것 같습니다.
    4. /usr/local/pgsql 외의 다른 곳에 PostgreSQL 을 설치하려면 어떻게 합니까?
    5. postmaster 를 실행시키면 Bad System Call core dumped 라는 메시지가 나옵니다.
    6. postmaster 를 시작하려고 하면 IpcMemoryCreate 라는 에러가 나옵니다.
    7. 소스파일을 변경했습니다. 하지만 재컴파일이 그 변경을 알아차리지 못하는 것 같습니다.
    8. 어떻게 해야 다른 호스트에서 내 PostgreSQL 에 접근하는 것을 막을 수 있습니까?
    9. 'root' 사용자가 데이타베이스에 접근할 수 없습니다.
    10. 테이블을 동시에 억세스하려고 하면 모든 서버가 죽습니다. 왜죠?
    11. 성능을 높이기 위해서 어떻게 데이타베이스 엔진을 튜닝해야 합니까?
    12. PostgreSQL 에 디버깅을 위한 기능이 어떤 것이 있습니까?
    13. 32개 이상의 백엔드를 동시에 사용하려면 어떻게 합니까?
    14. 유닉스가 아닌 다른 플랫폼에서도 사용할 수 있습니까?

  3. 조작에 관한 질문
    1. PostgreSQL 에서 중첩된 서브쿼리를 지원합니까?
    2. 룰을 사용하는데 문제가 많습니다.
    3. 대형객체의 중간에 써넣는 작업을 안전하게 (reliably) 할 수가 없는 것 같습니다.
    4. PostgreSQL 의 클라이언트 어플리케이션은 어떻게 만들어야 합니까?
    5. pg_group 을 어떻게 설정하죠?
    6. 바이너리 커서와 일반 커서의 차이점이 정확히 뭡니까?
    7. R-tree 인덱스가 무엇이며, 어디에 쓰이는 거죠?
    8. 튜플의 최대 크기가 어떻게 됩니까?
    9. 인덱스를 정의했지만 쿼리에서 사용되지 않는 것 같습니다. 왜 그렇습니까?
    10. 정규식 검색을 어떻게 하면 됩니까? 대소문자를 구분하지 않고 정규검색을 하려면요?
    11. vacuum 을 하는 도중에 서버 크래시가 일어났습니다. lock 파일을 어떻게 없애야 합니까?
    12. 여러가지 캐릭터 형들의 차이점은 무엇입니까?
    13. 쿼리 안에서 필드가 NULL 값인지 아닌지 어떻게 알아낼 수 있나요?
    14. 쿼리 옵티마이저가 내 쿼리를 어떻게 처리하는지 볼 수 있습니까?
    15. 시리얼 필드를 어떻게 만들죠?
    16. 데이타베이스 디렉토리에 생기는 pg_psort.XXX 파일들은 뭡니까?
    17. 다른 컴퓨터에서 내 데이타베이스로 왜 연결할 수가 없을까요?
    18. 데이타베이스에 어떤 인덱스나 오퍼레이션이 정의되어 있는지 어떻게 알 수 있습니까?
    19. 타임워프 기능이 무엇이며, vacuum 과는 무슨 관계가 있죠?
    20. oid 는 무엇입니까? tid 는 무엇입니까?
    21. PostgreSQL 에서 사용되는 몇몇 용어들의 뜻을 알고 싶습니다.
    22. 유전알고리듬을 사용하는 쿼리 최적화(Genetic Query Optimization)가 뭐죠??
    23. 테이블에서 컬럼을 제거하려면 어떻게 합니까?
    24. 쿼리에서 처음 몇 로우만 SELECT 하려면 어떻게 합니까?
    25. 왜 "time" 이라는 이름의 컬럼은 만들 수 없죠?
    26. 일반적인 파일의 자료들을 데이타베이스에 저장하려면 어느정도의 디스크 공간이 필요한가요?

  4. PostgreSQL 확장에 대한 질문
    1. 사용자정의 함수를 만들어서 psql 에서 실행시켰더니 코어가 덤프됩니다.
    2. NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 이라는 메시지가 나옵니다.
    3. PostgreSQL 용으로 새로운 자료형(types) 과 함수들을 멋지게 만들어 놓았습니다.
    4. 튜플을 리턴하는 C 함수를 어떻게 만들어야 합니까?

  5. 버그
    1. 버그리포트를 어떻게 하면 됩니까?

1절 : 일반적인 질문

1.1) PostgreSQL 이 무엇입니까??

PostgreSQL 은 차세대 DBMS (database management system) 연구의 프로토타입인 POSTGRES DBMS 의 발전된 형태입니다. PostgreSQL 이 강력한 데이타 모델과 풍부한 데이타형을 그대로 유지하면서 PostQuel 질의어를 확장된 SQL 의 서브셋으로 대체했습니다. PostgreSQL 은 공짜이며 전체 소스가 공개되어 있습니다.

PostgreSQL 개발은 PostgreSQL 개발자 메일링리스트를 구독하는 인터넷 개발자들의 모임에 의해 이루어지고 있습니다. 현재 코디네이터는 마크 G. 푸르니에(Marc G. Fournier, scrappy@postgreSQL.org ) 입니다. 참여하고 싶으신 분은 밑의 내용을 참조하십시오. 현재로써는 이 팀이 PostgreSQL 의 개발을 모두 담당하고 있습니다.

PostgreSQL 1.01 의 저자는 앤드류 유(Andrew Yu)와 졸리 첸(Jolly Chen)이었습니다. 다른 많은사람들이 포팅, 테스팅, 디버깅, 그리고 코드를 향상시키는데 참여했습니다. PostgreSQL 은 Postgres 로부터 파생되었는데, Postgres 의 원래 코드는 캘리포니아 대학 버클리의 마이클 스톤브레이커 교수의 지도 하에 많은 대학원생, 학부생, 그리고 스태프 프로그래머들이 노력한 결과물이었습니다.

버클리에서 개발될 때 이 소프트웨어의 원래 이름은 Postgres 였습니다. 1995년에 SQL 기능이 추가되면서 Postgres95 로 바뀌었습니다. 1996년 말에 다시 이름이 PostgreSQL 로 바뀌었습니다.

1.2) PostgreSQL 은 어디에서 실행될 수 있습니까?

저자들은 PostgreSQL 을 다음 플랫폼에서 컴파일하고 테스트해보았습니다. (어떤 경우에는 gcc 2.7.0 을 필요로 합니다)

다음 플랫폼에서는 문제점과 버그들이 발견되었습니다.

1.3) PostgreSQL 을 어디에서 구할 수 있을까요?

PostgreSQL 의 주된 anonymous FTP 사이트는 다음과 같습니다 :

다음과 같은 미러사이트들이 있습니다 :

1.4) PostgreSQL 의 저작권은 어떻게 됩니까?

PostgreSQL 의 저작권은 다음과 같습니다.

PostgreSQL Data Base Management System

Copyright (c) 1994-6 Regents of the University of California

이 소프트웨어와 그 문서의 사용, 복사, 수정, 배포는 어떤 목적이든 상관없이 무료로, 서면동의 없이 다음 조건 하에 허락됩니다. 위의 저작권 사항과 이 문단, 그리고 다음 두 문단이 모든 사본에 유지되어야만 합니다.

캘리포니아 대학은 직접적이든 간접적이든 특별하든 사고였든 어떤 경우에도 이 소프트웨어와 그 문서를 사용함으로써 결과적으로 일어나는 금전적인 손해를 포함하여 어떤 위험에 대해서도 비록 캘리포니아대학이 그러한 위험의 가능성에 대해 충고를 받았다고 할지라도 책임지지 않는다.

캘리포니아 대학은 특히 (Postgres가) 특정한 목적에 적합하여 판매할 수 있을 것이라는 보증을 포함하여 그 외의 어떤 보증도 하지 않는다. 여기에 제공되는 소프트웨어는 "있는 그대로" 제공되며 캘리포니아 대학은 유지보수, 기술지원, 업데이트, 향상, 수정 등을 제공할 어떤 의무도 없다.

1.5) PostgreSQL 에 대한 지원

UC Berkeley, 혹은 원래의 저자들로부터의 공식적인 지원은 없습니다. 자원봉사자들의 노력에 의해서만 유지보수가 이루어집니다.

주 메일링리스트는 questions@postgreSQL.org 입니다. 버그보고와 수정을 비롯하여 PostgreSQL 에 대한 것들을 토론하기 위한 곳입니다. 구독을 원한다면 제목줄이 아닌, 편지 본문에 다음 내용을 입력하여 아래의 e-mail 어드레스로 보내십시오.

subscribe
end
questions-request@postgreSQL.org
요약 리스트도 열려있습니다. 요약 리스트를 구독하려면 questions-digest-request@postgreSQL.org 로 본문에는 다음 내용을 입력하여 메일을 보내주십시오.

subscribe
end
요약판은 메인 리스트 메시지의 양이 30k 정도 찰 때마다 이 리스트의 멤버들에게 보내집니다.

버그 메일링리스트도 있습니다. 이 리스트를 구독하려면 다음과 같은 본문으로 bugs-request@postgreSQL.org 로 메일을 보내세요 :

개발자들의 토론을 위한 메일링리스트도 있습니다. 이 리스트를 구독하려면 다음과 같은 본문으로 hackers-request@postgreSQL.org 에 메일을 보내세요 :

subscribe
end
PostgreSQL 에 대한 추가정보는 PostgreSQL 의 WWW 홈페이지에서 찾을 수 있습니다.

http://postgreSQL.org

1.6) 최신버전의 PostgreSQL

가장 최신버전은 PostgreSQL 6.3.2 입니다.

매 석 달마다 메이저 릴리즈를 내놓을 계획입니다.

1.7) PostgreSQL 의 상용버전이 있습니까?

일러스트라 (Illustra Information Technology, 인포믹스의 자회사) 에서 일러스트라라고 불리는 객체-관계형 DBMS 를 판매하며 이것은 Postgres 에 기반한 것입니다. 일러스트라는 PostgreSQL 과 유사하지만 더 많은 기능을 가지고 있고, 더 안정적이며 성능도 좋습니다. 그리고 실제적인 문서와 지원을 해주고 있습니다. 반면에 돈이 들지요. 자세한 정보를 원하시면 sales@illustra.com 으로 알아보세요.

1.8) PostgreSQL 에 관해 어떤 문서들이 있습니까?

사용자 매뉴얼, 매뉴얼 페이지, 그리고 약간의 테스트 예제들이 배포판에 들어 있습니다. pgintro, sql, 그리고 pgbuiltin 매뉴얼 페이지들이 특히 중요합니다. pgintro 에는 모든 매뉴얼페이지의 목록이 들어있습니다.

psql 에서 \d 명령어로 자료형과 연산자, 함수, aggregates 등에 대한 정보를 볼 수 있습니다.

임플리멘테이션 가이드와 함께 포스트그레스의 설계 개념과 기능에 대한 다섯 편의 논문을 웹페이지에서 찾아볼 수 있습니다.

1.9) PostgreSQL 은 SQL 의 어떤 버전을 사용합니까?

PostgreSQL 은 SQL-92 의 서브셋을 지원합니다.

1.10) PostgreSQL 의 이전버전에서 사용하던 데이타베이스들을 PostgreSQL 에서 사용할 수 있나요?

PostgreSQL v1.09 에서는 v1.01 에서 만들어진 데이터베이스가 호환됩니다.

이전 버전에서 6.3 으로 업그레이드하려면 덤프와 리스토어 과정을 거쳐야 합니다.

6.2 이전 버전에서 6.2.1 으로 업그레이드하려면 덤프와 리스토어 과정을 거쳐야 합니다.

6.2 에서 6.2.1 로의 업그레이드는 덤프를 하지 않아도 됩니다. 배포판의 /migration 디렉토리에 있는 적절한 파일을 보십시오.

1.09 이전 버전에서 업그레이드하려면 먼저 dump/reload 를 하지 않은 채 1.09 로 업그레이드한 후, 1.09 에서 자료를 덤프하고 그것을 6.2.1 이나 6.3으로 올려야 합니다.

1.11) PostgreSQL 을 위한 ODBC 드라이버가 있습니까?

PostODBC 와 OpenLink ODBC, 이렇게 두 종류의 ODBS 드라이버가 있습니다.

PostODBC 는 배포판에 포함되어있습니다. PostODBC 에 관심있는 사람들을 위해 PostODBC 만을 다루는 메일링리스트가 둘 있습니다.

이 리스트들은 일반적인 majordomo 메일링리스트입니다. 다음 주소로 메일을 보내면 구독할 수 있습니다.

OpenLink ODBC 는 매우 널리 사용되고 있습니다. http://www.openlinksw.com 에서 찾을 수 있습니다. 이것은 PostgreSQL 의 표준 ODBC 클라이언트 소프트웨어에서 지원이 되므로 사용자는 PostgreSQL 이 지원하는 모든 클라이언트 플랫폼에서 PostgreSQL ODBC 를 사용할 수 있습니다.

상업용 소프트웨어 수준의 지원을 원하는 사람들에게 이것을 판매하게 될 수도 있습니다. 하지만 공개 버전도 언제든지 구할 수 있을 것입니다. postgres95@openlink.co.uk 로 문의하세요.

1.12) 웹페이지에 PostgreSQL 을 연결시키기위한 도구로는 어떤 것이 있습니까?

다음은 데이타베이스와 연동된 웹페이지에 대해 잘 설명해 놓은 웹사이트입니다.

http://www.webtools.com

웹 연동을 위해서라면 PHP 가 아주 훌륭한 인터페이스입니다. URL은 다음과 같습니다.

http://www.php.net

PHP 가 단순한 작업을 위해서는 매우 뛰어납니다. 하지만 더 복잡한 작업을 위해서라면 아직도 CGI.pm 과 펄 인터페이스를 사용하기도 합니다.

WDB 에 기반하여 펄을 사용하는 WWW 게이트웨이를 다음의 곳에서 다운로드 받을 수 있습니다.

1.13) PostgreSQL 에 GUI (graphical user interface) 가 있나요? 리포트 생성기는요? 내장 질의어 인터페이스는 있습니까?

배포판에 포함되어 있는 것으로 pgaccess 라는 훌륭한 GUI 가 있습니다. 리포트 생성기도 함께 들어있습니다.

ecpg 라는 것도 있는데, C 를 위한 내장(embedded) SQL 질의어 인터페이스입니다. 역시 배포판에 포함되어 있습니다.

1.14) 어떻게 해야 SQL 을 배울 수 있나요?

http://w3.one.net/~jhoffman/sqltut.htm 에 훌륭한 튜토리얼이 있습니다. 많은 사용자들이 The Practical SQL Handbook, Bowman et al, Addison Wesley 를 선호합니다.

1.15) PostgreSQL 과 연결할 수 있는 프로그래밍 언어에는 어떤 것이 있습니까?

아래와 같습니다:


2절 : 설치에 관한 질문

2.1) initdb 가 실행되지 않습니다.

2.2) postmaster 를 실행키려고 하면 다음과 같은 메시지가 나옵니다. "FindBackend: could not find a backend to execute..." "postmaster: could not find backend to execute..."

아마 경로설정이 잘못되어있을 겁니다. 'postgres' 실행파일이 실행경로 안에 있어야 합니다.

2.3) 시스템이 콤마(,) 와 소수점(.), 그리고 날짜 형식 등을 혼동하는 것 같습니다.

로케일 설정을 점검해 보세요. PostgreSQL 은 postmaster 프로세스를 실행시킨 사용자의 로케일 설정을 사용합니다. 해당 로케일을 운영환경에 맞추세요.

2.4) /usr/local/pgsql 외의 다른 곳에 PostgreSQL 을 설치하려면 어떻게 합니까?

Makefile.global 을 편집하여 POSTGRESDIR 변수를 그에 맞게 변경해야 합니다. 아니면 Makefile.custom 을 만들고 POSTGRESDIR을 그곳에서 정의하세요.

2.5) postmaster 를 실행시키면 Bad System Call core dumped 라는 메시지가 나옵니다.

여러가지 원인이 있을 수 있습니다. 먼저 시스템 V 확장이 커널에 인스톨 되었는지 확인하세요. PostgreSQL 은 공유메모리를 사용하기 위해 커널지원을 필요로 합니다.

2.6) postmaster 를 시작하려고 하면 IpcMemoryCreate 라는 에러가 나옵니다.

커널에 공유메모리 설정이 잘못되었을 수 있습니다. 아니면 커널에서 사용가능한 공유메모리의 크기를 늘려주어야 합니다. 필요한 공유메모리의 양은 시스템의 구조, postmaster 의 버퍼 갯수에 따라 다릅니다. 대부분의 시스템에서는 버퍼 기본 갯수라면 최소 760K 까지 공유메모리가 필요합니다.

2.7) 소스파일을 변경했습니다. 하지만 재컴파일이 그 변경을 알아차리지 못하는 것 같습니다.

포함되는 파일들의 적절한 연결관계가 Makefile 에 포함되어 있지 않습니다. 'make clean' 을 실행시키고 make 를 다시 실행시키세요.

2.8) 어떻게 해야 다른 호스트에서 내 PostgreSQL 에 접근하는 것을 막을 수 있습니까?

기본적으로 PostgreSQL 은 해당기계에서 들어오는 접속만 허용하게 되어 있습니다. postmaster 에 -i 플래그를 추가하고 $PGDATA/pg_hba 를 알맞게 편집하여 호스트베이스 인증을 사용가능하게 해야 합니다.

2.9) 'root' 사용자가 데이타베이스에 접근할 수 없습니다.

유저 id 가 0 인 사용자 (root) 로 데이타베이스 사용자를 만들면 안됩니다. 그렇게 하면 해당 사용자들이 데이타베이스에 접근할 수 없게 됩니다. This is a security precaution because of the ability of any user to dynamically link object modules into the database engine.

2.10) 테이블을 동시에 억세스하려고 하면 모든 서버가 죽습니다. 왜죠?

세마포어를 지원하지 않도록 설정되어 있는 커널때문에 일어나는 문제입니다.

2.11) 성능을 높이기 위해서 어떻게 데이타베이스 엔진을 튜닝해야 합니까?

할 수 있는 일이 몇 가지 있습니다. postmaster 를 기동할 때 '-o -F' 를 선택하여 fsync() 를 사용하지 못하도록 만들 수 있습니다. 이렇게 하면 fsync() 가 작동하지 않으므로 매 트랜잭션이 끝날 때마다 디스크청소를 하지 않게 됩니다.

postmaster -B 로 실행하면 백엔드 프로세스들이 공유하는 공유메모리 버퍼의 수가 늘어납니다. 이 파라미터를 너무 높게 설정해 놓으면 프로세스가 시작되지 않거나 갑자기 죽어버립니다. 버퍼 하나의 크기는 8K 이고, 버퍼 초기치는 64 개입니다.

postgres -S 를 사용하여 각 백엔드 프로세스가 정렬을 위해서 사용하는 메모리의 최대크기를 늘릴 수 있습니다. 각 버퍼는 1K 크기이고 초기치는 512 개의 버퍼입니다.

CLUSTER 명령을 써서 베이스테이블에 있는 자료들을 인덱스에 맞도록 그룹지을 수 있습니다. 자세한 것은 cluster(1) 매뉴얼 페이지를 참고하세요.

2.12) PostgreSQL 에 디버깅을 위한 기능이 어떤 것이 있습니까?

PostgreSQL 에는 디버깅에 유용한 상태정보를 보여주는 기능이 몇 가지 있습니다.

먼저 configure 를 -enagle-cassert 옵션으로 실행시키면 assert() 가 백엔드의 진행상태를 감시하며 뭔가 이상이 일어났을 때 프로그램을 중지시킵니다.

postmaster 와 postgres 둘 다 몇가지 디버그 옵션을 사용할 수 있습니다. 첫 번째로 postmaster 를 기동시킬 때마다, 아래와 같이 표준출력과 표준에러출력을 로그파일로 보내는지 확인하십시오.

cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
이렇게 하면 PostgreSQL 의 최상위 디렉토리에 server.log 파일이 생길 것입니다. 이 파일은 서버가 맞닥뜨리믄 문제점이나 에러들에 대한 유용한 정보를 기록하게 됩니다. postmaster 의 -d 옵션을 사용하면 더 자세한 정보가 기록됩니다. -d 옵션은 디버그 레벨로 1-3 사이의 숫자를 받습니다. 디버그 레벨을 3으로 해놓으면 매우 방대한 로그파일이 생성될 테니 주의하십시오.

포스트그레스 백엔드를 커맨드라인에서 실행시킨 후 SQL 문장을 바로 입력할 수도 있습니다. 이 방법은 디버깅할때만 사용하는 편이 좋을 것입니다. 세미콜론이 아니라 개행문자가 쿼리의 끝을 나타낸다는 것에 주의하십시오. 만일 디버깅 심볼을 포함시켜 컴파일했다면 디버거를 사용하여 어떤 일이 일어나고 있는지 볼 수 있습니다. 백엔드가 postmaster 로부터 시작되지 않았기 때문에 완전히 동일한 환경은 아니며 locking/백엔드 상호작용 문제가 똑같이 일어나지는 않을 수도 있습니다. 어떤 운영체제에서는 실행되고 있는 백엔드를 직접 연결하여 문제를 분석할 수도 있습니다.

포스트그레스 프로그램에는 -s, -A, -t 옵션이 있으며 이것은 디버깅과 성능 측정에 매우 유용합니다.

어떤 함수들이 시간을 소비하는지 보여주도록 컴파일할 수도 있습니다. 이 백엔드 프로파일 파일들은 pgsql/data/base/dbname 디렉토리에 쌓이게 됩니다. 클라이언트 프로파일 파일은 현재 디렉토리에 쌓입니다.

EXPLAIN 명령 (FAQ 를 찾아보세요) 을 사용하면 PostgreSQL 이 사용자의 쿼리를 어떻게 번역하는지 볼 수 있습니다.

2.13) 32개 이상의 백엔드를 동시에 사용하려면 어떻게 합니까?

include/storage/sinvaladt.h 에서 MaxBackendId 의 값을 바꾸세요. 앞으로는 MaxBackendId 를 사용자가 설정할 수 있는 값으로 만들 계획입니다.

2.14) 유닉스가 아닌 다른 플랫폼에서도 사용할 수 있습니까?

libpq C 라이브러리, psql, 그리고 다른 인터페이스와 바이너리들을 MS 윈도우즈 플랫폼에서 실행되도록 컴파일 하는 것은 가능합니다. 그럴 경우, 클라이언트는 MS 윈도우즈에서 실행되며 다른 Unix 플랫폼에서 돌아가고 있는 서버와 TCP/IP 를 통해 통신할 수 있습니다.

시그너스의 Unix/NT 포팅 라이브러리를 사용해 PostgreSQL 데이타베이스 서버를 윈도우즈NT 로 포팅하려고 시도한 사람들이 있었지만 아직 성공한 사람은 없습니다.


3절 : PostgreSQL 의 기능

3.1) PostgreSQL 에서 중첩된 서브쿼리를 지원합니까?

지원합니다.

3.2) 룰을 사용하는데 문제가 많습니다.

현재 PostgreSQL 의 룰시스템은 몇몇 제한이 있습니다. 뷰를 지원할 정도는 되지만 Insert, Update, Delete 를 처리하기에는 아직 문제가 있습니다.

3.3) 대형객체의 중간에 써넣는 작업을 안전하게 (reliably) 할 수가 없는 것 같습니다.

인버전 대형객체시스템이 이제는 완벽하게 작동합니다. 더이상 대형객체때문에 어려움을 겪지 않으셔도 됩니다.

3.4) PostgreSQL 의 클라이언트 어플리케이션은 어떻게 만들어야 합니까?

PostgreSQL 에서는 C 에서 호출가능한 라이브러리 인터페이스와 그 외 다양한 인터페이스들을 지원합니다. /src/interfaces 디렉토리를 보십시오.

다른 사람들이 펄 인터페이스와 PostgreSQL 을 위한 WWW 게이트웨이등을 만들어 놓았습니다. 자세한 내용은 PostgreSQL 홈페이지를 참고하세요.

3.5) pg_group 을 어떻게 설정하죠?

현제 사용자그룹을 쉽게 설정할 수 있는 방법은 없습니다. pg_group 테이블을 명시적으로 insert/update 해야 합니다.예를 들자면 :

jolly=> insert into pg_group (groname, grosysid, grolist)
jolly=> values ('posthackers', '1234', '{5443, 8261}');
INSERT 548224
jolly=> grant insert on foo to group posthackers;
CHANGE
jolly=>

pg_group 의 필드들은 다음과 같습니다.

3.6) 바이너리 커서와 일반 커서의 차이점이 정확히 뭡니까?

declare 의 매뉴얼 페이지에 있는 설명을 참조하세요.

3.7) R-tree 인덱스가 무엇이며, 어디에 쓰이는 거죠?

r-tree 인덱스는 공간적인 데이타를 인덱싱하는데 쓰입니다. 해시 인덱스는 범위 검색을 처리할 수 없습니다. B-tree 인덱스는 1차원의 공간검색만을 처리할 수 있습니다. R-tree 인덱스는 다차원 데이타를 처리할 수 있습니다. 예를 들어 R-tree 인덱스가 point 형의 한 속성에 대해 만들어졌다고 하면 이 시스템에서는 사각형 안의 모든 점을 선택하라는 식의 쿼리에 더 효과적인 답을 제공할 수 있습니다.

원래의 R-tree 설계를 잘 설명하고 있는 논문은 다음과 같습니다.

Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.

스톤브레이커(Stonebraker)의 "Readings in Database Systems" 에서도 이 논문을 볼 수 있습니다.

내장된 R-Tree 인덱스는 폴리곤과 박스를 다룰 수 있습니다. 이론적으로 R-tree 는 더 높은 차원의 자료도 다룰 수 있습니다. 실제로는 R-tree 를 확장하는 것은 꽤 힘든 일이고 현재까지는 어떻게 해야하는지 방법을 설명해 놓은 문서가 없습니다.

3.8) 튜플의 최대 크기가 어떻게 됩니까?

튜플의 크기는 8K 바이트로 제한됩니다. 시스템 속성과 다른 부하를 고려한다면 안전하게 자료를 저장하기 위해서는 8000 바이트보다 더 작게 자료를 제한하는 것이 좋습니다. 8K 보다 더 큰 자료를 쓰려면 대형객체 인터페이스를 사용해 보세요.

튜플은 8K 경계를 넘어가지 않으므로 5K 짜리 튜플은 8K 의 저장공간을 사용하게 됩니다.

3.9) 인덱스를 정의했지만 쿼리에서 사용되지 않는 것 같습니다. 왜 그렇습니까?

PostgreSQL 은 자동적으로 통계를 유지하지 않습니다. 통계를 갱신하기 위해서는 명시적으로 'vacuum' 을 호출해야 합니다. 통계가 갱신되면 옵티마이저가 인덱스를 더 잘 사용하게 될 것입니다. 옵티마이저가 만능은 아니며 어떤 경우에는 (예를 들면 OR 절이 있는 경우) 있는 인덱스를 사용하지 않을 수도 있다는 것을 명심하십시오. 특정컬럼에 대한 최적화 통계를 보려면 'vacuum analyze' 를 사용하세요.

그래도 인덱스가 사용되지 않는다면 아마 부적절한 *_ops 형을 사용하는 필드에 인덱스를 지정했을 것입니다. 예를 들어 CHAR(4) 필드를 만들어 놓고 char_ops 인덱스 type_class 를 지정했을 수 있습니다.

create_index 의 매뉴얼 페이지를 보면 어떤 타입 클래스가 사용가능한지 알 수 있습니다. 필드 타입과 일치해야 하죠.

PostgreSQL 은 적절하지 않은 인덱스가 만들어졌다 해도 사용자에게 경고를 하지 않습니다.

ORDER BY 연산에서는 인덱스가 사용되지 않습니다.

3.10) 정규식 검색을 어떻게 하면 됩니까? 대소문자를 구분하지 않고 정규검색을 하려면요?

psql 의 \do 명령을 보세요.

3.11) vacuum 을 하는 도중에 서버 크래시가 일어났습니다. lock 파일을 어떻게 없애야 합니까?

vacuum 매뉴얼 페이지를 보세요.

3.12) 여러가지 캐릭터 형들의 차이점은 무엇입니까?

Type Internal Name Notes
CHAR char 1 character
CHAR(#)bpchar blank padded to the specified fixed length
VARCHAR(#)varcharsize specifies maximum length, no padding
TEXT text length limited only by maximum tuple length
BYTEA bytea variable-length array of bytes

내부연산(internal operations)을 할 때는 internal name 을 사용해야 합니다.

뒤쪽의 네 가지 형은 "varlena" 형입니다(즉 첫 네 바이트에 길이를, 나머지 바이트들에 자료를 넣습니다). CHAR(#) 는 필드에 얼마만큼의 자료가 들어가든 상관없이 길이의 최대치를 할당합니다. TEXT, VARCHAR(#), 그리고 BYTEA 는 가변길이로 자료를 저장하고 그때문에 약간의 성능저하를 가져오지요. 정확히 말하자면 성능저하는 이 자료형을 가진 첫번째 컬럼 뒤의 컬럼에 접근할 때 일어납니다.

3.13) 쿼리 안에서 필드가 NULL 값인지 아닌지 어떻게 알아낼 수 있나요?

IS NULL 과 IS NOT NULL 로 컬럼의 값을 검사하세요.

3.14) 쿼리 옵티마이저가 내 쿼리를 어떻게 처리하는지 볼 수 있습니까?

explain 의 매뉴얼 페이지를 보세요.

3.15) 시리얼 필드를 어떻게 만들죠?

PostgreSQL 은 사용자들이 사용자컬럼을 SERIAL 형으로 선언하는 것을 허락하지 않습니다. 대신, 각 로우의 oid 필드를 유니크한 값으로 사용할 수 있습니다. 어쨌든, 데이타베이스를 덤프하고 다시 로드할 필요가 있다면 pgdump 의 -o 옵션을 사용하거나 COPY 명령의 WITH OIDS 옵션을 사용하여 oid 를 보존할 수 있습니다.

SERIAL 과 비슷한 SEQUENCE 함수를 사용할 수도 있습니다. create_sequence 매뉴얼 페이지를 참조하세요.

다음과 같이 동일한 작업을 하는 함수를 만들 수도 있습니다.

create table my_oids (f1 int4);
insert into my_oids values (1);
create function new_oid () returns int4 as
'update my_oids set f1 = f1 + 1; select f1 from my_oids; '
language 'sql';
그리고는
create table my_stuff (my_key int4, value text);
insert into my_stuff values (new_oid(), 'hello');
이 함수를 사용할 때는 두 서버가 경쟁하여 하나가 업데이트를 하는 동안 다른 하나도 업데이트를 해서 결국 두 서버가 동일한 id 를 선택하게 될 수도 있다는 것을 염두에 두시기 바랍니다. 이 합수는 단일 트랜잭션 하에서 수행되어야 합니다.

contrib/spi/autoinc.c 에 있는 autoinc() 일반적인 트리거 함수를 사용하는 방법도 있습니다.

3.16) 데이타베이스 디렉토리에 생기는 pg_psort.XXX 파일들은 뭡니까?

그 파일들은 쿼리 실행프로그램에 의해 생성되는 임시정렬파일들입니다. 예를 들어 ORDER BY 를 만족하기 위해 정렬되어야 하는 경우가 있다면 그 정렬의 결과로 만들어지는 임시파일이지요.

현재 실행되고 있는 정렬이나 트랜잭션이 없다면 pg_psort.XXX 파일들을 삭제하는 것이 안전합니다.

3.17) 다른 컴퓨터에서 내 데이타베이스로 왜 연결할 수가 없을까요?

초기설정값으로는 단지 로칼 머신에서 오는 유닉스 도메인 소켓연결만을 허용합니다. TCP/IP 연결을 가능하게 하려면 postmaster -i 옵션을 사용하세요. 상대방 호스트를 pgsql/data/pg_hba 파일에 추가해야 합니다. pg_hba.conf 매뉴얼 페이지를 참조하세요.

3.18) 데이타베이스에 어떤 인덱스나 연산이 정의되어 있는지 어떻게 알 수 있습니까?

psql 에는 그런 정보를 보여주기 위하여 역슬래시로 시작하는 여러 명령을 준비해 놓고 있습니다. \? 를 사용하여 명령어들을 찾아보세요.

pgsql/src/tutorial/syscat.source 파일도 찾아보세요. 데이타베이스의 시스템 테이블에서 정보를 뽑아내기 위해 select 에 필요한 여러가지를 설명하고 있습니다.

3.19) 타임워프 기능이 무엇이며, vacuum 과는 무슨 관계가 있죠?

PostgreSQL 에서는 더이상 이 기능을 지원하지 않습니다. 지원하는 코드 모두가 삭제되었습니다. 성능개선과 디스크 저장공간을 절약하기 위해서였습니다.

3.20) oid 는 무엇입니까? tid 는 무엇입니까?

oid 는 유니크한 로우 id, 혹은 시리얼 컬럼에 해당하는 것입니다. PostgreSQL 에서 생성되는 모든 로우는 유니크한 oid 를 가지게 됩니다. initdb 에 의해 생성되는 모든 oid 는 16384 보다 작습니다(backend/access/transam.h에 의해). initdb 이후, 즉 사용자에 의해 생성되는 oid 는 그보다 같거나 크게 됩니다. 초기설정대로라면 모든 oid 들은 테이블, 혹은 데이타베이스 안에서 뿐만 아니라 설치된 PostgreSQL 전체에서 유일한 값을 가지게 됩니다.

PostgreSQL 은 내부 시스템 테이블에서 oid 를 가지고 개별 테이블들의 로우를 연결시키는데 사용합니다. oid 는 득별한 유저 로우를 구분하는데 쓰이고, 조인할 때도 쓰입니다. oid 값을 저장하기 위해서는 oid 컬럼타입을 사용하는 것이 바람직 합니다. sql(1) 매뉴얼 페이지에 다른 내부컬럼들에 대해 나와있습니다. oid 필드에 인덱스를 만들면 더 빠른 억세스가 가능합니다.

oid 는 모든 데이타베이스에 의해 사용되는 중앙영역에서부터 모든 새 로우에 할당됩니다. oid 를 무언가 다른 값으로 바꾸고 싶거나 테이블의 oid 를 유지한 채 복사본을 만들고 싶다면 다음과 같은 방법으로 할 수 있습니다.

CREATE TABLE new_table (mycol int);
INSERT INTO new_table SELECT oid, mycol FROM old_table;
tid 는 특별한 물리적 로우를 구분하는데 쓰이며 블록과 오프셋 값을 가집니다. tid 는 로우들의 값이 바뀌거나 다시 로드되면 변경되고, 인덱스 엔트리에 의해 물리적인 로우를 가리키는데 쓰입니다. SQL 을 통해서는 tid 에 접근할 수 없습니다.

3.21) PostgreSQL 에서 사용되는 몇몇 용어들의 뜻을 알고 싶습니다.

어떤 소스코드와 오래된 문서에서는 더 일반적인 용어들을 쓰고 있습니다. 예를 들자면 다음과 같습니다.

더 생각하고 있는 것이 있다면 알려 주십시오.

3.22) 유전알고리듬을 사용하는 쿼리 최적화(Genetic Query Optimization)가 뭐죠??

PosgreSQL 의 GEQO 모듈은 유전알고리듬(GA)을 이용하여 많은 테이블을 조인하는 쿼리 최적화 문제를 풀기 위한 것입니다. 이것은 non-exhaustive search 를 통해 큰 테이블을 조인하는 쿼리들을 가능하게 해줍니다.

정보가 더 필요하다면 README.GEQO 를 보십시오. utesch@aut.tu-freiberg.de

3.23) 테이블에서 컬럼을 제거하려면 어떻게 합니까?

ALTER TABLE DROP COLUMN 은 지원되지 않지만 다음과 같이 하면 됩니다.

SELECT ... -- 제거하려는 컬럼을 제외하고 나머지 컬럼을 모두 선택하세요
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;

3.24) 쿼리에서 처음 몇 로우만 SELECT 하려면 어떻게 합니까?

fetch 의 매뉴얼 페이지를 보세요.

이렇게 하는 것은 모든 결과 로우들이 클라이언트로 전송되는 것을 막을 뿐이고, 처음 몇 로우만 원한다고 할지라도 실제로 쿼리는 전체가 모두 처리됩니다. ORDER BY 를 사용해 보시기 바랍니다. 전체 쿼리가 모두 실행 및 정렬되기 전에 일부의 로우만을 리턴할 수 있는 방법은 없습니다.

3.25) 왜 "time" 이라는 이름의 컬럼은 만들 수 없죠?

6.2.1 에서 ANSI-92 표준을 더 충실히 따르기 위해 몇몇 예약어가 추가되었습니다. 다음 릴리즈에서는 이 제약이 없어질 것입니다. ftp.postgresql.org 에 있는 패치를 사용하면 이 컬럼 이름으로 "time" 을 쓸 수 있습니다.

3.26) 일반적인 파일의 자료들을 데이타베이스에 저장하려면 어느정도의 디스크 공간이 필요한가요?

300,000 행으로 되어있고, 각 행마다 두 개의 정수값을 가지고 있는 파일을 생각해 봅시다. 파일의 크기는 2.4 MB 입니다. 이 자료를 저장할 PostgreSQL 데이타베이스 파일의 크기는 다음과 같이 계산할 수 있습니다.

40 bytes + 각 로우의 헤더 (대략적인 크기)
 8 bytes + 4바이트 크기의 정수 필드 두 개 
 4 bytes + 튜플을 가리키는 포인터
-------- =
52 bytes : 한 로우 당 바이트수

PostgreSQL 의 데이타 페이지 크기는 8192 바이트이므로 :

8192 bytes per page
-------------------  =  157 rows : 데이타베이스 페이지당 로우 갯수 (반올림)
 52 bytes per row

300000 data rows
-----------------  =   1911 : 전체 자료 저장에 필요한 데이타베이스 페이지 수
157 rows per page

1911 database pages * 8192 bytes per page  =  15,654,912 or 15.5MB
인덱스는 이렇게 많은 오버헤드를 차지하지는 않지만 인덱스되는 자료를 포함하므로 역시 커질 수 있습니다.


4절 : PostgreSQL 확장하기

4.1) 사용자정의 함수를 만들어서 psql 에서 실행시켰더니 코어가 덤프됩니다.

여러가지 원인이 있을 수 있습니다. 사용자정의 함수를 독립된 테스트 프로그램에서 먼저 실행시켜 보시기 바랍니다. 또, 프론트엔드가 자료를 기다리는 동안, 그러니까 type_in() 이나 type_out 등의 함수가 실행되는 도중에 elog NOTICES 를 보내지는 않는지 확인해 보십시오.

4.2) NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 이라는 메시지가 나옵니다.

palloc 되지 않은 것을 pfree 하려고 할 때 나오는 에러입니다. 사용자정의 함수를 만들 때 "libpq-fe.h" 파일을 인클루드하지 마세요. 이것을 인클루드 시키면 palloc 이 malloc 으로 동작하게 되고 백엔드가 스토리지를 pfree 하려고 할 때 위와같은 메시지가 나타나게 됩니다.

4.3) PostgreSQL 용으로 새로운 자료형(types) 과 함수들을 멋지게 만들어 놓았습니다.

다른 PostgreSQL 사용자들과 그것들을 공유해 주시기 바랍니다. 만드신 것을 메일링리스트에 보내면 최종적으로 contrib/ 서브디렉토리로 가게 될 겁니다.

4.4) 튜플을 리턴하는 C 함수를 어떻게 만들어야 합니까?

매우 어려운 일입니다. 저도 시도해 본 적이 없군요. 원리적으로는 가능합니다만, 간단히 말해서... 안될 겁니다. 앞으로 언젠가는 가능하게 될 거에요.

5 절 : 버그

5.1) 버그리포트를 어떻게 하면 됩니까?

http://postgreSQL.org 의 FAQ 를 참고하세요.

FTP 사이트인 ftp://ftp.postgreSQL.org/pub 에서 더 최근의 PostgreSQL 이 있는지 살펴보세요.

"버그 템플릿" 파일에 기록해서 다음 주소로 보내십시오.

개발자 메일링리스트의 주소입니다.