PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)

原文最終更新日: Thu Dec 8 17:26:16 EST 2005

現在の維持管理者: Bruce Momjian (pgman at candle.pha.pa.us)
Maintainer of Japanese Translation: Jun Kuwamura (juk at PostgreSQL.jp)

この文書の最新版は http://www.postgresql.org/docs/faqs.FAQ.html で見ることがで
きます。

プラットホームに特有の質問については: http://www.postgresql.org/docs/faq/
に解答があります。

(以下、訳者による注釈を [訳注： と ] とで囲んで記します。)
[訳注：
        日本語版のFAQは、
                http://www.postgresql.org/docs/faqs.FAQ_japanese.html
        にあります。
        最新の日本語版については、この文書の最後にある「日本語版について」をごらんください。

]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                 一般的な質問

1.1) PostgreSQLとは何ですか？その呼び方は？
1.2) 誰が PostgreSQL をコントロールしますか？
1.3) PostgreSQLの著作権はどうなってますか？
1.4) PostgreSQLをサポートするプラットホームは？
1.5) PostgreSQLはどこから入手できますか？
1.6) 最新版はどれですか？
1.7) サポートはどこで受けられますか？
1.8) バグレポートはどのように発信しますか？
1.9) 既知のバグや未だ無い機能はどうやって見つけますか？
1.10) どのような文書がありますか？
1.11) SQLはどうすれば学べますか？
1.12) 開発チームにはどのように参加しますか？
1.13) 他のDBMSと比べてPostgreSQLはどうなのですか？

                          ユーザ・クライアントの質問

2.1) PostgreSQL にはどんなインターフェースが使えますか？
2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか？
2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか？

                                 管理上の質問

3.1) どうすれば、PostgreSQLを/usr/local/pgsql 以外の場所にインストールできます
か？
3.2) 他のホストからの接続はどのように制御しますか？
3.3) より良い性能を得るためには、データベース・エンジンをどのように調整しますか
？
3.4) どのようなデバグ機能が使えますか？
3.5) 接続しようとするときに 'Sorry, too many clients' が出るのはなぜですか？
3.6) PostgreSQLのメジャーリリースをアップデートするのにダンプとリストアをしなく
てはならないのはなぜですか？
3.7) ハードウェアにはどんなコンピュータを使えばよいですか？

                                 操作上の質問

4.1) 最初のいくつかのロウのみを select するにはどうしますか？ランダムなロウ？
4.2) 定義されたテーブル、インデックス、データベース、および、ユーザをどのように
して見つけ出しますか？
4.3) カラムのデータタイプを変更するにはどうしますか？
4.4) ロウ、テーブル、データベースの最大サイズは？
4.5) 一般的なテキストファイルのデータを保存するには、データベースのディスク容量
はどのくらい必要ですか？
4.6) クエリが遅いのはなぜでしょう？なぜ、インデックスが使われないのでしょうか？
4.7) クエリオプティマイザが、どのようにクエリを評価していかを、見るにはどうしま
すか？
4.8) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現
しますか？大文字と小文字とを区別しない検索のためのインデックスはどのように使い
ますか？
4.9) クエリの中で、フィールドがNULL であることを検出するにはどうしますか？フィ
ールドがNULLかどうかでどのようにソートができますか？
4.10) いろいろな文字型のそれぞれの違いは何ですか？
4.11.1) 通番(serial)／自動増分フィールドはどのようにつくりますか？
4.11.2) SERIALデータ型に挿入される値は、どうすれば得られますか？
4.11.3) currval() は他のユーザとの競合状態に陥ることはないですか？
4.11.4) トランザクションが中断したときにもういちどシーケンス番号が使われないの
はなぜですか？シーケンス／SERIALカラムに空きがあるのはなぜですか？
4.12) OID とは何ですか？ TID とは何ですか？
4.13) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るのはな
ぜですか？
4.14) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうしますか？
4.15) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか？
4.16) 外部結合(outer join)はどのように実現しますか?
4.17) 複数のデータベースを使う問い合わせはどのようにすればできますか？
4.18) 関数から複数のロウまたはカラムを返すにはどうしますか？
4.19) PL/PgSQL の関数の中で一時テーブルにアクセスするとき、どうして "relation
with OID ##### does not exist" というエラーを受け取るのでしょうか？
4.20) どのようなレプリケーションのソリューションがありますか？
4.21) テーブルとカラムの名前がクエリーの中で認識されないのはなぜですか？
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                 一般的な質問

1.1) PostgreSQLとは何ですか？その呼び方は？

PostgreSQLはPost-Gres-Q-L(ポスト・グレス・キュー・エル) と発音します。

また、ときによっては単純に Postgres として参照されます。この発音を聞きたい人の
ために、 MP3フォーマットの音声ファイルがあります。

PostgreSQL はオブジェクト-リレーショナルデータベースシステムで、伝統的な商用デ
ータベースシステムに、次世代DBMSシステムに見られるような改良が施された特徴を有
します。PostgreSQLは、無料で完全なソースコードを手に入れることができます。

PostgreSQL の開発は、ほとんどが、世界中にひろがったボランティアの開発者によって
、インターネットを通したコミュニケーションによって行われています。コミュニティ
によるプロジェクトであるため、どの企業の制御もうけません。開発に参加したければ
、 http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html にある開発者
のFAQを見てください。

1.2) 誰が PostgreSQL をコントロールしますか？

PostgreSQLの門番、中央委員会、あるいは、コントロールをする会社を探そうとしても
、諦めざるをえず ---- 存在しないのです。我々は、中心となるコミッティとCVSコミッ
タを持ちますが、これらのグループはコントロールするためというよりも、管理上のも
のです。ここでは、プロジェクトは、だれでも参加ができる開発者とユーザのコミュニ
ティにより方向付けられます。読者がやらなければならないことは、メーリングリスト
をサブスクライブして、議論に参加することです。（Developer's FAQには、PostgreSQL
開発に加わり方についての情報があります。）

1.3) PostgreSQL の著作権はどうなってますか？

PostgreSQL は下記の著作権に従います。

PostgreSQLは古くからのBSDライセンスの下で配布されています。それは基本的には、利
用者がそのコードを好き勝手に利用することが許されています。制限があるとすれば、
このソフトウェアに伴ういかなる問題においても法的に責任を我々に負わせることがで
きないということです。また、この著作権表示がこのソフトウェアのすべての複製に表
示することも必要です。以下に、我々が実際に使っているBSD使用許諾書を示します：

    [訳注：
        正文は英語です。参考として、訳文を併記掲載します。
    ]


PostgreSQL Data Base Management System

Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group Portions
Copyright (c) 1994-1996 Regents of the University of California

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written agreement is
hereby granted, provided that the above copyright notice and this paragraph and
the following two paragraphs appear in all copies.

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

        POSTGRESQL データベース管理システム

        部分的著作権 (c) 1996-2005, PostgreSQL国際開発チーム
        部分的著作権 (c) 1994-1996 カリフォルニア大学本校


          本ソフトウェアおよびその文書一式は上記の著作権表示と、この文章
        およびこれに続く二つの段落が全ての複製に添付されている限りにおい
        て、使用、複製、修正および配付の許可を、いかなる目的であっても、
        無償でかつ同意書無しに行なえることをここに認めます。

          カリフォルニア大学は、いかなる当事者にたいしても、利益の壊失を
        含む、直接的、間接的、特別、偶然あるいは必然的にかかわらず生じた
        損害について、たとえカリフォルニア大学がこれらの損害について訴追
        を受けていたとしても、一切の責任を負いません。

          カリフォルニア大学は、商用目的における暗黙の保証と、特定目的で
        の適合性に関してはもとより、これらに限らず、いかなる保証も放棄す
        ることを明言します。以下に用意されたソフトウェアは「そのまま」を
        基本原理とし、カリフォルニア大学はそれを維持、支援、更新、改良あ
        るいは修正する義務を負いません。

    [訳注：
        著作権に関する正文は上記の英語による表記です。日本語訳はあくまで
        参考です。
    ]


1.4) PostgreSQLをサポートするプラットホームは？

一般的に、最近のUnix互換プラットホームであればPostgreSQLを稼働させられるはずで
す。リリースの時点で実際にテストを行なったことの報告がなされたプラットホームに
ついてはインストール手引書に列挙してあります。

PostgreSQL は、Win2000, WinXP, そして、Win2003 のような Microsoft Windows NTベ
ースのオペレーティングシステムで、ネイティブに走ります。あらかじめパッケージに
されたインストーラが http://pgfoundry.org/projects/pginstaller にあり、利用でき
ます。MSDOSベースのWindowsのバージョン(Win95, Win98, WinMe)では、Cygwinを使って
PostgreSQL を走らせることができます。

    [訳注
        pgInstaller の入手はFTPミラーサイトの win32 ディレクトリからも可能です。
            http://www.postgresql.org/mirrors-ftp.html

        詳しくは、次の Windows版に関するFAQの和訳をごらんください。
        http://www.postgresql.jp/wg/jpugdoc/FAQ_windows.ja.html
    ]


次のサイトに Novell Netware 6 への移植版もあります。 http://forge.novell.com ま
た、OS/2 (eComStation) バージョンは、 http://hobbes.nmsu.edu/cgi-bin/h-search?
sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2Fにあります。


1.5) PostgreSQL はどこから入手できますか？

Webブラウザ経由だと、 http://www.postgresql.org/ftp/、それから、ftp経由だと、
ftp://ftp.PostgreSQL.org/pub/ を使います。

1.6) 最新版はどれですか？

PostgreSQL の最新版はバージョン 8.1.1 です。

我々は、1年毎にメジャーリリースを、数ヵ月ごとのマイナーリリースを行なうことを計
画しています。

    [訳注
        バージョン番号の x.y.z の最初の x.y がメジャーリリースの番号に相
        当し、最後の z がマイナーリリースの番号になります。メジャーリリー
        スの番号が同じであれば、データベース・クラスタに互換性があります。
    ]


1.7) サポートはどこで受けられますか？

PostgreSQL コミュニティは多くのユーザのために、電子メール経由の支援を提供してい
ます。電子メールリストをサブスクライブするためのメインとなるウェブサイトは
http://www.postgresql.org/community/lists/です。これから、始めるのであれば
general または、bugs といったリストがよいでしょう。

メジャーなIRC チャンネルは、Freenode (irc.freenode.net)の #postgresql というチ
ャンネルです。UNIX コマンドでは、 irc -c '#PostgreSQL' "$USER" irc.freenode.net
を使って参加できます。同じネットワークに、スペイン語のチャンネル (#
postgresql-es)もあり、フランス語のチャンネル (#postgresqlfr)もあります。EFNetに
もPostgreSQLチャンネルがあります。

    [訳注:
          1999年7月23日、日本ポストグレスユーザー会、略称JPUGが設立されました。
        JPUG は非営利組織で、PostgreSQLを利用する人達の相互協力の場となっています。
        (2003年5月17日、「日本PostgreSQLユーザ会」に名称を改めました。)
        正会員の会費は無料ですが、協賛会員の会費と会員の積極的な貢献が会の運営を助けています。
        詳しくは、JPUG のWeb サイト:
                http://www.PostgreSQL.jp/
        をごらんください。会員登録も可能となっています。

        日本語のIRCチャンネル '#PostgreSQL:*.jp' も存在します。
    ]


商用サポート会社のリストは http://techdocs.postgresql.org/companies.phpにありま
す。

1.8) バグレポートはどのように発信しますか？

http://www.postgresql.org/support/submitbug のPostgreSQL バグフォームを訪れてく
ださい。バグレポートを提出する仕方についての手引と指針があります。

それと同時に ftp サイト ftp://ftp.PostgreSQL.org/pub/ で、最新バージョンの
PostgreSQL を探してみてください。

1.9) どのような文書がありますか？

配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ)お
よびいくつかの小さなテスト例題が含まれます。 /docディレクトリをごらんください。
また、マニュアルは、 http://www.PostgreSQL.org/docs/でオンラインでも閲覧できま
す。

    [訳注:
        JPUG 文書・書籍関連分科会で翻訳されたマニュアルもあります。

        http://www.postgresql.jp/document/pg803doc/
        インプレスから、

        PostgreSQLオフィシャルマニュアルとして出版されています。

    ]


オンラインで参照できる PostgreSQL の本も2冊あります。 http://www.PostgreSQL.org
/docs/awbook.html

    [訳注:
        この本は、JPUG「PostgreSQL Book翻訳分科会」
        で翻訳され、ピアソンから
        「はじめてのPostgreSQL」として出版されています。
    ]


および、 http://www.commandprompt.com/ppbook/です。

    [訳注:
        邦訳は「実践 PostgreSQL」
        がオライリーから出版されています。
    ]


購入可能な書籍の目録は、http://techdocs.PostgreSQL.org/techdocs/bookreviews.php
にあります。 PostgreSQL 技術情報記事も、http://techdocs.PostgreSQL.org/ にあり
ます。

    [訳注:
        日本語の書籍等については、日本PostgreSQLユーザ会の、http://www.postgresql.jp/PostgreSQL/references.html
        もごらんください。
    ]


コマンドラインのクライアントプログラムpsql も、型、演算子、関数、集約、その他の
情報をお見せする、いくつかの素晴らしい \d コマンドを持ちます。 - \? を使うと利
用可能なコマンドが表示されます。

我々の Web サイトには、さらに沢山の文書があります。

1.10) 既知のバグや未だ無い機能はどうやって見つけますか？

PostgreSQLは拡張されたSQL:2003のサブセットをサポートします。我々のページの TODO
リストに、既知のバグや欠落機能や将来計画についての記述があります。

1.11) SQL はどうすれば学べますか？

まず、上記で述べた PostgreSQL についての本を読むことを検討してください。もうひ
とつは、 "Teach Yourself SQL in 21 Days, Second Edition" at http://
members.tripod.com/er4ebus/sql/index.htmです。

The Practical SQL Handbook, Bowman Judith S. et al., Addison-Wesley が多くのユ
ーザに好評です。ほかでは、The Complete Reference SQL, Groff et al., McGraw-Hill
も好評です。

素晴らしい手引書は、http://www.intermedia.net/support/sql/sqltut.shtm, http://
ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM, そして、http://
sqlcourse.com にあります。

    [訳注:
         日本PostgreSQLユーザ会の日本語の参考文献の紹介ページ

http://www.postgresql.jp/PostgreSQL/references.html
        があります。
         近藤直文氏の「初心者向のＤＢ設計入門・ＳＱＬ入門参考書紹介」のコーナー
                http://www.shonan.ne.jp/~nkon/ipsql/books_SQL.html
        があります(やや古い2000年版)。
         堀田倫英氏の「PostgreSQL日本語マニュアル」
                http://www.net-newbie.com/
        ではオンラインマニュアルの検索ができます。
         丸山不二夫氏のUNIX データベース入門
                http://www.wakhok.ac.jp/DB/DB.html
        もオンラインで読むことができます。
         Nikkei BP IT Pro にある石井達夫氏の PostgreSQL ウォッチ
        では毎回新しい情報をとりあげています。
    ]


1.12) 開発チームにはどのように参加しますか？

（開発者向けの）Developer's FAQをごらんください。

1.13) 他のDBMSと比べPostgreSQLはどうなのですか？

ソフトウェアを計る方法にはいくつかあります。機能と性能と信頼性とサポートと価格
です。

機能(Features)
    PostgreSQLは、トランザクション、サブクエリ、トリガー、ビュー、外部キー整合
    性参照、および、洗練されたロック機構など、大規模商用 DBMSが持つ機能をほとん
    ど持っています。さらに PostgreSQLは、ユーザ定義型、継承、ルール、それから、
    ロック競合を縮小するマルチバージョン同時性制御など、商用DBMSも持ち合わせな
    いような機能をいくつか持ち合わせています。
性能(Performance)
    PostgreSQLは他の商用あるいはオープンソースのデータベースと互角の性能も持ち
    ます。ある面ではより早かったり、ほかの面ではより遅かったりします。他のデー
    タベースに比べた性能は、ふつう +/-10% くらいでしょう。
信頼性(Reliability)
    我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解してます。十分テ
    ストして、安定したコードをバグを最小にしてからリリースするように努めてます
    。それぞれのリリースは少なくとも1 カ月以上のベータ・テストを行ない、これま
    でのリリースの履歴が、製品版として安定した堅固なリリースであることを物語っ
    ています。この分野では、他のデータベースと比べても遜色がないことに自信を持
    っています。
サポート(Support)
    我々のメーリングリストは、遭遇するいかなる問題についても解決への手助けをし
    てくれる、開発者やユーザの大きな集まりへの接点を提供しています。我々は問題
    の解決を保証することはできませんが、商用データベースであっても常に解決され
    るわけではありません。開発者や、ユーザ・コミュニティ、マニュアル類、それに
    、ソースコードなどへ直接アクセスできることによって、PostgreSQLのサポートは
    、他のDBMS サポートよりも優れたものとなっています。御要望に答えて、事柄毎の
    商用サポートなどもあります（FAQ1.7節をごらんください）。
価格(Price)
    PostgreSQLの利用は、商用でも非商用でも、すべて無料です。上記に示してあるBSD
    スタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで商品に組み
    込むことができます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                          ユーザ・クライアントの質問

2.1) PostgreSQL にはどんなインターフェースが使えますか？

PostgreSQL のインストールに含まれる物はCと組込み Cのインターフェースだけです。
その他のインターフェースは独立したプロジェクトで、別々にダウンロードされます。
分かれることで、それぞれの開発チームが独自のリリーススケジュールを持つことが許
されます。

PHP のようないくつかのプログラミング言語は、 PostgreSQLのインターフェースを含ん
でいます。Perl, TCL, Python, そして、そのほかの利用可能な言語のインターフェース
は、 http://gborg.postgresql.org の Drivers/Interfaces の節の中とインターネット
の検索でみつけられます。

2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか？

データベースを裏に持つ Web ページについての素晴らしい紹介が、
http://www.webreview.comにあります。

Web への拡張のためには、PHP(http://www.php.net/) が卓越したインターフェースとな
っています。

    [訳注:
          PHPに関する日本語の情報は、2000年4月19日に発足した日本PHPユーザ会のサイト
                http://www.php.gr.jp/
        あるいは、廣川 類さんのサイト
                http://www.geocities.jp/rui_hirokawa/php/
        にかなりまとめられています。
    ]


処理が複雑な場合、多くの人は Perl インターフェースと CGI.pm か mod_perl を使い
ます。

2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか？

もちろん、あります。詳細は、http://techdocs.postgresql.org/guides/GUITools をご
らんください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                 管理上の質問

3.1) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか？

簡単な方法は、 configure を走らせるときに --prefix オプションを指定することです
。

3.2) 他のホストからの接続はどのように制御しますか？

既定値では、PostgreSQL は Unix ドメインソケット、または、TCP/IP接続のローカルマ
シンからの接続しか許しません。postgresql.conf の中の listen_addresses を修正し
、かつ、$PGDATA/pg_hba.conf ファイルを適切に直して、ホスト主導型認証を有効にし
ないかぎりは、他のマシンからは接続できないでしょう。

3.3) より良い性能を得るためには、データベース・エンジンをどのように調整しますか
？

性能改善の可能性のありそうな主な領域が3つあります：

クエリの変更
    クエリを修正してより良い性能を得ることを含みます：
     □ 式および部分インデックスを含む、インデックスを作成
     □ 複数のINSERTのかわりにCOPYを使用
     □ 複数の文をグループ化し、1つのトランザクションにしてコミットのオーバヘッ
        ドを削減
     □ インデックスからから沢山のロウを取り出すときはCLUSTERを使用
     □ クエリの出力のサブセットを返すためにLIMITを使用
     □ 準備されているクエリを使用
     □ オプティマイザの正確な統計を維持するためにANALYZEを使用
     □ VACUUM または pg_autovacuum の常用
     □ 大きなデータ変更のあるときはインデックスを削除


サーバ構成
    postgresql.confの設定のいくつかは性能に影響します。詳しくは、
    Administration Guide/Server Run-time Environment/Run-time Configuration の
    全件リストをごらんください( JPUGサイトの日本語版)。そして、解説として、
    http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html お
    よび、 http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html をごら
    んください。

ハードウェアの選定
    性能におけるハードウェアの影響は http://candle.pha.pa.us/main/writings/
    pgsql/hw_performance/index.html (JPUGサイトの日本語版) と http://
    www.powerpostgresql.com/PerfList/ に述べられています。


    [訳注:
      JPUG理事長の片岡裕生氏による、「今すぐできるPostgreSQLチューニング」
      というコーナーが ThinkIT サイトにあり、実作業の参考になります。
        http://www.thinkit.co.jp/free/tech/10/1/1.html
    ]


3.4) どのようなデバグ機能が使えますか？

サーバ構成変数には多くの log_* があり、クエリとプロセスの統計を出力することがで
き、デバグと性能計測にとても便利です。

3.5) 接続しようとするときに 'Sorry, too many clients' が出るのはなぜですか？

既定での制限である 100 のデータベースセッションに達してしまっています。
postmasterが同時接続できるバックエンドプロセスの制限数を増やす必要があります。
postgresql.conf の中の max_connections の値を変更して postmasterを再起動するこ
とで可能になります。

3.6) PostgreSQLのメジャーリリースをアップデートするのにダンプとリストアをしなく
てはならないのはなぜですか？

PostgreSQLチームはマイナーリリースでは小さな変更しか行ないませんので、7.4.0 か
ら 7.4.1 へのアップグレードにはダンプとリストアの必要はありません。しかし、メジ
ャーリリース(たとえば、7.2から7.3へのような) では、システムテーブルやデータファ
イルの内部フォーマットの変更をしばしば行ないます。これらの変更はたいてい複雑で
、そのため我々はデータファイルのための後方互換性を維持することができません。ダ
ンプは汎用フォーマットでデータを出力し、それを新しい内部フォーマットに読み込む
ことができます。

3.7) ハードウェアにはどんなコンピュータを使えばよいですか？

PCハードウェアはほとんど互換性がありますので、ほとんどの人は、すべてのPCハード
ウェアが同じ品質だと思い込む傾向があります。しかし、それは間違いです。ECC RAM、
SCSI、および、高品質マザーボードは、安いハードウェアに比べると、より信頼性が高
く、より性能も良いのです。 PostgreSQL はほとんどのハードウェアで稼働しますが、
信頼性や性能が重要な場合は、ハードウェアのオプションを研究することが賢明です。
メーリングリストでもハードウェアオプションとトレードオフについて議論することが
できます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                 操作上の質問

4.1) 最初の数ロウのみを SELECTするにはどうしますか？ランダムなロウ？

たったの数行のロウを取り出すために、何行必要かがわかれば、 SELECT のときに
LIMIT を使います。 ORDER BYにインデックスがマッチした場合、まったくクエリが実行
されないこともあります。SELECT のときに何行が必要かを知らなければ、カーソルを使
いFETCHします。

ランダムロウをSELECTするには、次の文を使います：

    SELECT col
    FROM tab
    ORDER BY random()
    LIMIT 1;

4.2) 定義されたテーブル、インデックス、データベース、および、ユーザをどのように
して見つけ出しますか？psqlで使われているクエリを表示するにはどうしますか？

psql の中で \dtコマンドを使ってテーブルを見ることができます。psqlの中で \? を使
って、コマンドの全リストを調べることができます。一方で、psql のソースコードで、
バックスラッシュコマンドを出力する pgsql/src/bin/psql/describe.c ファイルを読む
こともできます。その中には、 SQL コマンドを生成する部分も含まれます。また、 -E
オプションを付けて psql を開始すると、入力されたコマンドを実行するためのクエリ
を印字出力するようになります。 PostgreSQLは SQL 準拠の INFORMATION SCHEMA イン
ターフェースを提供しますので、データベースについての情報を問い合わせることもで
きます。

pg_ で始まるシステムテーブルでもこれらを記述することができます。

psql -lを使うと全てのデータベースをリストします。

それと、pgsql/src/tutorial/syscat.source を試してみてください。そこには、データ
ベースのシステムテーブルから情報を得るために必要な SELECT 文が沢山あります。

4.3) カラムのデータ型を変更するにはどうしますか？

カラムのデータ型の変更は 8.0 以降では、 ALTER TABLE ALTER COLUMN TYPE を使うこ
とにより間単になりました。

それより前のバージョンでは、以下のようにします:

    BEGIN;
    ALTER TABLE tab ADD COLUMN new_col new_data_type;
    UPDATE tab SET new_col = CAST(old_col AS new_data_type);
    ALTER TABLE tab DROP COLUMN old_col;
    COMMIT;

これを行なったときは、抹消された行が使っているディスク空間を回収するために
VACUUM FULL tabをしたほうが良いかもしれません。

4.4) ロウ、テーブル、データベースの最大サイズは？

制限は以下のとおりです:

    データベースの最大サイズ?        制限無し (32 TB のデータベースも存在しま
                                     す)
    テーブルの最大サイズ?            32 TB
    ロウの最大サイズ?                1.6TB
    フィールドの最大サイズ?          1 GB
    テーブル内での最大ロウ数?        制限無し
    テーブル内での最大カラム数?      カラムの型によって 250-1600
    テーブル内での最大インデックス   制限無し
    数?

もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーやスワップスペー
スの大きさにより制限されます。性能はこれらの値がことのほか大きな時に煽りを受け
ます。

最大テーブルサイズの32TBはオペレーティングシステムによる巨大ファイルのサポート
は必要としません。巨大なテーブルは複数の1GBのファイルに分けて保存されますので、
ファイルシステムの制限は重要ではありません。

デフォルトのブロックサイズを32kにすることで、最大テーブルサイズと最大カラム数と
を4倍にすることができます。

ひとつの制限は、約2,000文字以上の長さのカラムにインデックスを付けることができな
いことです。幸いにも、そのようなインデックスは実際は必要ありません。長いカラム
のMD5ハッシュの関数インデックスは一意性がなによりの保険で、また、フルテキストの
インデックスではカラム内の単語を検索することができます。

4.5) 一般的なテキストファイルのデータを保存するには、データベースのディスク容量
はどのくらい必要です？

普通のテキストファイルを PostgreSQL のデータベースに保存するには、最大で約5倍の
ディスク容量を必要とします。

例題として、各行に整数とテキスト記述を持つ 100,000行のファイルを考えてみましょ
う。テキストの文字列の平均長さを20バイトと仮定すると、フラットファイルの大きさ
は約2.8MB です。このデータを含む PostgreSQL データベースファイルの大きさは次の
ように約6.4MBと見積もることができます：

    28 bytes: 各ロウのヘッダ(概算)
    24 bytes: 整数(int)フィールドとテキスト(text)フィールド
   + 4 bytes: ページ上のタップルへのポインタ
   ----------------------------------------
    56 bytes per row

   PostgreSQL のデータページサイズは 8192バイト(8KB)なので:

   8192 bytes per page
   -------------------   =  146 rows per database page (切り捨て)
     56 bytes per row

   100000 data rows
   --------------------  =  685 database pages (切り上げ)
      146 rows per page

  685 database pages * 8192 bytes per page  =  5,611,520 bytes (5.6 MB)

インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされる
データを含む以上、それなりに大きくなります。

NULLはビットマップとして保存されていて、それらがわずかにスペースを使います。

4.6) クエリが遅いのはなぜでしょう？なぜ、インデックスが使われないのでしょうか？

インデックスは、すべてのクエリで使われるわけではありません。テーブルが最小サイ
ズより大きく、クエリでそのわずかなパーセンテージのロウを選択する時だけ、インデ
ックスは使われます。これはインデックススキャンにより起こされるランダムなディス
クアクセスは、テーブルをストレートに読む順次走査よりも遅くなることがあるからで
す。

インデックスを使うかを決定するために、PostgreSQL はテーブルについての統計情報を
持たなければなりません。この統計情報は、 VACUUM ANALYZEまたは、単に ANALYZE を
使って収集することができます。統計情報を使ってオプティマイザはテーブルの中にあ
るロウ数を知り、インデックスを使うべきかの決定をより正しくできます。統計情報は
最適な結合順や結合方法を決める上でも貴重なものもあります。統計情報の収集は、テ
ーブルの内容が変わる毎に繰返しなされるべきです。

インデックスは、通常 ORDER BY や結合を行なうためには使われません。順次スキャン
に続く明示的ソートは、巨大なテーブルのインデックススキャンよりも普通は高速です
。

しかし、ORDER BYと組み合わされたLIMIT は、テーブルの小さな部分を返すためにたび
たびインデックスを使うでしょう。実際、MAX() や MIN() がインデックスを使わないと
しても、このような値をORDER BY と LIMIT を使ってインデックスを使って取り出すこ
とが可能です:

    SELECT col
    FROM tab
    ORDER BY col [ DESC ]
    LIMIT 1;

もし、オプティマイザが間違ってシーケンシャルスキャンを選択したことに疑いがなけ
れば、SET enable_seqscan TO 'off'に設定して、クエリをもう一度実行し、インデック
ススキャンがまちがいなく速くなっているかどうかをみてください。

LIKE あるいは ~ のようなワイルドカード演算子は特別な環境でしか使えません：

 ・ 検索文字列が文字列の最初にききます。たとえば：
     □ LIKE パターンが%で始まらない
     □ ~ (正規表現) パターンは^で始まらなければならない
 ・ 検索文字列を文字クラスから始めることはできません。たとえば、[a-e]。
 ・ ILIKE や ~* のような大文字と小文字を区別しない検索は使えません。そのかわり
    、このFAQの4.8節で説明する式インデックスが使えます。
 ・ initdb においては、デフォルトでCロケールが使われなくてはなりません。その理
    由は、Cロケール以外では次に大きな文字を知ることができないからです。このよう
    な場合、

    LIKE

    インデクシングにだけ働くような、特別な

    text_pattern_ops

    インデックスを作成することもできます。

8.0より前のリリースでは、インデックスは、データ型がちょうどインデックスのカラム
の型と一致しなければ、使えないことがしばしばありました。おそらく、int2, int8,
および numeric 等のカラムのインデックスがそうです。

4.7) 問い合わせオプティマイザがどのように問い合わせを評価するのかを見るにはどう
しますか？

オンラインマニュアルで EXPLAIN を見てください。

4.8) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現
しますか？大文字と小文字とを区別しない検索のためのインデックスはどのように使い
ますか？

~演算子は正規表現照合を行ない、~* は大文字と小文字を区別しない
(case-insensitive)正規表現照合を行います。大文字と小文字を区別しない LIKE 演算
子を ILIKE といいます。

大文字と小文字を区別しない等値比較は次のように表現できる：

    SELECT *
    FROM tab
    WHERE lower(col) = 'abc';

標準インデックスでは使われず、しかしながら、もし、式インデックスを作ったならそ
れが使われるでしょう。

    CREATE INDEX tabindex ON tab (lower(col));

上記のインデックスがUNIQUEで作成された場合、カラムは大文字と小文字を格納できま
すが、その違いが文字ケースだけであっても同一にはなりません。あえて特定の文字ケ
ースをカラムに格納するには CHECK制約か、トリガーを使ってください。

4.9) クエリの中で、フィールドがNULL であることを検出するにはどうしますか？フィ
ールドがNULLかどうかでどのようにソートができますか？

以下のように、IS NULL と IS NOT NULLで、そのカラムをテストしてみます：

   SELECT *
   FROM tab
   WHERE col IS NULL;

NULL状態でソートするには、IS NULL と IS NOT NULL の修飾子を ORDER BY 句の中で使
ってみます。true のものは false のものよりも高い値として並べられますので、次の
例では NULL の記載が結果リストの上部に置かれます。

   SELECT *
   FROM tab
   ORDER BY (col IS NOT NULL)

4.10) いろいろな文字型のそれぞれの違いは何ですか？

        型     内部名                      備考
    VARCHAR(n) varchar 最大長のサイズを指定する、詰め物無し
    CHAR(n)    bpchar  指定された固定長となるように空白が詰められる
    TEXT       text    長さに特別な上限は無し
    BYTEA      bytea   可変長のバイト配列(null-byte safe)
    "char"     char    1文字

内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージを
受け取るときです。

上記の型のうち最初の４つの型は "varlena" 型です(すなわち、ディスクの最初の４バ
イトがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は宣言
された大きさよりも少し大きくなります。しかし、長い値は圧縮されるので、ディスク
上の空間は思ったよりも小さくなります。

VARCHAR(n) は可変長の文字列を保存するのに最適ですが、保存できる文字列の長さに制
限があります。TEXT は長さに制限の無い文字列の保存のためのもので、最大で 1ギガバ
イトです。 CHAR(n)は、VARCHAR(n)が与えられた文字だけを保存するのに対し、ブラン
クを詰め込んでいつも同じ長さで文字列を保存するのに最適です。BYTEAは、部分的に
NULL のバイトを含むバイナリデータを保存するためのものです。これらのタイプは同じ
くらいの性能特性をもちます。

4.11.1) 通番(serial)／自動増分フィールドはどのようにつくりますか？

PostgreSQL は SERIAL データ型をサポートします。カラム上にシーケンスを自動作成し
ます。たとえば、

    CREATE TABLE person (
        id   SERIAL,
        name TEXT
    );

は自動的に次のように翻訳されます:

    CREATE SEQUENCE person_id_seq;
    CREATE TABLE person (
        id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
        name TEXT
    );

    [訳注：
        CREATE UNIQUE INDEX person_id_key ON person ( id );
        は、 7.3 以降は自動的には行なわれなくなりました。
    ]


通番についてのもっと詳しい情報は、オンラインマニュアルで create_sequence をごら
んください。

4.11.2) SERIALデータ型に挿入される値は、どうすれば得られますか？

ひとつの方法は、nextval() 関数を使ってその値を挿入する前(before)に SEQUENCE オ
ブジェクトから次の SERIAL 値を取り出し、それから実際に挿入をすることです。
4.11.1 のテーブルの例を使うとすると、疑似言語ではこのようになります。

    new_id = execute("SELECT nextval('person_id_seq')");
    execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");

そうして、new_id に保存した新しい値を他のクエリ(たとえば、 person テーブルに対
する外部キー(foreign key)のように)使うとよいでしょう。自動的に作られたSEQUENCE
オブジェクトの名前は、<table>_<serialcolumn>_seq のようになり、このうち、table
と serialcolumn はそれぞれテーブルの名前とSERIALカラムの名前です。

あるいは、与えられたSERIAL値を、それが既定値として挿入された後で(after)、
currval() 関数を使って取り出すこともできます。たとえば、

    execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
    new_id = execute("SELECT currval('person_id_seq')");

4.11.3) currval() は他のユーザとの競合状態に陥ることはないですか？

それはありません。currval() は、すべてのユーザではありませんが、読者のセッショ
ンに与えられた現在の値を返します。

4.11.4) トランザクションが中断したときにもういちどシーケンス番号が使われないの
はなぜですか？シーケンス／SERIALカラムに空きがあるのはなぜですか？

同時性を改善するために、実行中のトランザクションに、必要に応じてトランザクショ
ンが終了するまでロックされないようシーケンス値を与えています。このためトランザ
クションが中断されると番号割り当てにギャップを生じます。

4.12) OID とは何ですか？ CTID とは何ですか？

PostgreSQLでつくられるすべてのロウは、WITHOUT OIDS でつくられないかぎり一意の
OIDを得ます。 OIDは自動的に4バイトの整数で与えられ、それは、全インストレーショ
ンを通して一意な値となります。しかし、約40億でオーバーフローし、そして、OIDは重
複をしはじめます。PostgreSQLは内部システムテーブルを一緒にリンクするためにOID
を使います。

ユーザのテーブルのカラムに一意の番号を付けるためには、 OID ではなく SERIAL を使
うのが最もよいでしょう。SERIALの連番は1つのテーブル内でのみ一意になるからで、オ
ーバーフローを起こしにくいと考えられます。 8バイトのシーケンス値を保存するため
に、SERIAL8があります。

CTID は、特定の物理ロウをブロックとオフセットの値で識別するために使われます。
CTIDは、ロウが修正されたり再読込みされたときに変わります。また、物理ロウを差す
ためにインデックスの記載に使われます。

4.13) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るのはな
ぜですか？

おそらく、システムの仮想メモリーを全て使い果たしてしまっている可能性があるか、
カーネルがあるリソースについてもつ制限値が低すぎる可能性があります。postmaster
を始動する前にこれを試してみてください：

    ulimit -d 262144
    limit datasize 256m

シェルによって、どちらかひとつが成功するでしょうが、これはプロセスのデータセグ
メント制限をより高く設定し、たぶんクエリが完結するようになるでしょう。このコマ
ンドは現行のプロセスと、このコマンドを走らせた後に作られる全てのサブプロセスに
ついて適用されます。バックエンドがとても多くのデータを返すためにSQL クライアン
トで問題が続いているのであれば、クライアントを開始する前にこれを試してみてくだ
さい。

4.14) どのバージョンの PostgreSQL を走らせているかを調べるにはどうしますか？

psql から SELECT version(); をタイプします。

4.15) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか？

CURRENT_TIMESTAMPを使います:

    CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

4.16) 外部結合(outer join)はどのように実現しますか?

PostgreSQL は SQL 標準構文を使う外部結合(アウタージョイン)をサポートします。こ
こに 2つの例題があります。

    SELECT *
    FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

あるいは

    SELECT *
    FROM t1 LEFT OUTER JOIN t2 USING (col);

これらの象徴的なクエリでは t1.col を t2.col と結合して、t1 の結合されなかったロ
ウ(t2 と一致しなかったロウ)も返しています。RIGHT 結合は t2 の結合されなかったロ
ウを加えるでしょう。FULL 結合は、一致したロウに t1 と t2 からは結合されなかった
ロウを返すでしょう。OUTER という言葉はオプションで LEFT, RIGHT, または FULL な
どの結合を仮定されています。通常、結合はINNER結合と呼ばれます。

4.17) 複数のデータベースを使う問い合わせはどのようにすればできますか？

現行のデータベース以外への問い合わせの方法はありません。というのもPostgreSQLが
データベース仕様のシステムカタログを読み込むためで、そこには、たとえそのふりを
するだけにしろ、データベースを越えて問い合わせをするすべがありません。

contrib/dblink はデータベース間(cross-database)の問い合わせを関数呼出しにより許
します。もちろん、クライアントは同時に接続を別のデータベースへも張らなくてはな
らず、結果をクライアント側でマージしなくてはなりません。

4.18) 関数から複数のロウまたはカラムを返すにはどうしますか？

集合を返す関数(Set Returning Functions): http://techdocs.postgresql.org/guides/
SetReturningFunctions を使うと簡単です

。

4.19) PL/PgSQL の関数の中で一時テーブルにアクセスするとき、どうして "relation
with OID ##### does not exist" というエラーを受け取るのでしょうか？

PL/PgSQL は関数スクリプトをキャッシュし、不幸にもその副作用で、 PL/PgSQL関数が
一時テーブルにアクセスする場合、後でそのテーブルを消して作りなおされ、関数がも
う一度呼び出されると、その関数はキャッシュしている関数の内容はまだ古い一時テー
ブルを差し示したままだからです。この、解決策として、PL/PgSQLの中で EXECUTE を一
時テーブルへのアクセスのために使います。そうすると、クエリは毎回パースをやり直
しされるようになります。

4.20) どのようなレプリケーションのソリューションがありますか？

「レプリケーション」と一言でいいますが、レプリケーションをするための技術はいく
つかあり、それぞれ、利点と欠点があります。

マスタ／スレーブのレプリケーションは、読み／書きのクエリを受け取るシングルマス
タが可能で、スレーブでは読み／SELECTの問い合わせだけを受け付けることができます
。最も人気がある、フリーで利用できる、マスタ−スレーブのPostgreSQLレプリケーシ
ョンソリューションは、 Slony-I です。

マルチ−マスタのレプリケーションは、読み／書きのクエリを受けとり、複数のレプリ
ケートさせるコンピュータに送ることができます。この機能は、サーバ間の変更の同期
が必要なため、性能に重大な衝撃を与えます。 Pgcluster は、このようなソリューショ
ンとしてPostgreSQLのためにフリーで利用できるものとして、最も人気があります。

この他にも、商用やハードウェア−ベースのレプリケーションソリューションがいろい
ろなレプリケーションモデルをサポートしています。

4.21)テーブルとカラムの名前がクエリーの中で認識されないのはなぜですか？

もっとも一般的な原因は、テーブルを作成する際に、テーブルやカラムを囲う二重引用
符の使用です。二重引用符を使うと、テーブルとカラムの名前（識別子と呼びます）は
大文字と小文字の区別をして格納されます。したがって、pgAdminのようにテーブル作成
のときに自動的に二重引用符を使うものはクエリの中でそれらの名前を使うときに二重
引用符を付けなくてはならないことを意味します。このため、識別子を認識させるため
には以下のいずれかを心がけます。

 ・ テーブルを作成するときに二重引用符で識別子を囲うことを避ける
 ・ 識別子には小文字だけを使う
 ・ クエリの中で参照するときは二重引用符で識別子を囲う

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

「日本語版について」

[訳注：
  日本語版の製作については以下の通りです。

  最終更新日:   2005年12月14日
  翻訳者:       桑村 潤 (Jun Kuwamura <juk at PostgreSQL.jp>)

  このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):

                田仲 稔(Minoru TANAKA <Tanaka.Minoru at keiken.co.jp>)
                石井 達夫(Tatsuo ISHII <t-ishii at sra.co.jp>)
                齊藤 知人(Tomohito SAITOH <tomos at elelab.nsc.co.jp>)
                馬場  肇(Hajime BABA <baba at kusastro.kyoto-u.ac.jp>)
                岡本 一幸(Kazuyuki OKAMOTO <kokamoto at itg.hitachi.co.jp>)
                小菅 昭一(Shoichi Kosuge <s-kosuge at str.hitachi.co.jp>)
                山下 義之(Yoshiyuki YAMASHITA <dica at eurus.dti.ne.jp>)
                境 真太郎(Sintaro SAKAI <s_sakai at mxn.mesh.ne.jp>)
                生越 昌己(Masami OGOSHI <ogochan at zetabits.com>)
                石川 俊行(Toshiyuki ISHIKAWA <tosiyuki at gol.com>)
                本田 茂広(Shigehiro HONDA <fwif0083 at mb.infoweb.ne.jp>)
                せせ じゅん(Jun SESE <sesejun at linet.gr.jp>)
                神谷 英孝(Hidetaka KAMIYA <hkamiya at catvmics.ne.jp>)
                菅原 敦(Atsushi SUGAWARA <asugawar at f3.dion.ne.jp>)
                稲葉 香理(Kaori Inaba <i-kaori at sra.co.jp>)
                石井 達夫(Tatsuo Ishii <t-ishii at sra.co.jp>)

  をはじめ、ポストグレスに関する話題豊富な日本語PostgreSQLメーリングリスト、
  和訳のきっかけを作ってくれたり、いつもチェックをしてくれる
   JF(Linux Japanese FAQ)プロジェクト、FreeBSD ドキュメンテーションプロジェクト
  の方々、それから、直接あるいは間接的にかかわってくださるすべてのオープンソース
  コミュニティのみなさまに感謝いたします。


  この翻訳文書は 本家 "Frequently Asked Questions"  のページに "Japanese FAQ"
  という項目であります。

  また、最新版は以下のサイトにあります。
        http://www.PostgreSQL.jp/wg/jpugdoc/ 「JPUG文書・書籍関連分科会」
        http://www.linux.or.jp/JF/JFdocs/INDEX-database.html 「Linux JFプロジェクト」
        http://www.rccm.co.jp/~juk/pgsql/ 「PostgreSQL Notes for Japanese」（翻訳者ページ）

  なお、この和訳に関するご意見・ご質問は(juk at PostgreSQL.jp)までお寄せください。
  （※ メールアドレスの " at " は適切に直してください。半角の "@" です。）
]

