PostgreSQL についてよくある質問(FAQ) 原文最終更新日: Fri Oct 29 20:22:37 EDT 1999 現在の維持管理者: Bruce Momjian (pgman@candle.pha.pa.us) この文書の最新版は PostgreSQL の WWW サイトの http://www.PostgreSQL.org で見 ることができます。 Linux に特有の質問についての答えは :http://www.PostgreSQL.org/docs/FAQ-linux.html に、 Irix に特有の質問についての答えは :http://www.PostgreSQL.org/docs/faq-irix.html に、 HPUX に特有の質問についての答えは :http://www.PostgreSQL.org/docs/faq-hpux.html にあります。 [訳注:日本語版については以下の通りです。 (以下、訳者による注意書きを [訳注: と ] で囲んで記します。) 最終更新日: 1999年12月10日 訳者: 桑村 潤 (juk@rccm.co.jp) このFAQの和訳の作成にあたって協力をしてくださった以下の方々、また、 きっかけを作ってくれた JF(Linux Japanese FAQ Mailing List)の方々、 その他コメントを下さった多くの人々に感謝します。 田仲 稔さん(green@keiken.co.jp)、 石井 達夫さん(t-ishii@sra.co.jp)、 齊藤 知人さん(tomos@elelab.nsc.co.jp)、 馬場 肇さん(baba@kusastro.kyoto-u.ac.jp)、 岡本 一幸さん(ikko-@pacific.rim.or.jp) 小菅 昭一さん(s-kosuge@str.hitachi.co.jp) 日本語版のこの文書は http://www.rccm.co.jp/~juk/pgsql/ http://www.sra.co.jp/people/t-ishii/PostgreSQL/ http://www.linux.or.jp/JF/ からもたどれます。 なお、この和訳に関するご意見は桑村(juk@jp.postgresql.org)までお寄せ下さい。 ] ------------------------------------------------------------------------ 一般的な質問 1.1) PostgreSQLとは何ですか? 1.2) PostgreSQLの著作権はどうなってますか? 1.3) PostgreSQLの動作するUnixプラットホームは? 1.4) Unix以外で使えるPostgreSQLの移植版は? 1.5) PostgreSQLはどこから手に入りますか? 1.6) PostgreSQLのサポートはどこで受けられますか? 1.7) PostgreSQLの最新版はどれですか 1.8) PostgreSQLにはどのような文書がありますか? 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) なぜ initdb が失敗するのですか? 3.2) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか? 3.3) postmaster を走らせると、 Bad System Call or core dumped message という メッセージが出ます。どうしてですか? 3.4) postmaster を走らせようとすると、 IpcMemoryCreate エラーが出ます。どう してですか? 3.5) postmasterを走らせようとすると、 IpcSemaphoreCreate エラー・メッセージ を受け取ります。どうしてですか? 3.6) 他のホストから自分のPostgreSQLデータベースへのアクセスはどうすれば防げ ますか? 3.7) なぜ、他のマシンから自分のデータベースに接続できないのでしょうか? 3.8) なぜ、root ユーザでは自分のデータベースにアクセスできないのでしょうか? 3.9) テーブルアクセスの競合で自分のサーバはみんなクラッシュしてしまいます。 どうしてですか? 3.10) より良い性能を得るためには、データベース・エンジンをどのように調整すれ ば良いですか? 3.11) PostgreSQLではどのようなデバッグ機能が使えますか? 3.12) 接続しようとすると'Sorry, too many clients'を受け取ります。どうしてで すか? 3.13) 自分のデータベース・ディレクトリにある pg_sort.XXX ファイルは何です か? 3.14) pg_group の設定はどのようにしますか? 操作上の質問 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) 正規表現での検索や大文字と小文字とを区別しない regexp 検索はどのように しますか? 4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうします か? 4.15) 色々な文字型のそれぞれの違いは何ですか? 4.16) 通番(serial)/自動増分フィールドはどのようにつくりますか? 4.17) oid とは何ですか? tid とは何ですか? 4.18) PostgreSQL で使われる幾つかの用語の意味は何ですか? 4.19) エラーメッセージ "FATAL: palloc failure: memory exhausted?" が出るのは なぜですか? 4.20) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうします か? 4.21) 巨大オブジェクトの操作で、invalid large obj descriptorと出ます。どうし てですか? 4.22) 現在時刻がデフォルトとなるような列はどのようにつくりますか? 4.23) なぜ、INを使う副問い合わせがとても遅いのですか? PostgreSQLの拡張についての質問 5.1) ユーザ定義関数を書きましたが、psql の中で実行したらコア・ダンプしてしま うのはなぜですか? 5.2) 次のようなメッセージが出るのですが、何を意味するのですか? NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! 5.3) PostgreSQL のために書いた、粋な新しい型や関数は、どのようにすれば貢献で きるのですか? 5.4) タップルを返す C の関数はどのように書きますか? 5.5) ソース・ファイルを変更しました。再コンパイルしても変わりが無いのはどう してですか? ------------------------------------------------------------------------ 全般的な質問 1.1) PostgreSQL とは何ですか? PostgreSQL は POSTGRES データベース管理システムの改良版で、次世代DBMS 研究用 のプロトタイプです。PostgreSQL は POSTGRES の強力なデータ・モデルと豊富なデ ータ・タイプ(型)を内包しつつ、POSTGRES で使われた PostQuel 問い合わせ言語 を、拡張したSQL のサブセットに置き換えています。PostgreSQL は無料で完全なソ ースの利用ができます。 PostgreSQL の開発は PostgreSQL 開発者メーリングリストに参加しているインター ネット上の開発者チームにより進められています。現在の座長は Marc G. Fournier ( scrappy@postgreSQL.org )です。(以下に参加の仕方があります。)現在、このチー ムがすべての現状と将来の PostgreSQL の開発の面倒を見ます。 PostgreSQL 1.01 の著者は Andrew Yu と Jolly Chen でした。その他大勢の人々が このコードの移植、テスト、デバグ、および、改良に貢献しました。PostgreSQL の 派生元コードである POSTGRES はカリフォルニア大学バークレー校において、 Michael Stonebraker 教授の指揮のもと、多くの学生、卒業生、職業プログラマたち の努力により作られました。 バークレーにおけるこのソフトウェアのもとの名前は Postgres でした。SQL の機能 が追加された 1995 年にその名前は Postgres95 に変更されました。1996 年の終り にその名前は PostgreSQL に変更されました。 1.2) PostgreSQL の著作権はどうなってますか? PostgreSQL は下記の著作権に従います。 [訳注:訳者は英語に不案内な上、法律については無知なので、以下に原文を残し訳注を付けます。] PostgreSQL Data Base Management System 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) 1994-6 カリフォルニア大学本校 このソフトウェアとその文書を、如何なる目的でも、無料で、使用許諾書無しに、 使用、複写、修正、そして、配布することへの許可を、上記の著作権表示、この段 落、および、これに続く二つの段落が、すべての複写に添付される限りにおいて、 ここにそれを認めます. たとえカリフォルニア大学が以下のような損害の可能性について言及していた としても.このソフトウェア及び文書の使用上,直接的・間接的・特別・偶然 もしくは必然的に,生じた失われた利益を含む損害に於いて,いずれの当事者 に対してもカリフォルニア大学は一切の責任を負いません. カリフォルニア大学は,特定目的のための商用性及び適合性の暗黙の保証を含 む,しかしそれに限定されることのない,いかなる保証も明確に放棄します. ここにおいて用意されたソフトウェアは「あるがまま」ということを前提とし, カリフォルニア大学は維持・補助・更新・改良・修正を用意する義務を負いま せん. ] 1.3) PostgreSQL の動作環境は? 著者らは PostgreSQL のコンパイルとテストを次のプラットホーム上で行ないまし た。(これらのうちの幾つかはコンパイルに gcc が必要です): * aix - IBM on AIX 3.2.5 or 4.x * alpha - DEC Alpha AXP on Digital Unix 2.0, 3.2, 4.0 * BSD44_derived - OSs derived from 4.4-lite BSD (NetBSD, FreeBSD) * bsdi - BSD/OS 2.x, 3.x, 4.x * dgux - DG/UX 5.4R4.11 * hpux - HP PA-RISC on HP-UX 9.*, 10.* * i386_solaris - i386 Solaris * irix5 - SGI MIPS on IRIX 5.3 * linux - Intel i86 Alpha SPARC PPC M68k * sco - SCO 3.2v5 Unixware * sparc_solaris - SUN SPARC on Solaris 2.4, 2.5, 2.5.1 * sunos4 - SUN SPARC on SunOS 4.1.3 * svr4 - Intel x86 on Intel SVR4 and MIPS * ultrix4 - DEC MIPS on Ultrix 4.4 1.4) unix 以外の移植で利用可能なのは何ですか? MS Windows プラットホーム上で、libpq C ライブラリ、psql、それとその他のイン ターフェースは コンパイル可能で、バイナリーが走ります。この場合、クライアン トを MS Windows 上で走らせて、TCP/IP 経由でサポートされている Unix プラット ホーム上で走るサーバと通信します。 Win32 libpq ライブラリと psql を作るために、win31.mak が配布に含まれてます。 現在、Cygnus Unix/NT 移植ライブラリを使って、PostgreSQL データベースサーバは Windows NT 上で動いています。配布に含まれるpgsql/doc/README.NTを御覧下さい。 http://surya.wipro.com/uwin/ported.html.にはU/Winを使う別の移植もあります。 1.5) PostgreSQL はどこから手に入りますか? PostgreSQL の元の anonymous ftp サイトです: * ftp://ftp.postgreSQL.org/pub ミラーサイトについては、我々のメイン・ウェブページをご覧下さい。 [訳注: 以下は日本のミラーサイトです: 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) PostgreSQL のサポートはどこで受けられますか? カリフォルニア大学バークレー校からの PostgreSQL の公式なサポートはありませ ん。サポートはボランティアの努力を通じて維持されています。 主要なメーリング・リストは: pgsql-general@postgreSQL.orgです。PostgreSQL に 関することであれば議論ができます。このリストへの参加のは、電子メールの本文 (Subject 行ではありません)に: subscribe end と書いて、pgsql-general-request@postgreSQL.org へ送って下さい。 ダイジェスト版のメーリング・リストもあります。このリストへの参加は "本文" に: subscribe end と書いて pgsql-general-digest-request@postgreSQL.org へ電子メールを送って下 さい。 ダイジェスト版は、メインリストが受信するメッセージ 30k 程度溜る毎にダイジェ スト版リストのメンバーに送付されます。 バグのメーリングリストも利用できます。このリストへの参加は "本文"といっしょ に: bugs-request@postgreSQL.org へ電子メールを送って下さい。 開発者の議論のためのメーリングリストも利用できます。このリストへの参加は電子 メールの本文に: subscribe end と書いて、hackers-request@postgreSQL.orgへ電子メールを送って下さい。 PostgreSQL についてもっと詳しく知りたければ、次の postgreSQL WWWホームページ からたどれます: http://postgreSQL.org IRC チャンネルも EFNet にあり、そのチャンネルは #PostgreSQL です。 unix コマ ンドでirc -c '#PostgreSQL' "$USER" irc.phoenix.net を使います。 [訳注: 日本語のメーリング・リストを SRA Inc. の石井達夫さんが主催して います。このリストの購読は、本文の1行目に: subscribe と書いて pgsql-jp-request@sra.co.jp 宛に電子メールをお送り下さい。 詳細は、 http://www.sra.co.jp/people/t-ishii/PostgreSQL/info.html を御覧下さい。また、この ML のアーカイブは、 http://www.sra.co.jp/people/t-ishii/PostgreSQL/archive.html で御覧になれます。 また、日本PostgreSQLユーザー会のウェブサイトは、 http://www.jp.postgresql.org にあります。 ] PostgreSQL のための商用サポートは http://www.pgsql.com/ で受けられます。 [訳注: 日本でも、 SRA Inc. オープンシステム事業部 にて サポートが開始されました。 ] 1.7) PostgreSQL の最新版 PostgreSQL の最新版はバージョン 6.5.2 です。 我々は、4カ月毎にメジャーリリースをすることを計画しています。 1.8) PostgreSQL にはどのようなドキュメントがありますか? 配付の中に、幾つかのマニュアルとオンライン・マニュアル(マニュアル・ページ)お よび幾つかの小さなテスト例題が含まれます。/doc ディレクトリを御覧下さい。 psql は、型、演算子、関数、集約、その他の情報を見せる、幾つかの素晴らしい \d コマンドを持ちます。 ウェブサイトには、さらにもっと文書があります。 1.9) 既知のバグや無い機能はどうやって見つけますか? PostgreSQLは拡張されたSQL-92のサブセットをサポートします。 我々のページの TODO に、既知のバグ、欠落機能、および、将来計画のリストがあります。 1.10) 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 et al., Addison Wesley が好評です。 その他に、Lan Times Guide to SQL, Groff et al.,Osborne McGraw-Hill のようなのもあります。 [訳注; http://www.SRA.co.jp/people/t-ishii/PostgreSQL/doc-jp/index.html に石井さんによる日本語の参考文献の紹介があります。 http://www.wakhok.ac.jp/DB/DB.html丸山不二夫氏のUNIX データベース入門 ] 1.11) PostgreSQLは西暦2000年(Y2K)に対応してますか? 対応してます。西暦2000年より後の日付でも紀元前2000年より前の日付でも簡単に扱 えます。 1.12) 開発チームにはどのように参加しますか? 1番目に、最新のソースをダウンロードし、我々のウェブサイトか配布に含まれてい る PostgreSQL Developersの文書を読みます。 2番目に、pgsql-hackers と pgsql-patches メーリング・リストを購読(subscribe)します。 3番目に、高品質の パッチをpgsql-patchesに発信します。 およそ十人ちょっとの人達がいわゆる PostgreSQL CVSアーカイブの COMMIT 権限を持っています。 その人達が沢山の高品 質のパッチを発信してしまうので、現在のコミッター達は追い付くのが大変ですが、 我々は彼らがコミットしたパッチは高品質であると確信してます。 1.13) バグレポートはどうやって発信しますか? "bug-template" ファイルの項目を満たして、bugs@postgreSQL.orgに送って下さい。 その前に http://postgreSQL.orgにある最新の FAQ をチェックして下さい。 それと同時に ftp サイト ftp://ftp.postgreSQL.org/pubで、もっと新しいバージョ ンの PostgreSQL あるいはパッチをさがしてみて下さい。 1.14) 他のDBMSと比べてPostgreSQLはどうなのですか? ソフトウェアを計る方法にはいくつかあります。機能、性能、信頼性、サポート、 および、価格です。 機能(Features) PostgreSQLは、トランザクション、副問い合わせ、トリガー、ビュー、洗練さ れたロックなど、大規模商用DBMSが持つ機能をほとんど持っています。 PostgreSQLは、さらに、ユーザ定義型、継承、ルール、接続ロックを縮小させ るための復号版競合制御(multi-version concurrency control)など、商用 DBMSが持ち合わせない機能もいくつか持ちます。外部キーの参照整合性 (foreign key referential integrity)や外部結合(outer joins)は、未だあり ませんが、次 のリリースに盛り込むために、現在作業中です。 性能(Performance) PostgreSQLは二つのモードで走ります。普通のfsyncモードは、OSがク ラッシ ュしたり、数秒後に電源が落ちたりしたときのために、トランザクショ ンが完 了する毎にディスクに書き込み、すべてのデータをディスクに保存しま す。こ のモードでは、ほとんどの商用データベースよりも遅くなりますが、そ の部分 的な理由として、商用のデータベースの中にはこのように保守的なディ スク書 き込みをデフォルトとしているものが少ないということもあります。 no-fsync モードで、普通、PostgreSQLは商用データベースよりも速く なりますが、しか しながら、OSのクラッシュでデータが破壊されるかもしれま せん。我々は、そ の中間モードを開発中で、それがうまくゆくと、完全fsync モードほど性能を 犠牲にすることなく、OSがクラッシュする30秒前までのデー タ整合性を保てる ようになります。モードはデータベース管理者によって選択 可能です。 MySQLなどの特化型データベース・システムにくらべて、PostgreSQLの挿入/ 更新が遅いのは、トランザクションによるオーバーヘッドがあるからです。も ちろん、MySQLには上記のFeaturesの節に示すような機能はまったくあ りませ ん。我々は、PostgreSQLに柔軟性と機能性を組み込みながらも、絶えず、 プロ ファイラーに掛けたりソースコードを解析したりして、性能の改善を続け てい ます。 PostgreSQLは、Unixプロセスを起動することによりユーザー接続を操作しま す。 複数のバックエンド・プロセスが情報をロックしながらデータ・バッファ ーを 共有します。マルチCPUでは、簡単に複数のバックエンドをそれぞれのCPU で走 らせることができます。 信頼性(Reliability) 我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解してます。十 分テストして、安定したコードをバグを最小にしてからリリースするように勤 めてます。それぞれのリリースは少なくとも1カ月以上のベータ・テストを行 ない、これまでのリリースの履歴が、製品版として安定した堅固なリリースで あることを物語っています。この分野では、他のデータベースと比べても遜色 がないことに自信を持っています。 サポート(Support) 遭遇したいかなる問題の解決を助けるために、開発者やユーザーなどの大きな グループのためにメーリング・リストを提供しています。我々が修正を保証で きない間は、商用DBMSも修正を供給することは無いでしょう。開発者達、ユー ザ・コミュニティ、マニュアル類、それに、ソースコードなどに直接アクセス できることよって、PostgreSQLのサポートは、他のDBMSサポートよりも優れた ものとなっています。御要望に答えて、事柄毎の商用サポートもあります (サ ポートFAQ項目をご覧下さい)。 価格(Price) PostgreSQLの使用は、商用でも非商用でも、すべて無料です。上記に示してあ るBSDスタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで 商品に組み込むことができます。 ------------------------------------------------------------------------ ユーザー・クライアントの質問 2.1) PostgreSQL のための ODBC ドライバーはありますか? PostODBC と OpenLink ODBC の二つの ODBC ドライバーが利用可能です。 PostODBC は PostgreSQL の配布に含まれています。それについてのさらに詳細な情 報は http://www.insightdist.com/psqlodbc から得られるでしょう。 [訳注: 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にお 願いします。 2.2) PostgreSQL を WEB ページにひっかけるにはどんなツールがありますか? データベースを裏に持つウェブページについての素晴らしい紹介が、 http://www.webtools.com にあります。 http://www.phone.net/home/mwm/hotlist/にも、もう一つあります。 ウェブへの拡張のためには、PHP が卓越したインターフェースとなっています。 http://www.php.netにあります。 [訳注: PHPに関する日本語のサイトは広川さんのところにあります。 前田充宏さん(mitsu@cni.co.jp)により作られましたPHP/FIの日本語パッチhttp://pg.cni.co.jp/が様々な人の手を経てPHP3.0.7に対応されました。現在はPHPJ-DEV(http://php.jpnnet.com/)にてマルチバイト対応拡張として作り直されてPHP-3.0.12に対応しています。 ] PHP は簡単な内容に対しては素晴らしいのですが、より複雑な場合の多くは perl イ ンターフェースと CGI.pm が使われています。 perl を使った WDB を基にした WWW ゲートウェイは http://www.eol.ists.ca/~dunlop/wdb-p95からダウンロードできます。 2.3) PostgreSQL はグラフィカル・ユーザ・インターフェースを持っていますか? レポート・ジェネレータは? 埋め込み問い合わせ言語へのインターフェースは? pgaccess と呼ばれる素晴らしいグラフィカル・ユーザ・インターフェースがあり、 この配布と共に出荷されます。Pgaccess にはレポート・ジェネレータもあります。 ウェブページは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/4GL(contrib/pginterface) * 埋め込みHTML(PHP from http://www.php.net) [訳注: そのほか ruby のインターフェースもあります。 ruby の作者である、まつもと ゆきひろ(matz@netlab.co.jp)さんと、 まつもと えいじ(ematsu@pfu.co.jp)さんが ruby の PostgreSQL インター フェースを作りました。日本語 PostgreSQL ML のアーカイブより、 http://www.sra.co.jp/people/t-ishii/PostgreSQL/archive.html "Subject: [pgsql-jp 2446] PostgreSQL ruby module" を御覧ください。 ruby については、 http://www.netlab.co.jp/ruby/jp/ を御覧下さい。 ] ------------------------------------------------------------------------ 管理上の質問 3.1) なぜ initdb が失敗するのですか? * (コマンド)パスの中に古いバージョンの実行モジュールがないか確認して下さ い。 (もしも、WARN:heap_modifytuple: repl is 9というメッセージが出てい ればこれが問題です。) * 適切なパスがセットされているかどうかを確認して下さい * postgres ユーザが該当ファイルを所有しているかどうかを確認して下さい * $PGDATA/files の下にあるファイルが空でないことを確認して下さい。もし、 それらがなければ、"gmake install" が何らかのかの理由で失敗してます 3.2) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか? 簡単な方法は、 configure を走らせる時に --prefix オプションを指定することで す。 もし、それをするのを忘れたときは、Makefile.global 修正して POSTGRESDIR をそれに合わせるか、あるいは、Makefile.custom をつくりそこで POSTGRESDIR を 定義して下さい。 3.3) postmaster を走らせると、Bad System Call core dumpd というメッセージが 出ます。 さまざまな問題が考えられますが、まず最初にあなたのカーネルに system V の拡張 がインストールされているかを確認して見てください。PostgreSQL はカーネルによ る共有メモリとセマフォのサポートを必要とします。 3.4) postmaster を走らせようとすると、IpcMemoryCreate エラーが出ます。 カーネルが共有メモリーを持つ設定になっていなかったか、でなければ、カーネルに 対して使える共有メモリの大きさを大きく設定する必要があります。具体的な大きさ は、使っているアーキテクチャとpostmaster を走らせるときに設定するバッファの 数とバックエンドプロセスに依存します。ほとんどのシステムでは、既定値のバッフ ァサイズで、少なくても約1MBが必要です。 3.5) postmasterを走らせようとすると、IpcSemaphoreCreate エラーメッセージを受 け取ります。どうしてですか? もしエラーメッセージがIpcSemaphoreCreate: semget failed (No space left on device)であれば、カーネルが十分なセマフォーを使えるように構成されていませ ん。Postgresは潜在的なバックエンドプロセス毎に一つのセマフォーを必要としま す。とりあえずの解決策はpostmasterを始動する時に、バックエンドプロセスの数を より少なく制限をすることです。既定値の32より小さな数のパラメータを-Nで使いま す。より恒久的な解決策は、カーネルのSEMMNS と SEMMNI パラメータを増やすこと です。 もし、エラーメッセージがなにか他のものであれば、カーネルの構成でまったくセマ フォーのサポートをしていないかもしれません。 3.6) 他のホストから自分の PostgreSQL データベースへのアクセスは、どのように 防ぎますか? 既定値では、PostgreSQL は unix ドメインソケットを使うローカルマシンからの接 続しか許しません。postmaster 起動に -i フラッグを加え、$PGDATA/pg_hba.conf ファイルを適切に直して、ホスト主導型の認証を使わないかぎりは他のマシンからは 接続できないでしょう。これによりTCP/IPの接続が可能になります。 3.7) 他のマシンから自分のデータベースに接続できないのはなぜですか? 既定値の設定ではローカルマシンからの unix ドメインのソケット接続しか許しませ ん。TCP/IP 接続を可能にするには postmaster が -i オプションで開始されてい て、pgsql/data/pg_hba.conf ファイルに適切なホストの記載が追加されていること を確認してください。 オンラインマニュアルで pg_hba.conf を見て下さい。 3.8) なぜ、root ユーザでは自分のデータベースにアクセスできないのでしょうか? ユーザ id 0 (root) でデータベース・ユーザを創るべきではありません。そうする とユーザはデータベースにはアクセスできません。これは、すべてのユーザがデータ ベース・エンジンの中にオブジェクト・モジュールを動的に結合できるようにするか わりの保全対策です。 3.9) 競合してテーブルにアクセスするとすべてのサーバが落ちます。なぜでしょう か? この問題はセマフォをサポートするように設定していないカーネルで起こり得ます。 3.10) よりよい性能を得るために、どのようにデータベース・エンジンを調整できま すか? 確かに索引は問い合わせの速度を増します。EXPLAINコマンドで PostgreSQL がどの ようにあなたの問い合わせを翻訳しているかを見ることができ、そして、どの索引が 使われているかを見ることができます。 もし INSERT を沢山しているとすると、COPY コマンドを使った大きなバッチ処理で それを行なうことを考慮して下さい。これは、単独の INSERT を別々に行なうよりも っと速いです。次に、BEGIN WORK/COMMIT のトランザクション・ブロックの中にはな い文を、それらのトランザクションの中に入れることを考えてみてください。幾つか の文を一つのトランザクション・ブロックの中で行なうことを考えて下さい。これに よりトランザクションのオーバーヘッドが縮小されます。また、大きなデータの変更 を行なう際はインデックスを一度外して、作り直すことを考えてみて下さい。 行なえるチューニングには幾つかあります。postmaster を -o -F オプションで起動 することによって、fsync() を無効にするオプションを使うことができます。これに よって、すべてのトランザクション毎に fsync() でディスクを更新するのを止めさ せます。 postmaster -B オプションを使ってバックエンド・プロセスにより使われる共有メモ リ・バッファを大きくすることもできます。もし、このパラメータを高くしすぎる と、カーネルの共有メモリー空間の制限値を越えてしまっうために postmaster は走 らないでしょう。既定値では、それぞれのバッファの大きさは 8K で、バッファ数は 64 です。 バックエンドを -S オプションを使って、それぞれのバックエンド・プロセスが一時 的な並べ替えによって使うメモリの最大サイズを増やすこともできます。 その -S の値はキロバイト単位で、既定値は 512 (すなわち、512K)です。 その値をあまり大 きくし過ぎることは賢くありません、問い合わせが幾つかの競合する並べ変えを実行 するときにメモリーを使いはたしてしまうかもしれません。 また、CLUSTER コマンドを使って、基表のデータを索引に合わせるためにグループ化 することもできます。 3.11) PostgreSQL ではどのようなデバッグ機能が使えますか? PostgreSQL は、デバッグのために意味のある、状態情報を報告する幾つかの機能を 持ちます。 まず、--enable-cassert オプションで configure を走らせます。そうしてコンパイ ルすることにより、沢山の assert() が、バックエンドの進捗状況を監視し、何か予 期せぬことが起きるとプログラムを停止するようになります。 postmaster と postgres の両方で幾つかのデバッグ・オプションの利用ができま す。まず次のように、postmaster を起動するときはいつでも、次のように標準出力 とエラー出力をログ・ファイルに送るようにしてあることを確かめて下さい。 cd /usr/local/pgsql ./bin/postmaster >server.log 2>&1 & これにより PostgreSQL の最上部のディレクトリに server.log ファイルが置かれま す。このファイルはサーバーが遭遇した問題やエラーについて有用な情報を含みま す。Postmaster は更に詳細な情報を報告するための -d オプションを持ちます。そ の -d オプションは、デバグ・レベルを指定します。高いデバグ・レベルでは、大き なログファイルを生成することに注意しなくてはなりません。 コマンド行から、実際に postgres のバックエンドを走らせることも、また、SQL 文 を直接入力することもできます。これは、デバッグの目的のためにだけお勧めしま す。セミコロンではなく、改行が問い合わせを完結することに注意して下さい。も し、デバッグ・シンボルを一緒にコンパイルしていたならば、何が起きているかを診 るのにデバッガが使えるでしょう。バックエンドが postmaster から起動されたので はなく、同一環境で走るわけではではないので、ロッキング/バックエンドの相互関 係の問題では重複は起こらないでしょう。あるオペレーティング・システムでは、問 題を診断するために、走っているバックエンドに直接取り付けることができます。 postgreSQL プログラムには、デバッグと性能測定にとても役に立つ -s、-A、-t 等 のオプションがあります。 なんという関数が実行時間を食っているかを見るために、プロファイリングでコンパ イルすることも可能です。そのバックエンドのプロフィール・ファイルは pgsql/data/base/dbname ディレクトリに格納されるでしょう。クライアントのプロ フィールは現行ディレクトリに置かれるでしょう。 3.12) 接続しようとすると'Sorry, too many clients'を受け取ります。どうしてで すか? postmasterが同時始動できるバックエンドプロセスに対する制限数を増やす必要があ ります。 Postgres 6.5.*では制限の既定では32プロセスです。適切な-Nの値でpostmasterを再 起動することにより増加させることができます。既定の構成では-Nは1024と同じ大き さに設定できます。もし、もっと必要であればinclude/config.hの中のMAXBACKENDS を増加させ、再構築します。もし、望むならconfigureの --with-maxbackends切替を 使って、-Nの既定値を構成時に設定できます。 もし、-N を 32よりも大きくするのであれば、-Bも既定の64を越すように増加させる ことを考慮すべきです。沢山の数のバックエンドプロセスは、様々なUnixカーネルの 構成パラメータも増やすことが必要になるでしょう。共有メモリーブロックの最大の 大きさも確認事項に含まれ、SHMMAX, セマフォーの最大数、 SEMMNS と SEMMNI, プ ロセスの最大数、NPROC ユーザ毎の最大プロセス数、MAXUPRC 開くファイルの最大 数、NFILEとNINODE。 その理由は、Postgresが許されるバックエンドのプロセス数の 制限を持つためで、それによりシステムの資源を使い果してしまうことに堪えること ができます。 6.5よりも前のバージョンのPostgresではバックエンドの最大数は64で、その変更に は、include/storage/sinvaladt.hの中のMaxBackendId定数を定めた後に再構築が要 求されました。 3.13) 自分のデータベース・ディレクトリにある pg_tempNNN.NN ファイルとは何で すか? それらは問い合わせ実行部によって生成された一時的なファイルです。例えば、もし order by 句を満たす為にバックエンドの -S パラメータで許可したよりも大きなス ペースがソートに必要だとすると、幾つかの一時ファイルが溢れたデータを保持する ために一時(temp)ファイルが生成されます。 tempファイルは自動的に消し去られる はずですが、もし、ソートの途中でバックエンドが潰れてしまうとそうなりません。 もし、その時トランザクションが走ってなければ、pg_tempNNN.NNファイルを消して も安全です。 3.14) 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 のフィールドは以下のとおりです: * groname: グループ名。name で純粋な英数字にすべき。 アンダースコアやその 他の特殊文字を含めないこと。 * grosysid: グループID。Int4 型で各グループ毎に一意であるべき。 * grolist: そのグループに所属する pg_user id のリスト。 このフィールドの 型は int4[]。 ------------------------------------------------------------------------ 操作上の質問 4.1) システムがカンマ、小数点、および、日付フォーマットについて混乱している ようです。 ロケールの設定を確かめて下さい。PostgreSQL は postmaster プロセスを走らせた ユーザーのロケールの設定を使います。postgres とpsql には SET コマンドがあ り、データ書式を制御できます。これらをあなたの操作環境に合わせて設定して下さ い。 4.2) バイナリ・カーソルとノーマル・カーソルの厳密な違いは何ですか? 詳述は、オンラインマニュアルで DECLARE を見て下さい。 4.3) 問い合わせの最初の数行のみを SELECT するにはどうしますか? オンラインマニュアルでFETCHをご覧頂き、SELECT ... LIMIT....を使ってみて下さ い。 たとえ、欲いのは最初の数行だけでも、すべての問い合わせを評価しなくてはならな いかもしれません。。ORDER BY を持った問い合わせを考えてみて下さい。 もし、 ORDER BYに合う索引があるとすると、PostgreSQLは要求された最初の数行だけを評価 できるかもしれませんし、あるいは、意図した行が生成されるまで、すべての問い合 わせが評価されなければならないかもしれません。 4.4) テーブルのリスト、あるいはその他の情報を psql で見るにはどうしますか? psqlのソースコード pgsql/src/bin/psql/psql.c ファイルを読むことができます。 それは、psqlのバックスラッシュコマンドのための出力となるSQLコマンドを含んで います。 Postgres 6.5 を始めるにあたり、psql を -E オプションで開始すれば、 与えたコマンドを実行するための問い合わせを出力します。 ファイル pgsql/src/bin/psql/psql.c を見て下さい。その中に、psql のバックスラ ッシュコマンドで生成される SQL コマンドもあります。 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; 4.6) 行、テーブル、データベースの最大サイズは? 行の大きさは 8キロ・バイト(8K)に制限されていますが、これはinclude/config.hを 編集しBLCKSZを変えることにで変更できます。8K を越える属性を使うときは、ラー ジ・オブジェクト・インターフェースを使ってみて下さい。 [訳注:8K は 8*1024=8192] 行は 8k の境界をまたがることができないので、5k の行でも 8k の保存領域が必要 です。 テーブルとデータベースの大きさの制限はありません。数十ギガバイトのデ ータベースは沢山あり、また、おそらく幾つかは数百ギガバイトです。 4.7) データベースのディスク容量はどのくらい必要です? Postgresデータベースに保存するのに、普通のファイルの約6倍半のディスク容量を 必要とします。 各行に二つづつ整数を持つ 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)演算子を使う時は索引は、もし、検索の 始まりが文字列の始まりで固定されている場合のみ使われます。ですから、索引を使 うには%で始まらない LIKE 検索 と ^ で始まる~(正規表現)にします。もし、locale が埋め込まれていれば、索引はワイルドカード検索には使えません。 もし、システムが已然として索引を見ないとすれば、不適切な *_ops 型のフィール ドに索引をつくってしまったからでしょう。たとえば、CHAR(4) のフィールドをつく ったのに、char_ops index type_class を指定してしまったときなどです。 どの型のクラスが利用可能かにつては、オンラインマニュアルで create_index を見 て下さい。フィールドの型と合うはずです。 不適切な索引がつくられても、 PostgreSQL は警告を出しません。 索引は ORDER BY 操作のためには使われません。 4.10) 問い合わせ最適化部がどのように問い合わせを評価するのかを見るにはどうし ますか? オンラインマニュアルで explain を見て下さい。 4.11) R-tree 索引とは何ですか、また、何のために使われますか? R-tree 索引は空間的なデータに索引を付けるために使われます。ハッシュ索引では 範囲の検索ができません。また、B-tree 索引では、1次元でしか範囲の検索ができ ません。R-tree インデックスであれば多次元のデータを扱えます。たとえば、もし R-tree インデックスを point 型の属性に付けることができるとするとシステムは、 長方形に囲まれた点をすべてを選択するというような問い合わせに、より効率良く答 えられます。 組み込まれている R-Tree でポリゴンやボックスを操作できます。理論的にはR-tree はもっと高い次元を操作するようにも拡張できます。実質的には、R-tree の拡張に はちょっとした作業が必要でして、現在、我々はそれをどのようにするかについての 文書を持っていません。 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" でも取り上 げられています。 [訳注: 奈良先端大の石川佳治さんより日本 PostgreSQL ML にて文献を紹介して 頂きました。この ML のアーカイブ http://www.sra.co.jp/people/t-ishii/PostgreSQL/archive.html から "Subject: [postgres95 801] spatial data structures" を御覧下さい。 ] 4.12) 遺伝的問い合わせ最適化とは何ですか? PostgreSQL の GEQO モジュールは、遺伝的アルゴリズム(GA)で、沢山のテーブルの 結合する、問い合わせ最適化問題を解くことを意図しています。これにより、しらみ つぶし探索を行なうことなしに、大きな結合(join queries)を扱うことができるよう になります。 さらに詳しい情報については文書を御覧下さい。 4.13) 正規表現での検索はどのようにすればよいですか? 大文字と小文字とを区別 しない regexp 検索は? ~と~* のことだと思います。 psql の \do コマンドをご覧下さい。 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バイトがデー タ長で、それの後に実際のデータが続きます)。char(#) はどれだけデータがフィー ルドに保存されようとも最大のバイト数を確保します。text と varchar(#) と BYTEA 等はすべてディスク上で可変長となる文字型で、このため、それらを使うため には小さな性能上のペナルティがあります。特にそのペナルティは、この型が最初に 現れたカラムの後の任意のカラムにアクセスするときにあります。 4.16) 通番(serial)/自動増分フィールドはどのようにつくりますか? PostgreSQL は SERIAL データ型をサポートします。カラム上に通番と索引を自動作 成します。通番についてのさらなる情報は、オンラインマニュアルの create_sequence を御覧下さい。 また、各行のoidフィールドを一意値として使うこともできます。しかしながら、も しもデータベースをダンプしてりロードする必要がある場合は、oidを温存するため にpg_dumpの -oを使うか、または、COPY WITH OIDSオプションを使う必要がありま す。 4.17) oid とは何ですか? tid とは何ですか? Oid とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくら れるすべての行は一意の oid を得ます。initdb で(backend/access/transam.h か ら)発生される oid はすべて 16384より小さな値です。initdb 後のすべての oid (ユーザ作成)はそれ以上の値になります。既定値では、これらすべての oid はテー ブル内やデータベース内に留まらず、PostgreSQL のそのインストレーション全体内 で一意であります。 PostgreSQL はテーブル間の行を結びつけるために、そのシステム・テーブル内に oid を使います。この oid は特定のユーザの行を識別するためや結合の中で使われ ることができます。oid の値を保存するためには oid 型をカラムに使うことを奨め ます。他の内部カラムを見るにはオンライン・マニュアルで sql(l) を御覧下さい。 より速くアクセスするために oid フィールドに索引を作ることができます。 Oid は、全てのデータベースから使われる中央部分からの全ての新しい行に割り当て られます。もし、oid を他の何かに変えたかったり、あるいは、元の oid でテーブ ルをコピーしたかったとしても、それを行なうことはできません。 CREATE TABLE new_table(old_oid oid, mycol int); SELECT INTO new SELECT old_oid, mycol FROM old; COPY new TO '/tmp/pgtable'; DELETE FROM new; COPY new WITH OIDS FROM '/tmp/pgtable'; Tid は特定の物理行をそのブロックとオフセット値で識別するために使われます。 Tid は行が修正されたり再ロードされると変わります。それらの tid は、物理行を 指すために索引記載で使われます。 4.18) PostgreSQL で使われる幾つかの用語の意味は何ですか? あるソースコードや古い文書の中では、あまり一般的ではなくなった用語を使ってま す。それらは; * 表(table)、関係(relation)、クラス(class) * 行(row)、レコード(record)、タップル(tuple) * 列(column)、フィールド(field)、属性(attribute) * 取得(retrieve)、選択(select) * 置換(replace)、更新(update) * 追加(append)、挿入(insert) * oid、連番(serial value) * ポータル(portal), カーソル(cursor) * 領域変数(range variable)、表名(table name)、表別名(table alias) 4.19) エラーメッセージ "FATAL: palloc failure: memory exhausted?" を受け取る のはなぜですか? システムの仮想メモリーを全て使い果たしてしまっている可能性があるか、あるいは カーネルがあるリソースについて低い制限値を持っている可能性がありあmす。 postmaster を開始する前にこれを試してみて下さい: ulimit -d 65536 limit datasize 64m シェルによって、これらのうちの一つがゆくでしょうが、それは、プロセスのデータ セグメントの限界をより高く設定するので問い合わせが完成のを許すでしょう。この コマンドは現行のプロセスと、このコマンドを走らせた後に作られる全てのサブプロ セスについて適用されます。それでも、SQL クライアントで問題があれば、クライア ントを開始する前のバックエンドがとても多くのデータを返そうとしているのでしょ う。 4.20) どのバージョンの PostgreSQL を走らせているかを調べるにはどうしますか? psql から select version(); をタイプします。 4.21) ラージ・オブジェクトの操作でinvalid large obj descriptor を受け取りま した。なぜでしょうか? ラージ・オブジェクト操作をするときは、前後にBEGIN WORKとCOMMITを付ける必要が あります。すなわち、lo_open ... lo_closeで取り囲みます。 文書ではいつもlo_openはトランザクションに包み込まれているとしてありますが、 6.5より前のバージョンのPostgreSQLではこの規則に従っていません。あなたが、壊 したかのように言って、自分で失敗していることが間々あります。 現在のPostgreSQLでは、トランザクションのコミットの時にラージ・オブジェクト・ ハンドルを閉じることにより、強制的に規則を実行します。そして、それはトランザ クションの中でないときは一時的にlo_openコマンドの成立となります。それで、最 初にハンドルに対して何かをしようとすると、invalid large obj descriptorとなり ます。それで、(少なくともほとんどの時間)働いていたコードは、トランザクショ ンを使うのを失敗すると、エラーメッセージを生成します。 もし、ODBCのようなクライアントインターフェースをお使いなら、auto-commit off を設定する必要があるかもしれません。 4.22) 現在時刻がデフォルトとなるような列はどのようにつくりますか? 次のようにしたくなるでしょう: create table test (x int, modtime timestamp default 'now'); しかし、これではデフォルトが、行の挿入時間ではなく、表の作られる時間となりま す。 かわりに: CREATE TABLE test (x int, modtime timestamp default now() ); 関数now() を呼ぶことで、デフォルト時間が表の作成時に計算されてしまうのを避け て、挿入時まで遅らせます。post-6.5.* リリースではこれで問題が無いと信じてい ます。 4.23) なぜ、INを使う副問い合わせがとても遅いのですか? 現在、外部問い合わせの各行について副問い合わせの結果を連続走査することによ り、副問い合わせを外部問い合わせに結合しています。当面はINをEXISTSで置き換え ることです。たとえば、 元の: SELECT * FROM tab WHERE col1 IN (SELECT col2 FROM TAB2) を、置き換えて: SELECT * FROM tab WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2) とします。 この制限は将来のリリースで直したいと思っています。 ------------------------------------------------------------------------ PostgreSQLの拡張についての質問 5.1) ユーザ定義関数を書きましたが、psql の中で実行したらコア・ダンプしてしま うのはなぜですか? 問題は色々と考えられます。まず最初に、お作りになったユーザ定義関数を単独のテ ストプログラムにして試してみて下さい。また、type_in() や type_out()関数の実 行中のように、フロントエンドがデータを待っている時に elog NOTICES を送ってい ないか確かめて下さい。 [訳注:elog は error logging です。] 5.2) 次のようなメッセージを受け取ります。 NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set! palloc されていない何かを pfree しようとしています。malloc/freeと palloc/pfreeとを混在させないようにご注意下さい。 5.3) PostgreSQL のために書いた、粋な新しい型や関数は、どのようにすれば貢献で きるのですか? 皆さんの行なった拡張を、pgsql-hackers メーリング・リストに送ってください。そ して、ゆくゆくはそうした拡張が contrib/ サブディレクトリの中に入ることになる でしょう。 5.4) タップルを返す C の関数はどのように書きますか? 原理的には可能ですが、これには極端な妙技を要しますので、著者らは未だやったこ とがありません。。 5.5) ソース・ファイルを変更しました。再コンパイルしても変わりが無いのはどう してですか? 幾つかの Makefile がインクルード・ファイルに対して適切な依存関係を持っていま せん。make clean をしてからもう一度 make を行なわなくてはなりません。