diff --git a/doc/FAQ_japanese b/doc/FAQ_japanese index 12fb7cbdd05e9f7ebd86c55983679a2106488ae9..0d989f2f4910c234d63e5bccab26ff3256857f2c 100644 --- a/doc/FAQ_japanese +++ b/doc/FAQ_japanese @@ -1,6 +1,6 @@ PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ) -原文最終更新日: Mon Mar 18 14:34:57 EST 2002 +原文最終更新日: Fri Apr 26 23:03:46 EDT 2002 現在の維持管理者: Bruce Momjian (pgman@candle.pha.pa.us) Maintainer of Japanese Translation: Jun Kuwamura (juk@postgresql.jp) @@ -73,14 +73,14 @@ docs/faq.html 操作上の質問 4.1) バイナリ・カーソルと通常カーソルとの違いは何ですか? -4.2) 最初の数行のみを select するにはどうしますか? +4.2) 最初の数ロウのみを select するにはどうしますか? 4.3) テーブルやその他の情報のリストを psql で見るにはどうしますか? -4.4) テーブルから列の削除はどのようにしますか? -4.5) 行、テーブル、データベースの最大サイズは? +4.4) テーブルからカラムの削除はどのようにしますか? +4.5) ロウ、テーブル、データベースの最大サイズは? 4.6) 一般的なテキストファイルからデータを保存するには、データベースのディスク容 量はどのくらい必要ですか? -4.7) データベース内に定義されたテーブルやインデックスをどのようにして見つけ出し -ますか? +4.7) 定義されたテーブル、インデックス、データベース、および、ユーザをどのように +して見つけ出しますか? 4.8) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか ? 4.9) 問い合わせオブティマイザがどのように問い合わせを評価するかを見るにはどうし @@ -106,10 +106,11 @@ docs/faq.html 4.19) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうしますか? 4.20) ラージオブジェクトの操作で、invalid large obj descriptorと出るのはなぜで すか? -4.21) 現在の時刻がデフォルトとなるような列はどのようにつくりますか? +4.21) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか? 4.22) なぜ、INを使う副問い合わせがとても遅いのですか? 4.23) 外部結合(outer join)はどのように実現しますか? 4.24) 複数のデータベースを使う問い合わせはどのようにすればできますか? +4.25) 関数で複数のロウまたはカラムを返すにはどうしますか? PostgreSQLの拡張についての質問 @@ -750,7 +751,9 @@ postgreSQL 何という関数がどのくらい実行時間を食っているかを見るために、プロファイリング( プロフィール付き)でコンパイルすることも可能です。そのバックエンドのプロフィー ル・ファイルは pgsql/data/base/dbname ディレクトリに格納されるでしょう。クライ -アントのプロフィールはクライアントの現行ディレクトリに置かれるでしょう。 +アントのプロフィールはクライアントの現行ディレクトリに置かれるでしょう。Linux +でまともなプロファイリングを行うには -DLINUX_PROFILE でコンパイルする必要があり +ます。 3.8) 接続しようとするときに 'Sorry, too many clients' が出るのはなぜですか? @@ -805,16 +808,16 @@ ORDER BY 詳述は、オンラインマニュアルで DECLARE を見て下さい。 -4.2) 最初の数行のみを SELECT するにはどうしますか? +4.2) 最初の数ロウのみを SELECT するにはどうしますか? オンラインマニュアルでFETCHを見てください。あるいは、SELECT ... LIMIT....を使っ てみて下さい。 -たとえ、欲しいのは最初の数行だけでも、すべての問い合わせを評価しなくてはならな -いかもしれません。ORDER BY を持った問い合わせを考えてみて下さい。もし、ORDER BY -に合ったインデックスがあるとすると PostgreSQLは要求された最初の数行だけで評価で -きるかもしれませんが、でなれば、PostgreSQL は意図した行が生成されるまですべての -行を評価しなければならないかもしれません。 +たとえ、欲しいのは最初の数ロウだけでも、すべての問い合わせを評価しなくてはなら +ないかもしれません。ORDER BY を持った問い合わせを考えてみて下さい。もし、ORDER +BYに合ったインデックスがあるとすると PostgreSQLは要求された最初の数ロウだけで評 +価できるかもしれませんが、でなれば、PostgreSQL は意図したロウが生成されるまです +べてのロウを評価しなければならないかもしれません。 4.3) テーブルやその他の情報のリストを psql で見るにはどうしますか? @@ -823,22 +826,25 @@ psql コマンドが含まれています。 psql に -E オプションをつけて起動すれば、与えたコマ ンドを実行するための問い合わせが出力されます。 -4.4) テーブルから列の削除はどのようにしますか? +4.4) テーブルからカラムの削除はどのようにしますか? ALTER TABLE DROP COLUMN はサポートしていませんが、その代わりにこうします: - SELECT ... -- 削除したい列以外の列をすべて選択します。 + BEGIN; + LOCK TABLE old_table; + SELECT ... -- 削除したいカラム以外のカラムをすべて選択します。 INTO TABLE new_table FROM old_table; DROP TABLE old_table; ALTER TABLE new_table RENAME TO old_table; -[訳注:列の追加は ALTER TABLE ADD COLUMN で行えます。] + COMMIT; +[訳注:カラムの追加は ALTER TABLE ADD COLUMN で行えます。] -4.5) 行、テーブル、データベースの最大サイズは? +4.5) ロウ、テーブル、データベースの最大サイズは? 制限は以下のとおりです。 データベースの最大サイズ? 制限無し (500GB のデータベースも存在します) テーブルの最大サイズ? 16TB -行の最大サイズ? 7.1以降で制限無し +ロウの最大サイズ? 7.1以降で制限無し フィールドの最大サイズ? 7.1以降で1GB テーブル内での最大ロウ数? 制限無し テーブル内での最大カラム数? カラムの型により250-1600 @@ -865,7 +871,7 @@ ALTER TABLE DROP COLUMN う。テキストの文字列の平均長さを20バイトと仮定すると、フラットファイルの大きさ は約2.8MB です。このデータを含む PostgreSQL データベースファイルの大きさは次の ように約6.4MBと見積もることができます: - 36 bytes: 各行のヘッダ(概算) + 36 bytes: 各ロウのヘッダ(概算) 24 bytes: 整数(int)フィールドとテキスト(text)フィールド + 4 bytes: ページ上のタップルへのポインタ ---------------------------------------- @@ -886,29 +892,30 @@ ALTER TABLE DROP COLUMN インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされる データを含む以上、それなりに大きくなります。 -4.7) データベース内に定義されたテーブルやインデックスをどのようにして見つけ出し -ますか? +4.7) 定義されたテーブル、インデックス、データベース、および、ユーザをどのように +して見つけ出しますか? psql にはいろいろなバックスラッシュ・コマンドがあり、こうした情報を表示します。 バックスラッシュ・コマンドの種類を見るには \? を使って下さい。 また、pgsql/src/tutorial/syscat.source ファイルを走らせてみて下さい。それは、沢 山の SELECT 文により必要な情報をデータベースのシステム・テーブルから取り出して -例示してくれます。 +例示してくれます。また、pg_ で始まるシステムテーブルにも記述されています。さら +に、psql -l はすべてのデータベースをリスト表示します。 4.8) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか ? インデックスは自動的にすべての問い合わせで使われるわけではありません。テーブル -が最小サイズより大きく、問い合わせでそのわずかなパーセンテージの行を選択する時 -だけ、インデックスは使われます。これはインデックススキャンにより起こされるラン -ダムなディスクアクセスは、テーブルをストレートに読む順次走査よりも遅くなること -がときどきあるからです。 +が最小サイズより大きく、問い合わせでそのわずかなパーセンテージのロウを選択する +時だけ、インデックスは使われます。これはインデックススキャンにより起こされるラ +ンダムなディスクアクセスは、テーブルをストレートに読む順次走査よりも遅くなるこ +とがときどきあるからです。 インデックスを使うかを決定するために、PostgreSQL はテーブルについての統計情報を 持たなければなりません。この統計情報は、VACUUM ANALYZEまたは、単に ANALYZE を使 -って収集することができます。統計情報を使ってオブティマイザはテーブルの中に何行 -あるかを知り、インデックスを使うべきかのの決定をより正しくできます。統計情報は +って収集することができます。統計情報を使ってオブティマイザはテーブルの中にある +ロウ数を知り、インデックスを使うべきかのの決定をより正しくできます。統計情報は 最適な結合順や結合方法を決める上でも貴重なものもあります。統計情報の収集は、テ ーブルの内容がかわると毎に繰返しなされるべきです。 @@ -1003,7 +1010,7 @@ Type Internal Name Notes "char" char 1 character CHAR(#) bpchar 指定された固定長となるように空白が詰められる VARCHAR(#) varchar 長さの上限の無いテキスト -TEXT text 長さの制限は最大行長による +TEXT text 長さの制限は最大ロウ長による BYTEA bytea 可変長のバイト配列(null-byte safe) 内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージを @@ -1012,8 +1019,8 @@ BYTEA bytea 上記の型のうち後の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バイ トがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は宣言さ れた大きさよりも少し大きくなります。しかし、これらのデータ型はTOASTにより圧縮さ -れたり複数行に渡って保存されたりして、ディスク上の空間は思ったより小さくなりま -す。 +れたり複数ロウに渡って保存されたりして、ディスク上の空間は思ったより小さくなり +ます。 CHAR()はいつも長さが同じ文字列を保存するのに最適です。VARCHAR() は可変長の文字 列を保存するのに最適ですが、保存できる文字列の長さに制限があります。TEXT は長さ @@ -1022,8 +1029,8 @@ NULL 4.15.1) 通番(serial)/自動増分フィールドはどのようにつくりますか? -PostgreSQL は SERIAL データ型をサポートします。列上に通番とインデックスを自動作 -成します。たとえば、 +PostgreSQL は SERIAL データ型をサポートします。カラム上に通番とインデックスを自 +動作成します。たとえば、 CREATE TABLE person ( id SERIAL, name TEXT @@ -1038,8 +1045,8 @@ PostgreSQL 通番についてのもっと詳しい情報は、オンラインマニュアルで create_sequence をご覧 下さい。 -また、各行のOIDフィールドを一意値として使うこともできます。しかしながら、もしも -データベースをダンプしてりロードする必要がある場合は、OIDを温存するために +また、各ロウのOIDフィールドを一意値として使うこともできます。しかしながら、もし +もデータベースをダンプしてりロードする必要がある場合は、OIDを温存するために pg_dump で -oオプションを使うか、または、COPY WITH OIDSオプションを使う必要があ ります。 Bruce Momjian の(http://www.PostgreSQL.org/docs/aw_pgsql_book)の Numbering Rowsの章にありあます。 @@ -1054,7 +1061,7 @@ Numbering Rows そうして、new_id に保存した新しい値を他の問い合わせに(たとえば、person テーブル に対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作られた SEQUENCEオブジェクトの名前は、<table>_<serialcolumn>_seq のようになり、このうち -、table と serialcolumn はそれぞれテーブルの名前とSERIAL列の名前です。 +、table と serialcolumn はそれぞれテーブルの名前とSERIALカラムの名前です。 あるいは、与えられたSERIAL値を、それが既定値として挿入された後で(after)、 currval() 関数を使って取り出すこともできます。たとえば、 @@ -1080,19 +1087,19 @@ OID 4.16) OID とは何ですか? TID とは何ですか? -OID とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくられる -すべての行は一意の OID を得ます。initdb で発生される OID はすべて 16384 +OID とは一意のロウID に対する PostgreSQL の答えです。PostgreSQL の中でつくられ +るすべてのロウは一意の OID を得ます。initdb で発生される OID はすべて 16384 (backend/access/transam.h から)より小さな値です。initdb 後のすべての OID (ユー ザ作成)はそれ以上の値になります。既定では、これらすべての OIDは一つのデーブルや データベース内に留まらず、PostgreSQL インストレーション全体の中で一意です。 -PostgreSQL はテーブル間の行を結びつけるために、そのシステムテーブル内に OID を -使います。この OID は特定のユーザの行を識別するためや結合の中で使われることがで -きます。OID の値を保存するためには OID 型を列に使うことを奨めます。より速くアク -セスするために OID フィールドにインデックスを作ることができます。 OID は、全て -のデータベースで使われる中央領域から、全ての新しい行に割り当てられます。OID を -他の何かに変えたい、あるいは元の OID もテーブルと一緒にコピーしたいのなら、でき -なくはありません。 +PostgreSQL はテーブル間のロウを結びつけるために、そのシステムテーブル内に OID +を使います。この OID は特定のユーザのロウを識別するためや結合の中で使われること +ができます。OID の値を保存するためには OID 型をカラムに使うことを奨めます。より +速くアクセスするために OID フィールドにインデックスを作ることができます。 OID +は、全てのデータベースで使われる中央領域から、全ての新しいロウに割り当てられま +す。OID を他の何かに変えたい、あるいは元の OID もテーブルと一緒にコピーしたいの +なら、できなくはありません。 CREATE TABLE new (old_oid oid, mycol int); SELECT old_oid, mycol INTO new FROM old; COPY new TO '/tmp/pgtable'; @@ -1104,9 +1111,9 @@ OID う。誰もこれが起きたと報告してくる人はいませんでしたが、そうなる前にこの制限を 取り除くことを計画しています。 -TID は特定の物理行をそのブロックとオフセット値で識別するために使われます。TID -は行が修正されたり再ロードされると変わります。それらの TID は、物理行を指すため -にインデックス記載で使われます。 +TID は特定の物理ロウをそのブロックとオフセット値で識別するために使われます。TID +はロウが修正されたり再ロードされると変わります。それらの TID は、物理ロウを指す +ためにインデックス記載で使われます。 4.17) PostgreSQL で使われるいくつかの用語の意味は何ですか? @@ -1115,8 +1122,8 @@ TID ・ テーブル(table)、関係(relation)、クラス(class) - ・ 行(row)、レコード(record)、タップル(tuple) - ・ 列(column)、フィールド(field)、属性(attribute) + ・ ロウ(row)、レコード(record)、タップル(tuple) + ・ カラム(column)、フィールド(field)、属性(attribute) ・ 取得(retrieve)、選択(select) ・ 置換(replace)、更新(update) ・ 追加(append)、挿入(insert) @@ -1157,23 +1164,23 @@ psql 現在は、PostgreSQLのトランザクションのコミット時にラージ・オブジェクト・ハンド ルを閉じることにより、lo_openコマンドが完了した直後に強制的にルールを実行します 。このため、最初にハンドルに対して何かをしようとすると、invalid large obj -descriptor(ラージオブジェクトの記述子が不正)となります。それで、もし、トランザ -クションを使うのを忘れると、(少なくともほとんどの時間)働いていたコードがエラ -ーメッセージを出すのです。 +descriptor(ラージ・オブジェクトの記述子が不正)となります。それで、もし、トラン +ザクションを使うのを忘れると、(少なくともほとんどの時間)働いていたコードがエ +ラーメッセージを出すのです。 もし、ODBCのようなクライアントインターフェースをお使いなら、auto-commit offを設 定する必要があるかもしれません。 -4.21) 現在の時刻がデフォルトとなるような列はどのようにつくりますか? +4.21) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか? CURRENT_TIMESTAMPを使います: CREATE TABLE test (x int, modtime timestamp DEFAULT >CURRENT_TIMESTAMP ); 4.22) なぜ、INを使う副問い合わせがとても遅いのですか? -現在、外部問い合わせの各行について副問い合わせの結果を順番にスキャンすることに -より、副問い合わせを外部問い合わせに結合しています。当面はINをEXISTSで置き換え -ることです: +現在、外部問い合わせの各ロウについて副問い合わせの結果を順番にスキャンすること +により、副問い合わせを外部問い合わせに結合しています。当面はINをEXISTSで置き換 +えることです: SELECT * FROM tab WHERE col1 IN (SELECT col2 FROM TAB2) @@ -1193,12 +1200,12 @@ SELECT * SELECT * FROM t1 LEFT OUTER JOIN t2 USING (col); これらの象徴的な問い合わせでは t1.col を t2.col と結合して、t1 の結合されなかっ -た行(t2 と一致しなかった行)も返しています。RIGHT 結合は t2 の結合されなかった行 -を加えるでしょう。FULL 結合は、一致した行に t1 と t2 からは結合されなかった行を -返すでしょう。OUTER という言葉はオプションで LEFT, RIGHT, または FULL などの結 -合を仮定されています。以前のリリースでは外部結合(outer join)をUNION と NOT IN -を使ってシミュレートできます。たとえば、tab1 と tab2 を結合するときは、次の問い -合わせで二つのテーブルを外部結合します。 +たロウ(t2 と一致しなかったロウ)も返しています。RIGHT 結合は t2 の結合されなかっ +たロウを加えるでしょう。FULL 結合は、一致したロウに t1 と t2 からは結合されなか +ったロウを返すでしょう。OUTER という言葉はオプションで LEFT, RIGHT, または FULL +などの結合を仮定されています。以前のリリースでは外部結合(outer join)をUNION と +NOT IN を使ってシミュレートできます。たとえば、tab1 と tab2 を結合するときは、 +次の問い合わせで二つのテーブルを外部結合します。 SELECT tab1.col1, tab2.col2 FROM tab1, tab2 WHERE tab1.col1 = tab2.col1 @@ -1218,6 +1225,12 @@ PostgreSQL もちろん、クライアントは同時に異なる複数のデータベースへ接続してそこにある情報 をマージすることはできます。 +4.25) 関数で複数のロウまたはカラムを返すにはどうしますか? + +もし、PL/pgSQL 関数でrefcursorsを使うと結果の組を返すことができます。 http:// +developer.postgresql.org/docs/postgres/plpgsql-cursors.html の 23.7.3.3 節をご +覧下さい。 + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PostgreSQLの拡張についての質問 @@ -1250,7 +1263,7 @@ PostgreSQL [訳注: 日本語版の製作については以下の通りです。 - 最終更新日: 2002年04月05日 + 最終更新日: 2002年05月08日 翻訳者: 桑村 潤 (Jun Kuwamura <juk@postgresql.jp>) このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます): diff --git a/doc/src/FAQ/FAQ_japanese.html b/doc/src/FAQ/FAQ_japanese.html index fb5a4ee38928f1d0ee0c4e5cd043e28d7a0c19c8..644995069ac7a8e219b05664e826259a6d19854d 100644 --- a/doc/src/FAQ/FAQ_japanese.html +++ b/doc/src/FAQ/FAQ_japanese.html @@ -7,7 +7,7 @@ <H1> PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)</H1> <P> -原文最終更新日: Mon Mar 18 14:34:57 EST 2002 +原文最終更新日: Fri Apr 26 23:03:46 EDT 2002 <P> 現在の維持管理者: Bruce Momjian (<A HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR> @@ -94,12 +94,12 @@ http://www.PostgreSQL.org/docs/faq-english.html</A> <H2><CENTER>操作上の質問</CENTER></H2> <A HREF="#4.1">4.1</A>) バイナリ・カーソルと通常カーソルとの違いは何ですか?<BR> -<A HREF="#4.2">4.2</A>) 最初の数行のみを <small>select</small> するにはどうしますか?<BR> +<A HREF="#4.2">4.2</A>) 最初の数ロウのみを <small>select</small> するにはどうしますか?<BR> <A HREF="#4.3">4.3</A>) テーブルやその他の情報のリストを <I>psql</I> で見るにはどうしますか?<BR> -<A HREF="#4.4">4.4</A>) テーブルから列の削除はどのようにしますか?<BR> -<A HREF="#4.5">4.5</A>) 行、テーブル、データベースの最大サイズは?<BR> +<A HREF="#4.4">4.4</A>) テーブルからカラムの削除はどのようにしますか?<BR> +<A HREF="#4.5">4.5</A>) ロウ、テーブル、データベースの最大サイズは?<BR> <A HREF="#4.6">4.6</A>) 一般的なテキストファイルからデータを保存するには、データベースのディスク容量はどのくらい必要ですか?<BR> -<A HREF="#4.7">4.7</A>) データベース内に定義されたテーブルやインデックスをどのようにして見つけ出しますか?<BR> +<A HREF="#4.7">4.7</A>) 定義されたテーブル、インデックス、データベース、および、ユーザをどのようにして見つけ出しますか?<BR> <A HREF="#4.8">4.8</A>) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか?<BR> <A HREF="#4.9">4.9</A>) 問い合わせオブティマイザがどのように問い合わせを評価するかを見るにはどうしますか?<BR> <A HREF="#4.10">4.10</A>) R-tree インデックスとは何ですか?<BR> @@ -116,11 +116,11 @@ http://www.PostgreSQL.org/docs/faq-english.html</A> <A HREF="#4.18">4.18</A>) エラーメッセージ <I>"ERROR: Memory exhausted in AllocSetAlloc()"</I>が出るのはなぜですか?<BR> <A HREF="#4.19">4.19</A>) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうしますか?<BR> <A HREF="#4.20">4.20</A>) ラージオブジェクトの操作で、<I>invalid large obj descriptor</I>と出るのはなぜですか?<BR> -<A HREF="#4.21">4.21</A>) 現在の時刻がデフォルトとなるような列はどのようにつくりますか?<BR> +<A HREF="#4.21">4.21</A>) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか?<BR> <A HREF="#4.22">4.22</A>) なぜ、<small>IN</small>を使う副問い合わせがとても遅いのですか?<BR> <A HREF="#4.23">4.23</A>) <i>外部</i>結合(<i>outer</i> join)はどのように実現しますか?<BR> -<A HREF="#4.24">4.24</A>) 複数のデータベースを使う問い合わせはどのようにすればできますか? - +<A HREF="#4.24">4.24</A>) 複数のデータベースを使う問い合わせはどのようにすればできますか?<br> +<A HREF="#4.25">4.25</A>) 関数で複数のロウまたはカラムを返すにはどうしますか?<br> <H2><CENTER>PostgreSQLの拡張についての質問</CENTER></H2> @@ -814,7 +814,7 @@ PostgreSQL Administrator's Gide <P> postgreSQL プログラムには、デバグと性能測定にとても役に立つ <I>-s</I>や <I>-A</I>や <I>-t</I> 等のオプションがあります。 -<P> 何という関数がどのくらい実行時間を食っているかを見るために、プロファイリング(プロフィール付き)でコンパイルすることも可能です。そのバックエンドのプロフィール・ファイルは <I>pgsql/data/base/dbname</I> ディレクトリに格納されるでしょう。クライアントのプロフィールはクライアントの現行ディレクトリに置かれるでしょう。 +<P> 何という関数がどのくらい実行時間を食っているかを見るために、プロファイリング(プロフィール付き)でコンパイルすることも可能です。そのバックエンドのプロフィール・ファイルは <I>pgsql/data/base/dbname</I> ディレクトリに格納されるでしょう。クライアントのプロフィールはクライアントの現行ディレクトリに置かれるでしょう。Linux でまともなプロファイリングを行うには <I>-DLINUX_PROFILE</I> でコンパイルする必要があります。 <P> @@ -872,13 +872,13 @@ PostgreSQL <P> 詳述は、オンラインマニュアルで <small>DECLARE</small> を見て下さい。 <P> -<H4><A NAME="4.2">4.2</A>) 最初の数行のみを <small>SELECT</small> するにはどうしますか? +<H4><A NAME="4.2">4.2</A>) 最初の数ロウのみを <small>SELECT</small> するにはどうしますか? </H4> <P> オンラインマニュアルで<small>FETCH</small>を見てください。あるいは、SELECT ... LIMIT....を使ってみて下さい。 -<P>たとえ、欲しいのは最初の数行だけでも、すべての問い合わせを評価しなくてはならないかもしれません。<small>ORDER BY</small> を持った問い合わせを考えてみて下さい。 -もし、<small>ORDER BY</small>に合ったインデックスがあるとすると PostgreSQLは要求された最初の数行だけで評価できるかもしれませんが、でなれば、PostgreSQL は意図した行が生成されるまですべての行を評価しなければならないかもしれません。 +<P>たとえ、欲しいのは最初の数ロウだけでも、すべての問い合わせを評価しなくてはならないかもしれません。<small>ORDER BY</small> を持った問い合わせを考えてみて下さい。 +もし、<small>ORDER BY</small>に合ったインデックスがあるとすると PostgreSQLは要求された最初の数ロウだけで評価できるかもしれませんが、でなれば、PostgreSQL は意図したロウが生成されるまですべてのロウを評価しなければならないかもしれません。 <P> <H4><A NAME="4.3">4.3</A>) テーブルやその他の情報のリストを <I>psql</I> で見るにはどうしますか? @@ -890,31 +890,34 @@ PostgreSQL <P> -<H4><A NAME="4.4">4.4</A>) テーブルから列の削除はどのようにしますか? +<H4><A NAME="4.4">4.4</A>) テーブルからカラムの削除はどのようにしますか? </H4> <P> <small>ALTER TABLE DROP COLUMN</small> はサポートしていませんが、その代わりにこうします: <PRE> - SELECT ... -- 削除したい列以外の列をすべて選択します。 + BEGIN; + LOCK TABLE old_table; + SELECT ... -- 削除したいカラム以外のカラムをすべて選択します。 INTO TABLE new_table FROM old_table; DROP TABLE old_table; ALTER TABLE new_table RENAME TO old_table; + COMMIT; </PRE> -[訳注:列の追加は ALTER TABLE ADD COLUMN で行えます。] +[訳注:カラムの追加は ALTER TABLE ADD COLUMN で行えます。] <P> -<H4><A NAME="4.5">4.5</A>) 行、テーブル、データベースの最大サイズは? +<H4><A NAME="4.5">4.5</A>) ロウ、テーブル、データベースの最大サイズは? </H4> <P> 制限は以下のとおりです。 <PRE> データベースの最大サイズ? 制限無し (500GB のデータベースも存在します) テーブルの最大サイズ? 16TB -行の最大サイズ? 7.1以降で制限無し +ロウの最大サイズ? 7.1以降で制限無し フィールドの最大サイズ? 7.1以降で1GB テーブル内での最大ロウ数? 制限無し テーブル内での最大カラム数? カラムの型により250-1600 @@ -940,7 +943,7 @@ PostgreSQL ファイルの大きさは次のように約6.4MBと見積もることができます: <PRE> - 36 bytes: 各行のヘッダ(概算) + 36 bytes: 各ロウのヘッダ(概算) 24 bytes: 整数(int)フィールドとテキスト(text)フィールド + 4 bytes: ページ上のタップルへのポインタ ---------------------------------------- @@ -963,18 +966,18 @@ PostgreSQL インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされるデータを含む以上、それなりに大きくなります。 <P> -<H4><A NAME="4.7">4.7</A>) データベース内に定義されたテーブルやインデックスをどのようにして見つけ出しますか? +<H4><A NAME="4.7">4.7</A>) 定義されたテーブル、インデックス、データベース、および、ユーザをどのようにして見つけ出しますか? </H4> <P> <I>psql</I> にはいろいろなバックスラッシュ・コマンドがあり、こうした情報を表示します。バックスラッシュ・コマンドの種類を見るには \? を使って下さい。 -<P> また、<I>pgsql/src/tutorial/syscat.source</I> ファイルを走らせてみて下さい。それは、沢山の <small>SELECT</small> 文により必要な情報をデータベースのシステム・テーブルから取り出して例示してくれます。 +<P> また、<I>pgsql/src/tutorial/syscat.source</I> ファイルを走らせてみて下さい。それは、沢山の <small>SELECT</small> 文により必要な情報をデータベースのシステム・テーブルから取り出して例示してくれます。また、<i>pg_</i> で始まるシステムテーブルにも記述されています。さらに、<i>psql -l</i> はすべてのデータベースをリスト表示します。 <P> <H4><A NAME="4.8">4.8</A>) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか? </H4> インデックスは自動的にすべての問い合わせで使われるわけではありません。テー -ブルが最小サイズより大きく、問い合わせでそのわずかなパーセンテージの行を +ブルが最小サイズより大きく、問い合わせでそのわずかなパーセンテージのロウを 選択する時だけ、インデックスは使われます。これはインデックススキャンによ り起こされるランダムなディスクアクセスは、テーブルをストレートに読む順次 走査よりも遅くなることがときどきあるからです。 @@ -982,7 +985,7 @@ PostgreSQL <P>インデックスを使うかを決定するために、PostgreSQL はテーブルについ ての統計情報を持たなければなりません。この統計情報は、<SMALL>VACUUM ANALYZE</SMALL>または、単に <SMALL>ANALYZE</SMALL> を使って収集すること -ができます。統計情報を使ってオブティマイザはテーブルの中に何行あるかを知 +ができます。統計情報を使ってオブティマイザはテーブルの中にあるロウ数を知 り、インデックスを使うべきかのの決定をより正しくできます。統計情報は最適 な結合順や結合方法を決める上でも貴重なものもあります。統計情報の収集は、 テーブルの内容がかわると毎に繰返しなされるべきです。</P> @@ -1099,14 +1102,14 @@ Type Internal Name Notes "char" char 1 character CHAR(#) bpchar 指定された固定長となるように空白が詰められる VARCHAR(#) varchar 長さの上限の無いテキスト -TEXT text 長さの制限は最大行長による +TEXT text 長さの制限は最大ロウ長による BYTEA bytea 可変長のバイト配列(null-byte safe) </PRE> <P> 内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージを受け取るときです。 -<P> 上記の型のうち後の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バイトがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は宣言された大きさよりも少し大きくなります。しかし、これらのデータ型は<small>TOAST</small>により圧縮されたり複数行に渡って保存されたりして、ディスク上の空間は思ったより小さくなります。 +<P> 上記の型のうち後の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バイトがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は宣言された大きさよりも少し大きくなります。しかし、これらのデータ型は<small>TOAST</small>により圧縮されたり複数ロウに渡って保存されたりして、ディスク上の空間は思ったより小さくなります。 <P><SMALL>CHAR()</SMALL>はいつも長さが同じ文字列を保存するのに最適で す。<SMALL>VARCHAR()</SMALL> は可変長の文字列を保存するのに最適ですが、 @@ -1120,7 +1123,7 @@ BYTEA bytea <H4><A NAME="4.15.1">4.15.1</A>) 通番(serial)/自動増分フィールドはどのようにつくりますか? </H4> -<P> PostgreSQL は <small>SERIAL</small> データ型をサポートします。列上に通番とインデックスを自動作成します。たとえば、 +<P> PostgreSQL は <small>SERIAL</small> データ型をサポートします。カラム上に通番とインデックスを自動作成します。たとえば、 <PRE> CREATE TABLE person ( @@ -1138,7 +1141,7 @@ BYTEA bytea CREATE UNIQUE INDEX person_id_key ON person ( id ); </PRE> 通番についてのもっと詳しい情報は、オンラインマニュアルで <I>create_sequence</I> をご覧下さい。 -<P> また、各行の<I>OID</I>フィールドを一意値として使うこともできます。しかしながら、もしもデータベースをダンプしてりロードする必要がある場合は、<small>OID</small>を温存するために<I>pg_dump</I> で <I>-o</I>オプションを使うか、または、<small>COPY WITH OIDS</I>オプションを使う必要があります。 +<P> また、各ロウの<I>OID</I>フィールドを一意値として使うこともできます。しかしながら、もしもデータベースをダンプしてりロードする必要がある場合は、<small>OID</small>を温存するために<I>pg_dump</I> で <I>-o</I>オプションを使うか、または、<small>COPY WITH OIDS</I>オプションを使う必要があります。 Bruce Momjian の<A HREF="http://www.PostgreSQL.org/docs/aw_pgsql_book">(http://www.PostgreSQL.org/docs/aw_pgsql_book)の Numbering Rows</A>の章にありあます。 @@ -1155,7 +1158,7 @@ HREF="#4.16.1">4.16.1</A> INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal'); </PRE> -そうして、<tt>new_id</tt> に保存した新しい値を他の問い合わせに(たとえば、<tt>person</tt> テーブルに対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作られた<small>SEQUENCE</small>オブジェクトの名前は、<<I>table</I>>_<<I>serialcolumn</I>>_<I>seq</I> のようになり、このうち、<I>table</I> と <I>serialcolumn</I> はそれぞれテーブルの名前と<small>SERIAL</small>列の名前です。 +そうして、<tt>new_id</tt> に保存した新しい値を他の問い合わせに(たとえば、<tt>person</tt> テーブルに対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作られた<small>SEQUENCE</small>オブジェクトの名前は、<<I>table</I>>_<<I>serialcolumn</I>>_<I>seq</I> のようになり、このうち、<I>table</I> と <I>serialcolumn</I> はそれぞれテーブルの名前と<small>SERIAL</small>カラムの名前です。 <P> あるいは、与えられた<small>SERIAL</small>値を、それが既定値として挿入された<I>後で(after)</I>、 <I>currval</I>() 関数を使って取り出すこともできます。たとえば、 @@ -1188,12 +1191,12 @@ HREF="#4.16.1">4.16.1</A> <H4><A NAME="4.16">4.16</A>) <small>OID</small> とは何ですか? <small>TID</small> とは何ですか? </H4> -<P> <small>OID</small> とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくられるすべての行は一意の <small>OID</small> を得ます。<I>initdb</I> で発生される <small>OID</small> はすべて 16384 (<I>backend/access/transam.h</I> から)より小さな値です。<I>initdb</I> 後のすべての <small>OID</small> (ユーザ作成)はそれ以上の値になります。 +<P> <small>OID</small> とは一意のロウID に対する PostgreSQL の答えです。PostgreSQL の中でつくられるすべてのロウは一意の <small>OID</small> を得ます。<I>initdb</I> で発生される <small>OID</small> はすべて 16384 (<I>backend/access/transam.h</I> から)より小さな値です。<I>initdb</I> 後のすべての <small>OID</small> (ユーザ作成)はそれ以上の値になります。 既定では、これらすべての <small>OID</small>は一つのデーブルやデータベース内に留まらず、PostgreSQL インストレーション全体の中で一意です。 -<P> PostgreSQL はテーブル間の行を結びつけるために、そのシステムテーブル内に <small>OID</small> を使います。この <small>OID</small> は特定のユーザの行を識別するためや結合の中で使われることができます。<small>OID</small> の値を保存するためには <I>OID</I> 型を列に使うことを奨めます。より速くアクセスするために <I>OID</I> フィールドにインデックスを作ることができます。 +<P> PostgreSQL はテーブル間のロウを結びつけるために、そのシステムテーブル内に <small>OID</small> を使います。この <small>OID</small> は特定のユーザのロウを識別するためや結合の中で使われることができます。<small>OID</small> の値を保存するためには <I>OID</I> 型をカラムに使うことを奨めます。より速くアクセスするために <I>OID</I> フィールドにインデックスを作ることができます。 - O<small>ID</small> は、全てのデータベースで使われる中央領域から、全ての新しい行に割り当てられます。<small>OID</small> を他の何かに変えたい、あるいは元の <small>OID</small> もテーブルと一緒にコピーしたいのなら、できなくはありません。 + O<small>ID</small> は、全てのデータベースで使われる中央領域から、全ての新しいロウに割り当てられます。<small>OID</small> を他の何かに変えたい、あるいは元の <small>OID</small> もテーブルと一緒にコピーしたいのなら、できなくはありません。 <PRE> @@ -1210,7 +1213,7 @@ HREF="#4.16.1">4.16.1</A> <P> O<small>ID</small> は、4バイトの整数として保存されているので、40億を越えると溢れてしまうでしょう。誰もこれが起きたと報告してくる人はいませんでしたが、そうなる前にこの制限を取り除くことを計画しています。 -<P> T<small>ID</small> は特定の物理行をそのブロックとオフセット値で識別するために使われます。<small>TID</small> は行が修正されたり再ロードされると変わります。それらの <small>TID</small> は、物理行を指すためにインデックス記載で使われます。 +<P> T<small>ID</small> は特定の物理ロウをそのブロックとオフセット値で識別するために使われます。<small>TID</small> はロウが修正されたり再ロードされると変わります。それらの <small>TID</small> は、物理ロウを指すためにインデックス記載で使われます。 <P> <H4><A NAME="4.17">4.17</A>) PostgreSQL で使われるいくつかの用語の意味は何ですか? @@ -1220,8 +1223,8 @@ HREF="#4.16.1">4.16.1</A> <UL> <LI> テーブル(table)、関係(relation)、クラス(class) -<LI> 行(row)、レコード(record)、タップル(tuple) -<LI> 列(column)、フィールド(field)、属性(attribute) +<LI> ロウ(row)、レコード(record)、タップル(tuple) +<LI> カラム(column)、フィールド(field)、属性(attribute) <LI> 取得(retrieve)、選択(select) <LI> 置換(replace)、更新(update) <LI> 追加(append)、挿入(insert) @@ -1263,13 +1266,13 @@ http://www.comptechnews.com/~reaster/dbdesign.html</a> <P>ラージ・オブジェクト操作をするときは、前後に<tt>BEGIN WORK</tt>と<tt>COMMIT</tt>を付ける必要があります。すなわち、<tt>lo_open</tt> ... <tt>lo_close</tt>をはさみ込みます。 -<P>現在は、PostgreSQLのトランザクションのコミット時にラージ・オブジェクト・ハンドルを閉じることにより、<I>lo_open</I>コマンドが完了した直後に強制的にルールを実行します。このため、最初にハンドルに対して何かをしようとすると、<I>invalid large obj descriptor(ラージオブジェクトの記述子が不正)</I>となります。それで、もし、トランザクションを使うのを忘れると、(少なくともほとんどの時間)働いていたコードがエラーメッセージを出すのです。 +<P>現在は、PostgreSQLのトランザクションのコミット時にラージ・オブジェクト・ハンドルを閉じることにより、<I>lo_open</I>コマンドが完了した直後に強制的にルールを実行します。このため、最初にハンドルに対して何かをしようとすると、<I>invalid large obj descriptor(ラージ・オブジェクトの記述子が不正)</I>となります。それで、もし、トランザクションを使うのを忘れると、(少なくともほとんどの時間)働いていたコードがエラーメッセージを出すのです。 <P>もし、<small>ODBC</small>のようなクライアントインターフェースをお使いなら、<tt>auto-commit off</tt>を設定する必要があるかもしれません。 <P> -<H4><A NAME="4.21">4.21</A>) 現在の時刻がデフォルトとなるような列はどのようにつくりますか?<BR></H4> +<H4><A NAME="4.21">4.21</A>) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか?<BR></H4> <P><i>CURRENT_TIMESTAMP</i>を使います: <PRE> @@ -1281,7 +1284,7 @@ http://www.comptechnews.com/~reaster/dbdesign.html</a> <H4><A NAME="4.22">4.22</A>) なぜ、<small>IN</small>を使う副問い合わせがとても遅いのですか? </H4> <P> -現在、外部問い合わせの各行について副問い合わせの結果を順番にスキャンすることにより、副問い合わせを外部問い合わせに結合しています。当面は<small>IN</small>を<small>EXIST</small>Sで置き換えることです: +現在、外部問い合わせの各ロウについて副問い合わせの結果を順番にスキャンすることにより、副問い合わせを外部問い合わせに結合しています。当面は<small>IN</small>を<small>EXIST</small>Sで置き換えることです: <PRE> <STRONG>SELECT *</STRONG> FROM tab @@ -1309,7 +1312,7 @@ PostgreSQL 7.1 <STRONG>SELECT *</STRONG> FROM t1 LEFT OUTER JOIN t2 USING (col);</pre> -これらの象徴的な問い合わせでは t1.col を t2.col と結合して、t1 の結合されなかった行(t2 と一致しなかった行)も返しています。<small>RIGHT</small> 結合は t2 の結合されなかった行を加えるでしょう。<small>FULL</small> 結合は、一致した行に t1 と t2 からは結合されなかった行を返すでしょう。<small>OUTER</small> という言葉はオプションで <small>LEFT</small>, <small>RIGHT</small>, または <small>FULL</small> などの結合を仮定されています。 +これらの象徴的な問い合わせでは t1.col を t2.col と結合して、t1 の結合されなかったロウ(t2 と一致しなかったロウ)も返しています。<small>RIGHT</small> 結合は t2 の結合されなかったロウを加えるでしょう。<small>FULL</small> 結合は、一致したロウに t1 と t2 からは結合されなかったロウを返すでしょう。<small>OUTER</small> という言葉はオプションで <small>LEFT</small>, <small>RIGHT</small>, または <small>FULL</small> などの結合を仮定されています。 以前のリリースでは外部結合(outer join)を<small>UNION</small> と <small>NOT IN</small> を使ってシミュレートできます。 たとえば、<i>tab1</i> と <i>tab2</i> を結合するときは、次の問い合わせで二つのテーブルを<i>外部</i>結合します。 @@ -1333,6 +1336,15 @@ PostgreSQL 7.1 <P> もちろん、クライアントは同時に異なる複数のデータベースへ接続してそこにある情報をマージすることはできます。 +<P> +<H4><A NAME="4.25">4.25</A>) 関数で複数のロウまたはカラムを返すにはどうしますか?<BR></H4> + + <P>もし、PL/pgSQL 関数で<i>refcursors</i>を使うと結果の組を返すことができます。<a +href="http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html"> +http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html</a> の +23.7.3.3 節をご覧下さい。</P> + + <P> <HR> <H2><CENTER>PostgreSQLの拡張についての質問</CENTER></H2> @@ -1368,7 +1380,7 @@ PostgreSQL 7.1 [訳注: 日本語版の製作については以下の通りです。 - 最終更新日: 2002年04月05日 + 最終更新日: 2002年05月08日 翻訳者: 桑村 潤 (<A HREF="mailto:juk@postgresql.jp">Jun Kuwamura <juk@postgresql.jp></A>) このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):