PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ) 原文最終更新日: Tue Jul 10 21:01:47 EDT 2001 現在の維持管理者: Bruce Momjian (pgman@candle.pha.pa.us) この文書の最新版は http://www.PostgreSQL.org/ で見ることができます。 プラットホームに特有の質問については :http://www.PostgreSQL.org/users-lounge/docs/faq.html に回答があります。 (以下、訳者による注釈を [訳注: と ] とで囲んで記します。) [訳注: 日本語版製作についてのメモは最後尾へ移動しました。 日本語版のこの文書は "User's Lounge" の "Collection of FAQs" の "Japanese" という見出しのところにあります。 (http://www.PostgreSQL.org/docs/faq-japanese.html) この和訳についてお気づきの点は(juk@jp.postgresql.org)までメールでお寄せ下さい。 ] ------------------------------------------------------------------------ 一般的な質問 1.1) PostgreSQLとは何ですか? 1.2) PostgreSQLの著作権はどうなってますか? 1.3) PostgreSQLの動作するUnixプラットホームは? 1.4) Unix以外の移植版で使えるものは? 1.5) PostgreSQLはどこから入手できますか? 1.6) サポートはどこで受けられますか? 1.7) 最新版はどれですか 1.8) どのような文書がありますか? 1.9) 既知のバグや未だ無い機能はどうやって見つけますか? 1.10) SQLはどうすれば学べますか? 1.11) PostgreSQLは西暦2000年問題(Y2K)に対応していますか? 1.12) 開発チームにはどのように参加しますか? 1.13) バグレポートはどのように発信しますか? 1.14) 他のDBMSのと比べてPostgreSQLはどうなのですか? ユーザー・クライアントの質問 2.1) PostgreSQL の ODBC ドライバーはありますか? 2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか? 2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか? レポー トジェネレータは? 埋め込み問い合わせ言語インターフェースは? 2.4) PostgreSQL と通信するにはどんな言語が使えますか? 管理上の質問 3.1) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか? 3.2) postmaster を走らせると、 Bad System Call とかコア・ダンプしたとのメッ セージが出ます。なぜですか? 3.3) postmaster を走らせようとすると、 IpcMemoryCreate エラーが出ます。なぜ ですか? 3.4) postmasterを走らせようとすると、 IpcSemaphoreCreate エラーが出ます。な ぜですか? 3.5) 他のホストから自分のPostgreSQLデータベースへのアクセスを防ぐにはどうし ますか? 3.6) なぜ、他のマシンから自分のデータベースに接続できないのでしょうか? 3.7) より良い性能を得るためには、データベース・エンジンをどのように調整すれ ば良いですか? 3.8) どのようなデバグ機能が使えますか? 3.9) 接続しようとするときに 'Sorry, too many clients' が出ます。なぜですか? 3.10) 自分のデータベース・ディレクトリにある pg_sorttemp.XXX ファイルは何で すか? 操作上の質問 4.1) なぜ、システムはカンマや小数点や日付フォーマットで混乱するのですか? 4.2) バイナリ・カーソルと通常カーソルとの厳密な違いは何ですか? 4.3) 最初の数行のみを select するにはどうしますか? 4.4) テーブルやその他の情報のリストを psql で見るにはどうしますか? 4.5) テーブルから列の削除はどのようにしますか? 4.6) 行、テーブル、データベースの最大サイズは? 4.7) 一般的なテキストファイルからデータを保存するには、 データベースのディス ク容量はどのくらい必要ですか? 4.8) データベース内に定義されたテーブルやインデックスをどのようにして見つけ 出しますか? 4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜで すか? 4.10) 問い合わせオブティマイザがどのように問い合わせを評価するかを見るにはど うしますか? 4.11) R-tree インデックスとは何ですか? 4.12) 遺伝的問い合わせ最適化とは何ですか? 4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように 実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのよう に使いますか? 4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうします か? 4.15) 色々な文字型のそれぞれの違いは何ですか? 4.16.1) 通番(serial)/自動増分フィールドはどのようにつくりますか? 4.16.2) SERIALデータ型に挿入される値は、どうすれば得られますか? 4.16.3) 他のユーザとの競合状態を避けるためには、currval() と nextval() は使 わないほうがよいのでしょうか? 4.17) OID とは何ですか? TID とは何ですか? 4.18) PostgreSQL で使われるいくつかの用語の意味は何ですか? 4.19) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るの はなぜですか? 4.20) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうします か? 4.21) ラージオブジェクトの操作で、invalid large obj descriptorと出ます。なぜ ですか? 4.22) 現在の時刻がデフォルトとなるような列はどのようにつくりますか? 4.23) なぜ、INを使う副問い合わせがとても遅いのですか? 4.24) 外部結合(outer join)はどのように実現しますか? PostgreSQLの拡張についての質問 5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしま うのはなぜですか? 5.2) PostgreSQL 用に書いたちょっと素敵な新しい型や関数を提供してプロジェクト に貢献したいのですが? 5.3) タプルを返す C言語の関数はどのように書きますか? 5.4) ソース・ファイルを変更しました。再コンパイルしても変化が見られないのは なぜですか? ------------------------------------------------------------------------ 一般的な質問 1.1) PostgreSQL とは何ですか? PostgreSQL は次世代 DBMS 研究用のプロトタイプであった POSTGRES データベース 管理システムの改良版です。PostgreSQL は POSTGRES の強力なデータ・モデルと豊 富なデータ・タイプ(型)を保持しながら、POSTGRES で使われた PostQuel 問い合わ せ言語を、拡張した SQL のサブセットに置き換えています。PostgreSQL は無料で完 全なソースを利用できます。 PostgreSQL の開発は、PostgreSQL 開発メーリングリストに参加しているインターネ ット上の開発者チームですべて行なわれています。現在の座長は Marc G. Fournier ( scrappy@PostgreSQL.org )です。(以下に参加の仕方があります。)現在、このチー ムが PostgreSQL 開発のすべての面倒をみています。 Postgres95-1.01 の中心的な開発者は Andrew Yu と Jolly Chen でしたが、その他 大勢の人々がこのコードの移植、テスト、デバグ、および、改良に参加しました。 PostgreSQL の派生元コードである POSTGRES はカリフォルニア大学バークレイ校に おいて、 Michael Stonebraker 教授の指揮のもと、多くの学生、卒業生、本職のプ ログラマたちの努力により作られました。 バークレイにおけるこのソフトウェアのもとの名前は Postgres でしたが、SQL の機 能が追加された 1995 年にその名前は Postgres95 に変更され、1996 年の終りにそ の名前は PostgreSQL に変更されました。 Post-Gres-Q-L.(ポスト - グレス - キュ ー - エル) と発音します。 1.2) PostgreSQL の著作権はどうなってますか? PostgreSQL は下記の著作権に従います。 [訳注: 正文は英語です。参考として、訳文を併記掲載します。 ] PostgreSQL Data Base Management System Portions Copyright (c) 1996-2000, PostgreSQL Global Development Group Portions Copyright (c) 1994-6 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-2001, PostgreSQL国際開発チーム 部分的著作権 (c) 1994-6 カリフォルニア大学本校 本ソフトウェアおよびその文書一式は上記の著作権表示と、この文章 およびこれに続く二つの段落が全ての複製に添付されている限りにおい て、使用、複製、修正および配付の許可を、いかなる目的であっも、無 償でかつ同意書無しに行なえることをここに認めます。 カリフォルニア大学は、いかなる当事者にたいしても、利益の壊失を 含む、直接的、間接的、特別、偶然あるいは必然的にかかわらず生じた 損害について、たとえカリフォルニア大学がこれらの損害について訴追 を受けていたとしても、一切の責任を負いません。 カリフォルニア大学は、商用目的における暗黙の保証と、特定目的で の適合性に関してはもとより、これらに限らず、いかなる保証も放棄す ることを明言します。以下に用意されたソフトウェアは「そのまま」を 基本原理とし、カリフォルニア大学はそれを維持、支援、更新、改良あ るいは修正する義務を負いません。 [訳注: 著作権に関する正文は上記の英語による表記です。日本語訳はあくまで 参考です。 ] 1.3) PostgreSQL の動作環境は? 著者らは PostgreSQL のコンパイルとテストを次のプラットホーム上で行ないまし た。(これらのうちのいくつかはコンパイルに gcc が必要です): 一般的に、最近のUnix互換プラットホームならばPostgreSQLをはしらせられるはずで す。リリースの時点で実際にテストを行なったことの報告がなされたプラットホーム についてはインストール手引書に列挙してあります。 1.4) Unix以外の移植版で使えるものは? クライアント MS Windows プラットホーム上で、libpq C ライブラリ、psql、それとその他のイン ターフェースは コンパイル可能で、バイナリーが走ります。この場合、クライアン トを MS Windows 上で走らせて、TCP/IP 経由でサポートされている Unix プラット ホーム上で走るサーバと通信します。 Win32 libpq ライブラリと psql を作るために、win31.mak が配布に含まれてます。 PostgreSQLは ODBC クライアントとも通信できます。 サーバ 現在、Cygnus Unix/NT 移植ライブラリの Cygwin を使って、PostgreSQL データベー スサーバは Windows NT と Win2k 上で稼働しています。配布に含まれる pgsql/doc/FAQ_MSWINあるいはウェブサイトにある MS Windows FAQ をご覧下さい。 Microsoft の素のプラットホームに移植する計画はありません。 1.5) PostgreSQL はどこから入手できますか? PostgreSQL の元の anonymous ftp サイトです: * ftp://ftp.PostgreSQL.org/pub/ ミラーサイトについては、我々のメイン Web ページをご覧下さい。 [訳注: 以下は日本のミラーサイトです: Japan: ftp://mirror.nucba.ac.jp/mirror/postgresql/pub/ Japan: ftp://ring.ip-kyoto.ad.jp/pub/misc/db/postgresql/ Japan: ftp://ring.crl.go.jp/pub/misc/db/postgresql/ Japan: ftp://ring.saitama-u.ac.jp/pub/misc/db/postgresql/ Japan: ftp://ring.astem.or.jp/pub/misc/db/postgresql/ Japan: ftp://ring.exp.fujixerox.co.jp/pub/misc/db/postgresql/ Japan: ftp://ring.jah.ne.jp/pub/misc/db/postgresql/ Japan: ftp://ring.etl.go.jp.jp/pub/misc/db/postgresql/ Japan: ftp://ring.asahi-net.or.jp/pub/misc/db/postgresql/ Japan: ftp://ring.so-net.ne.jp/pub/misc/db/postgresql/ Japan: ftp://ring.aist.go.jp/pub/misc/db/postgresql/ ] 1.6) サポートはどこで受けられますか? 主要なメーリング・リストは: pgsql-general@PostgreSQL.orgです。PostgreSQL に 関することであれば議論ができます。このリストへの参加のは、電子メールの本文 (Subject 行ではありません)に次の2行を書いて、 subscribe end pgsql-general-request@PostgreSQL.org へ送って下さい。 ダイジェスト版のメーリング・リストもあります。このリストへの参加は "本文" に: subscribe end と書いて pgsql-general-digest-request@PostgreSQL.org へ電子メールを送って下 さい。 ダイジェスト版は、メインリストで受信するメッセージが 30k 程度溜る毎にダイジ ェスト版リストのメンバーに送付されます。 バグレポート用のメーリングリストもあります。このリストへの参加は "本文"とい っしょに: bugs-request@PostgreSQL.org へ電子メールを送って下さい。 開発者の議論のためのメーリングリストも利用できます。このリストへの参加は電子 メールの本文に: subscribe end と書いて、pgsql-hackers-request@PostgreSQL.orgへ電子メールを送って下さい。 PostgreSQL についてもっと詳しく知りたければ、次の postgreSQL WWWホームページ からたどれます: http://www.PostgreSQL.org EFNet に #PostgreSQL という IRC チャンネルもあります。 unix コマンドでirc -c '#PostgreSQL' "$USER" irc.phoenix.net を使います。 [訳注: 1999年7月23日、日本PostgreSQLユーザー会(にほん ぽすとぐれす ゆーざー かい)、略称JPUGが設立されました。 JPUG は非営利組織で、PostgreSQLを利用する人達の相互協力の場です。 正会員の会費は無料ですが、会員の積極的な貢献が会の運営を助けています。詳しくは、JPUGのWeb サイト: http://www.jp.postgresql.org/ をご覧ください。会員登録も可能となっています。 1990年代中ごろより、ポストグレスの日本語メーリング・リストを石井 達夫さんが主催しています。詳細は、 http://www.sra.co.jp/people/t-ishii/PostgreSQL/ML/info.html をご覧下さい。アーカイブを、いわきりさんのpgsql-jp ML検索システム http://datula.mio.org/~iwakiri/pgsql_jp/ で検索することもできます。 ] 商用サポート会社のリストは http://www.postgresql.org/users-lounge/commercial-support.htmlにあります。 [訳注: 日本では、SRA Inc. オープンシステム事業部 にて商用サポートが行なわれています。 ミラクル・リナックス株式会社 で "Miracle Linux for PostgreSQL" の販売とサポートが 開始されました。 ] 1.7) 最新版はどれですか PostgreSQL の最新版はバージョン 7.1.2 です。 我々は、4カ月毎にメジャーリリースを行なうことを計画しています。 1.8) どのような文書がありますか? 配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ) およびいくつかの小さなテスト例題が含まれます。/doc ディレクトリをご覧下さ い。また、マニュアルは、 http://www.PostgreSQL.org/users-lounge/docs/ でオン ラインでも閲覧できます。 PostgreSQL の本もあります。 http://www.PostgreSQL.org/docs/awbook.html [訳注: 日本ポストグレスユーザー会のPostgreSQL Book翻訳分科会で、 翻訳作業が進行中。 ] psql も、型、演算子、関数、集約、その他の情報をお見せする、いくつかの素晴ら しい \d コマンドを持ちます。 我々の Web サイトには、もっと沢山の文書があります。 1.9) 既知のバグや未だ無い機能はどうやって見つけますか? PostgreSQLは拡張されたSQL-92のサブセットをサポートします。 我々のページの TODO リストに、既知のバグや欠落機能や将来計画についての記述があります。 1.10) SQL はどうすれば学べますか? http://www.PostgreSQL.org/docs/awbook.html にあるPostgreSQL本で SQL を教えて います。 素晴らしい学習書には、 http://w3.one.net/~jhoffman/sqltut.htm と http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM. とがあります。その他に、 "Teach Yourself SQL in 21 Days, Second Edition" が、 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.SRA.co.jp/people/t-ishii/PostgreSQL/doc-jp/index.html があります。 近藤直文氏の「初心者向のDB設計入門・SQL入門参考書紹介」のコーナー http://www.shonan.ne.jp/~nkon/ipsql/books_SQL.html があります。 堀田倫英氏の「PostgreSQL日本語マニュアル」 http://www.net-newbie.com/ ではオンラインマニュアルの検索ができます。 丸山不二夫氏のUNIX データベース入門 http://www.wakhok.ac.jp/DB/DB.html はオンラインで読むことができます。 ] 1.11) PostgreSQLは西暦2000年問題(Y2K)に対応していますか? 対応してます。西暦2000年より後の日付も、紀元前2000年より前の日付も、簡単に扱 えます。 1.12) 開発チームにはどのように参加しますか? まず最初(1番目)に、最新のソースをダウンロードし、我々の Web サイトか配布に 含まれている PostgreSQL Developersの文書を読みます。 2番目に、pgsql-hackers と pgsql-patches メーリング・リストを購読(subscribe)します。 3番目に、高品 質のパッチをpgsql-patchesに発信します。 およそ十人ちょっとの人達が、 PostgreSQL CVSアーカイブにコミットする権限を持っています。 そのそれぞれの人 達が沢山の高品質なパッチを発信するので、現在コミッターとなっている人達はそれ に追い付くのが大変ですが、我々は彼らがコミットしたパッチは高品質であると確信 しています。 1.13) バグレポートはどのように発信しますか? "bug-template" ファイルの項目を満たして、pgsql-bugs@PostgreSQL.orgに送って下 さい。 その前に http://postgreSQL.orgにある最新の FAQ をチェックして下さい。 それと同時に ftp サイト ftp://ftp.postgreSQL.org/pub/で、もっと新しいバージ ョンの PostgreSQL あるいはパッチをさがしてみて下さい。 1.14) 他のDBMSのと比べてPostgreSQLはどうなのですか? ソフトウェアを計る方法にはいくつかあります。機能と性能と信頼性とサポートと価 格です。 機能(Features) PostgreSQLは、トランザクション、副問い合わせやトリガーやビューや外部キ ー 参照や、そして、洗練されたロック機構など、大規模商用DBMSが持つ機能を ほ とんど持っています。PostgreSQLは、さらに、ユーザ定義型や継承やマルチ - バージョン・コンテンションなど、商用DBMSが持ち合わせない機能をいくつ か 持ち合わせています。外部キーの参照整合性(foreign key referential integrity)やロック・コンテンションを減らすための外部競合状態制御 (outer concurrency control)は持ち合わせません。 性能(Performance) PostgreSQLは二つのモードで走ります。普通のfsyncモードは、OSがク ラッシ ュしたり、数秒後に電源が落ちたりしたときのために、トランザクショ ンが完 了する毎にディスクに書き込み、すべてのデータをディスクに保存しま す。こ のモードでは、ほとんどの商用データベースよりも遅くなりますが、そ の部分 的な理由として、商用のデータベースの中にはこのように保守的なディ スク書 き込みをデフォルトとしているものが少ないということもあります。 no-fsync モードで、普通、PostgreSQLは商用データベースよりも速く なりますが、しか しながら、OSのクラッシュでデータが破壊されるかもしれま せん。我々は、そ の中間モードを開発中で、それがうまくゆくと、完全fsync モードほど性能を 犠牲にすることなく、OSがクラッシュする30秒前までのデー タ整合性を保てる ようになります。 MySQLなどの特化型データベース・システムにくらべて、PostgreSQLの挿入/ 更新が遅いのは、トランザクションによるオーバーヘッドがあるからです。も ちろん、MySQLには上記のFeaturesの節に示すような機能はまったくあ りませ ん。我々は、PostgreSQLに柔軟性と機能性を組み込みながらも、絶えず、 プロ ファイラーに掛けたりソースコードを解析したりして、性能の改善を続け てい ます。PostgreSQL と MySQL とを比較している面白い Web ページが http://openacs.org/why-not-mysql.html にあります。 PostgreSQLは、Unixプロセスを起動することによりユーザー接続を操作しま す。 複数のバックエンド・プロセスが情報をロックしながらデータ・バッファ ーを 共有します。マルチCPUでは、簡単に複数のバックエンドをそれぞれのCPU で走 らせることができます。 信頼性(Reliability) 我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解してます。十 分テストして、安定したコードをバグを最小にしてからリリースするように勤 めてます。それぞれのリリースは少なくとも1カ月以上のベータ・テストを行 ない、これまでのリリースの履歴が、製品版として安定した堅固なリリースで あることを物語っています。この分野では、他のデータベースと比べても遜色 がないことに自信を持っています。 サポート(Support) 我々のメーリングリストは、遭遇するいかなる問題についても解決への手 助け をしてくれる、開発者やユーザの大きな集まりを提供しています。我々は 問題 の解決を保証することはできませんが、商用データベースであっても常に 解決 されるわけではありません。開発者や、ユーザ・コミュニティ、マニュア ル 類、それに、ソースコードなどへ直接アクセスできることよって、 PostgreSQL のサポートは、他のDBMSサポートよりも優れたものとなっています。 御要望に 答えて、事柄毎の商用サポートなどもあります(サポートFAQ項目をご覧 下さ い)。 価格(Price) PostgreSQLの利用は、商用でも非商用でも、すべて無料です。上記に示してあ るBSDスタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで 商品に組み込むことができます。 ------------------------------------------------------------------------ ユーザー・クライアントの質問 2.1) PostgreSQL のための ODBC ドライバーはありますか? PsqlODBC と OpenLink ODBC の二つの ODBC ドライバーが利用可能です。 PsqlODBC は PostgreSQL の配布に含まれています。それについてのさらに詳細な情 報は ftp://ftp.PostgreSQL.org/pub/odbc/ から取得できます。 [訳注: PsqlODBC の 日本語パッチを片岡裕生さん(kataoka@interwiz.koganei.tokyo.jp)が作られました: ●http://www.interwiz.koganei.tokyo.jp/software/PsqlODBC/index.html ] OpenLink ODBC は http://www.openlinksw.com/から入手できます。標準的な ODBC クライアント・ソフトウェアで使えますので、支援しているすべてのプラットホーム (Win, Mac, Unix, VMS)から PostgreSQL の ODBC が利用できます。 たぶん彼らは、商用品質のサポートの必要な人々に売っていると思いますが、フリー ウェア版はいつでも入手可能のようです。質問は、postgres95@openlink.co.ukにお 願いします。 Programmer's Guide の ODBC の章もご覧ください。 2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか? データベースを裏に持つ Web ページについての素晴らしい紹介が、 http://www.webtools.com にあります。 http://www.phone.net/home/mwm/hotlist/にも、もう一つあります。 Web への拡張のためには、PHP が卓越したインターフェースとなっています。 http://www.php.net/にあります。 [訳注: PHPに関する日本語の情報は、2000年4月19日に発足した日本PHPユーザ会のサイト http://www.php.gr.jp/ あるいは、廣川 類さんのサイト http://www.cityfujisawa.ne.jp/~louis/apps/phpfi/index.html にかなりまとめられています。 前田 充宏さんにより作られたPHP/FIの日本語パッチが様々な人の手を経てPHP3.0.7に適用されました。 現在はPHPJ-DEVにて、 http://php.jpnnet.com/ 佐藤さんを中心にマルチバイト拡張として作り直され、最新版はPHP-3.0.18に対応しています。 塚田 卓也さんは、PHP4 用の日本語関係の拡張モジュール ftp://night.fminn.nagano.nagano.jp/php4/ を用意して下さってます。 本家の方で国際化のMLも立ち上がっています。 ] 処理が複雑な場合、多くの人は Perl インターフェースと CGI.pm を使います。 [訳注: WDB は、Web から DataBase への Perl の Interface です。 wdb-p95 へのリンクは切れてしまっています。おそらく、Perl DBI 経由で DBD::Pg の利用が可能と思われます。 現在、WDBI という名前になっているもの http://www.egroups.com/list/wdb-users/ と、WDBの名前のままのもの http://www.i-con.dk/wdb/ とがあります。その経緯はよくわかりません。 ] 2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか? レポー ト・ジェネレータは? 埋め込み問い合わせ言語へのインターフェースは? pgaccess と呼ばれる素晴らしいグラフィカル・ユーザ・インターフェースがあり、 この配布と共に出荷されます。Pgaccess にはレポート・ジェネレータもあります。 Web ページはhttp://www.flex.ro/pgaccessです。 ecpg という C 言語のための埋め込み SQL 問い合わせ言語インターフェースもあり ます。 2.4) PostgreSQL と通信するにはどんな言語が使えますか? 以下のものがあります: * C (libpq) * C++ (libpq++) * 埋め込みC (ecpg) * Java (jdbc) * Perl (perl5) * ODBC (odbc) * Python (PyGreSQL) * TCL (libpgtcl) * C Easy API (libpgeasy) * 埋め込みHTML (PHP from http://www.php.net) [訳注: rubyの作者であるまつもと ゆきひろ(matz@ZetaBITS.COM)さんと、まつもと えいじ(ematsu@pfu.co.jp)さんが ruby の PostgreSQL インターフェースを作りました。現在の維持管理は斉藤 登さんがしています。 http://webclub.kcom.ne.jp/mb/noborus/ruby/ PgBash は 境田 雅明 さんが作った bash の PostgreSQL インターフェースです。 http://www.psn.co.jp/PostgreSQL/pgbash/ Bashコマンドラインでpostgres に問い合わせできます。 Perl のモジュールは古くからある Pg と DBI ドライバの DBD::Pg とがあり、 いずれも Edmund Mergl 氏によるもので CPAN サイトにあります。 ] ------------------------------------------------------------------------ 管理上の質問 3.1) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか? 簡単な方法は、 configure を走らせるときに --prefix オプションを指定すること です。 3.2) postmaster を走らせると、Bad System Call とかコア・ダンプしたとのメッセ ージが出ます。なぜですか? さまざまな問題が考えられますが、まず最初にあなたのカーネルに System V IPC の 拡張がインストールされているかを確認して見てください。PostgreSQL はカーネル による共有メモリーとセマフォのサポートを必要とします。 3.3) postmaster を走らせようとすると、IpcMemoryCreate エラーが出ます。なぜで すか? カーネルが共有メモリーを持つ設定になっていなかったか、でなければ、カーネルに 対して使える共有メモリーの大きさを大きく設定する必要があります。具体的な大き さは、使っているアーキテクチャとpostmaster を走らせるときに設定するバッファ の数とバックエンドプロセスに依存します。ほとんどのシステムでは、既定値のバッ ファサイズのままで、少なくとも約1MBが必要です。 PostgreSQL Administrator's Gide に共有メモリーとセマフォについての情報の詳細があります。 3.4) postmasterを走らせようとすると、IpcSemaphoreCreate エラーが出ます。なぜ ですか? もしエラーメッセージがIpcSemaphoreCreate: semget failed (No space left on device)であれば、カーネルが十分なセマフォを使えるように構成されていません。 Postgresは潜在的なバックエンドプロセス毎に一つのセマフォを必要とします。とり あえずの解決策はpostmasterを起動するときに、バックエンドプロセスの数をより少 なく制限をすることです。既定値の32より小さな数のパラメータを-Nで使います。よ り恒久的な解決策は、カーネルのSEMMNS と SEMMNI パラメータを増やすことです。 もし、エラーメッセージがなにか他のものであれば、カーネルの構成でまったくセマ フォのサポートをしていないかもしれません。 PostgreSQL Administrator's Gide に共有メモリーとセマフォについての情報の詳細があります。 3.5) 他のホストから自分の PostgreSQL データベースへのアクセスを防ぐにはどう しますか? 既定値では、PostgreSQL は unix ドメインソケットを使うローカルマシンからの接 続しか許しません。postmaster 起動に -i フラッグを加え、$PGDATA/pg_hba.conf ファイルを適切に直して、ホスト主導型の認証を使わないかぎりは他のマシンからは 接続できないでしょう。これによりTCP/IPの接続が可能になります。 操作不能なセマフォも過度のデータベースアクセス中にクラッシュを引き起こすこと があります。 3.6) 他のマシンから自分のデータベースに接続できないのはなぜですか? 既定の設定ではローカルマシンからの unix ドメインのソケット接続しか許しませ ん。TCP/IP 接続を可能にするには postmaster が -i オプションで開始されてい て、pgsql/data/pg_hba.conf ファイルに適切なホストの記載が追加されていること を確認してください。 3.7) より良い性能を得るためには、データベース・エンジンをどのように調整すれ ば良いですか? 確かにインデックスは問い合わせの速度を増します。EXPLAINコマンドで PostgreSQL がどのようにあなたの問い合わせを翻訳しているかを見ることができ、そして、どの インデックスが使われているかを見ることができます。 もし INSERT を多用している場合は、COPY コマンドを使って大きなバッチ処理でそ れを行なうことを検討して下さい。これは、INSERT を別々に行なうよりもっと高速 です。次に、BEGIN WORK/COMMIT のトランザクション・ブロックの中に無い文は、そ れら自身がそれぞれのトランザクションに入っていると見なされます。いくつかの文 を一つのトランザクション・ブロックの中で行なうことを考えて下さい。これにより トランザクションのオーバーヘッドが減ります。また、大きなデータの変更を行なう 際はインデックスを一度外して、作り直すことを考えてみて下さい。 チューニングのオプションがいくつかあります。postmaster を -o -F オプションで 起動することによって、fsync() を無効にすることができます。これによって、各ト ランザクション毎に fsync() でディスクを更新するのを止めさせます。 postmaster -B オプションを使ってバックエンド・プロセスにより使われる共有メモ リー・バッファを大きくすることもできます。もし、このパラメータを高くしすぎる と、カーネルの共有メモリー空間の制限値を越えてしまっうために postmaster が走 らなくなるでしょう。既定値では、それぞれのバッファの大きさは 8K で、バッファ 数は 64 です。 バックエンドを -S オプションを使って、それぞれのバックエンド・プロセスが一時 的な並べ替えによって使うメモリーの最大サイズを増やすこともできます。 その -S の値はキロバイト単位で、既定値は 512 (すなわち、512K)です。 また、CLUSTER コマンドを使って、テーブルのデータをインデックスに合わせるため にグループ化することもできます。詳しくは、オンラインマニュアルで CLUSTER を 見て下さい。 3.8) どのようなデバグ機能が使えますか? PostgreSQL は、デバグのために意味のある、状態情報を報告するいくつかの機能を 持ちます。 まず、--enable-cassert オプションで configure を走らせます。そうしてコンパイ ルすることにより、沢山の assert() が、バックエンドの進捗状況を監視し、何か予 期せぬことが起きるとプログラムを停止するようになります。 postmaster と postgres の両方でいくつかのデバグ・オプションの利用ができま す。まず、次のように postmaster を起動するときはいつでも、標準出力とエラー出 力をログ・ファイルに送るようにしてあることを確かめて下さい。 cd /usr/local/pgsql ./bin/postmaster >server.log 2>&1 & これにより PostgreSQL の最上部のディレクトリに server.log ファイルが置かれま す。このファイルはサーバーが遭遇した問題やエラーについて有用な情報を含みま す。Postmaster は更に詳細な情報を報告するための -d オプションを持ちます。そ の -d オプションは、デバグ・レベルを指定します。高いデバグ・レベルでは、大き なログファイルを生成することに注意しなくてはなりません。 もし、postmasterが走っていなければ、postgresバックエンドをコマンド行から走ら せることができ、直接SQL文をタイプすることができます。このやりかたは、デバグ 目的のときだけお奨めします。セミコロンではなく、改行が問い合わせの終りになる ことに注意してください。もし、デバグシンボルを入れてコンパイルしていれば、デ バッガを使って何が起きているかを見ることができます。postmaster からバックエ ンドを開始したわけではないので、独立な環境で走っているのではなくロック/バッ クエンドとの対話の問題が重複することはありません。 もし、postmasterが走っていれば、あるウィンドウでpsqlを開始すると、psql で使 われる postgresプロセスのPIDが見つかります。デバッガを使ってpostgresのPIDに アタッチ(attach)します。デバッガの中からブレーク・ポイントをセットし、psqlか ら問い合わせを発行します。デバグのためにpostgresを始動する場合は、 PGOPTIONS="-W n" を設定でき、それから、psql を開始します。これにより、n 秒開 始を遅らせるはずなので、デバッガでアタッチして始動を順を追って見ることができ ます。 postgreSQL プログラムには、デバグと性能測定にとても役に立つ -sや -Aや -t 等 のオプションがあります。 何という関数がどのくらい実行時間を食っているかを見るために、プロファイリング (プロフィール付き)でコンパイルすることも可能です。そのバックエンドのプロフ ィール・ファイルは pgsql/data/base/dbname ディレクトリに格納されるでしょう。 クライアントのプロフィールはクライアントの現行ディレクトリに置かれるでしょ う。 3.9) 接続しようとするときに 'Sorry, too many clients' が出ます。なぜですか? postmasterが同時始動できるバックエンドプロセスに対する制限数を増やす必要があ ります。 PostgreSQL 6.5以降では、既定の最大プロセスは32プロセスです。適切な-Nの値で postmasterを再起動することにより増加させることができます。既定の構成では-Nは 最大1024まで設定できます。もし、もっと必要であればinclude/config.hの中の MAXBACKENDSを増加させ、再構築します。もし、望むならconfigureの --with-maxbackends切替を使って、-Nの既定値を構成時に設定できます。 もし、-N を 32よりも大きくするのであれば、-Bも既定の64より大きい値に増加させ なくてはならないし、-B は少なくとも -N の2倍はなくてはならず、おそらく最高性 能を望むならばそれより大きい値が必要なはずです。バックエンドプロセスをたくさ んにすると、いろいろなUnixカーネル構成パラメータも増やすことが必要になるかも しれません。 共有メモリー・ブロックの最大値(SHMMAX)、 セマフォの最大数 (SEMMNSとSEMMNI)、 プロセスの最大数(NPROC)、 ユーザ毎の最大プロセス数 (MAXUPRC)、 開くファイルの最大数(NFILEとNINODE も確認事項に含まれます。 PostgreSQLに許されるバックエンドのプロセス数が制限されているのは、 システム のリソースを使い果してしまうことを避けるためです。 6.5より前のバージョンのPostgreSQLではバックエンドの最大数は64でしたが、変更 するには、include/storage/sinvaladt.hの中のMaxBackendId定数を修正した後に再 構築が必要でした。 3.10) 自分のデータベース・ディレクトリにある pg_sorttemp.XXXファイルは何です か? 問い合わせ実行モジュールによって生成された一時的なファイルです。例えば、もし ORDER BY 句を満たすためにバックエンドの -S パラメータで許可した値よりも大き なスペースがソートの際に必要だとすると、溢れたデータを保持するために一時的な ファイルがいくつか生成されます。 一時的なファイルは自動的に消し去られるはずですが、もし、ソートの途中でバック エンドがクラッシュしてしまうとそうはなりません。そのときバックエンドがひとつ も走ってなければ、pg_tempNNN.NNファイルを消しても大丈夫です。 [訳注: SYSLOGD 経由でログを出力するには、まず、configure を --enable-syslog 付きで走らせた後、コンパイルとインストールを行ないます。 次に、syslog.conf に local0.* の 出力先を指定し(環境変数で変更可能)、 syslogd に HUP シグナルを送って初期化しておきます。そして、 $PGDATA/pg_options に syslog=2 を加えて、 postmaster を -S オプション付きにてサーバモードで起動します。(バージョン 7.1 からは pg_options は postgresql.conf になっています。) ] ------------------------------------------------------------------------ 操作上の質問 4.1) なぜ、システムはカンマや小数点や日付フォーマットで混乱するのですか? ロケールの設定を確かめて下さい。PostgreSQL は postmaster プロセスを走らせた ユーザーのロケールの設定を使います。postgres とpsql には SET コマンドがあ り、データ書式を制御できます。これらをあなたの操作環境に合わせて設定して下さ い。 4.2) バイナリ・カーソルと通常カーソルとの厳密な違いは何ですか? 詳述は、オンラインマニュアルで DECLARE を見て下さい。 4.3) 最初の数行のみを SELECT するにはどうしますか? オンラインマニュアルでFETCHを見てください。あるいは、SELECT ... LIMIT....を 使ってみて下さい。 たとえ、欲しいのは最初の数行だけでも、すべての問い合わせを評価しなくてはなら ないかもしれません。ORDER BY を持った問い合わせを考えてみて下さい。 もし、 ORDER BYに合ったインデックスがあるとすると PostgreSQLは要求された最初の数行 だけで評価できるかもしれませんが、でなれば、PostgreSQL は意図した行が生成さ れるまですべての行を評価しなければならないかもしれません。 4.4) テーブルやその他の情報のリストを psql で見るにはどうしますか? psqlのソースコードとして書かれた pgsql/src/bin/psql/describe.c ファイルを読 むことがその答えです。 そこには、psqlのバックスラッシュコマンドによる出力の ためのSQLコマンドが含まれています。 psql に -E オプションをつけて起動すれ ば、与えたコマンドを実行するための問い合わせが出力されます。 4.5) テーブルから列の削除はどのようにしますか? ALTER TABLE DROP COLUMN はサポートしていませんが、その代わりにこうします: SELECT ... -- 削除したい列以外の列をすべて選択します。 INTO TABLE new_table FROM old_table; DROP TABLE old_table; ALTER TABLE new_table RENAME TO old_table; [訳注:列の追加は ALTER TABLE ADD COLUMN で行えます。] 4.6) 行、テーブル、データベースの最大サイズは? 制限は以下のとおりです。 データベースの最大サイズ? 制限無し (60GB のデータベースも存在します) テーブルの最大サイズ? 16TB 行の最大サイズ? 7.1以降で制限無し フィールドの最大サイズ? 7.1以降で1GB テーブル内での最大ロウ数? 制限無し テーブル内での最大カラム数? カラムの型により250-1600 テーブル内での最大インデクス数? 制限無し もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーやスワップスペ ースの大きさにより制限されます。性能はこれらの値がことのほか大きな時に煽りを 受けます。 最大テーブルサイズの16TBはオペレーティングシステムによる巨大ファイルのサポー トは必要としません。巨大なテーブルは複数の1GBのファイルに分けて保存されます ので、ファイルシステムの制限は重要ではありません。 デフォルトのブロックサイズを32kにすると最大テーブルサイズと最大カラム数とが 増加します。 4.7) 一般的なテキストファイルからデータを保存するには、データベースのディス ク容量はどのくらい必要です? PostgreSQL のデータベースに保存するには、普通のファイルの約6.5倍のディスク容 量を必要とします。 各行に二つずつ整数を持つ 300,000行のファイルを考えてみましょう。ただのファイ ルでは 2.4MB です。このデータを含む PostgreSQL データベースファイルの大きさ は次のように約14MBと見積もることができます: 36 bytes: 各行のヘッダ(概算) + 8 bytes: 各4バイトの二つの整数(int)フィールド + 4 bytes: ページ上のタップルへのポインタ ---------------------------------------- 48 bytes per row PostgreSQL のデータページサイズは 8192バイト(8KB)なので: 8192 bytes per page ------------------- = 171 rows per database page (切り上げ) 48 bytes per row 300000 data rows -------------------- = 1755 database pages 171 rows per page 1755 database pages * 8192 bytes per page = 14,376,960 bytes (14MB) インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされ るデータを含む以上、それなりに大きくなります。 4.8) データベース内に定義されたテーブルやインデックスをどのようにして見つけ 出しますか? psql にはいろいろなバックスラッシュ・コマンドがあり、こうした情報を表示しま す。バックスラッシュ・コマンドの種類を見るには \? を使って下さい。 また、pgsql/src/tutorial/syscat.source ファイルを走らせてみて下さい。それ は、沢山の SELECT 文により必要な情報をデータベースのシステム・テーブルから取 り出して例示してくれます。 4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜで すか? PostgreSQL は統計情報を自動的には保守しません。統計情報を更新するためには、 VACUUM を走らせなくてはなりません。統計情報が更新された後は、オブティマイザ がテーブルに何行あるかを知って、インデックスを使うべきかの決定をより良く下し ます。オブティマイザはテーブルが小さくて連続スキャンの方が速いであろう場合は インデックスを使わないことにご注意下さい。 列特定の最適化統計のためにVACUUM ANALYZEを使います。VACUUM ANALYZEは複雑な複 合結合(multi-join)問い合わせのために大切ですので、オブティマイザはそれぞれの テーブルから返される行の数を見積ることができ、特定の結合順序を選びます。バッ クエンドはそれ自身では列の統計を保持しないので、定期的にそれらを集めるために は VACUUM ANALYZE を走らせなくてはなりません。 普通、インデックスは ORDER BY や結合の操作のためには使われません。ランダムな ディスクアクセスはとても遅いので、順次スキャンに続く明示的ソートは、巨大なテ ーブルの全件をインデックススキャンするよりも高速です。 LIKE あるいは ~ のようなワイルドカード演算子(wild-card operators)を使うと き、検索の開始が文字列の始めの部分に固定されているときにのみ、インデックスが 使われます。 そういうわけで、インデックスを使うためには、LIKE 検索では%で始 めないようにして、また、~(正規表現検索)は^ で始めるようにするべきです。 [訳 注:強制的にインデックスを使うには SET enable_seqscan = off を実行します] 4.10) 問い合わせオブティマイザがどのように問い合わせを評価するのかを見るには どうしますか? オンラインマニュアルで EXPLAIN を見て下さい。 4.11) 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関係の文献を紹介して頂きました。 日本語 Postgres ML のアーカイブから "Subject: [postgres95 801] spatial data structures" http://www.sra.co.jp/people/t-ishii/PostgreSQL/mhonarc/pgsql-jp/1996Oct/msg00007.html をご覧下さい。 ] 組込みの R-Tree でポリゴンやボックスを操作できます。理論的にはR-Tree はもっ と高い次元を操作するようにも拡張できます。実質的には、R-Tree の拡張にはちょ っとした作業が必要でして、現在、我々はそれをどのようにするかについての文書を 持っていません。 [訳注: インターウィズの片岡さんが多次元幾何オブジェクトへの拡張作業中です。詳しくは、 http://www.interwiz.koganei.tokyo.jp/software/geometric/index.html をご覧ください。 ] 4.12) 遺伝的問い合わせ最適化とは何ですか? GEQO モジュールは、沢山のテーブルを結合するときに、遺伝的アルゴリズム(GA)で 問合わせを高速化します。これにより、しらみつぶしに探索を行なわなくても、大き な結合(join queries)を扱うことができるようになります。 4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように 実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのよう に使いますか? ~演算子は正規表現照合を行ない、~* は大文字と小文字を区別しない (case-insensitive)正規表現照合を行います。 PostgreSQL 7.1 以降では、大文字と 小文字を区別しない LIKE 演算子を ILIKE といいます。 大文字と小文字を区別しない等値比較次のように表現できる: SELECT * FROM tab WHERE lower(col) = 'abc' 標準インデックスでは使われず、しかしながら、もし関数インデックスを 作ったな らそれが使われるでしょう。 CREATE INDEX tabindex on tab (lower(col)); WHERE lower(textfield) LIKE lower(pattern) 4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうします か? IS NULLのカラムを IS NOT NULL で試してみて下さい。 4.15) 様々な文字型のそれぞれの違いは何ですか? Type Internal Name Notes -------------------------------------------------- "char" char 1 character CHAR(#) bpchar 指定された固定長となるように空白が詰められる VARCHAR(#) varchar 長さの上限の無いテキスト TEXT text 長さの制限は最大行長による BYTEA bytea 可変長のバイト配列 内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージ を受け取るときです。 上記の型のうち後の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バ イトがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は 宣言された大きさよりも少し大きくなります。しかし、これらのデータ型はTOASTに より圧縮されたり複数行に渡って保存されたりして、ディスク上の空間は思ったより 小さくなります。 4.16.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 ); 通番についてのもっと詳しい情報は、オンラインマニュアルで create_sequence を ご覧下さい。 また、各行のOIDフィールドを一意値として使うこともできます。しかしながら、も しもデータベースをダンプしてりロードする必要がある場合は、OIDを温存するため にpg_dump で -oオプションを使うか、または、COPY WITH OIDSオプションを使う必 要があります。 Bruce Momjian の (http://www.PostgreSQL.org/docs/aw_pgsql_book)の Numbering Rowsの章にありあ ます。 4.16.2) SERIALデータ型に挿入される値は、どうすれば得られますか? ひとつの方法は、nextval() 関数を使ってその値を挿入する前(before)に SEQUENCE オブジェクトから次の SERIAL 値を取り出し、それから実際に挿入をすることです。 4.16.1 の例で使ったテーブルを使うとすると、次のようになります。 $newSerialID = nextval('person_id_seq'); INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal'); そうして、$newSerialID に保存した新しい値を他の問い合わせに(たとえば、person テーブルに対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作 られたSEQUENCEオブジェクトの名前は、