Update Japanese FAQ, from Jun Kuwamura

This commit is contained in:
Bruce Momjian 2002-06-04 05:12:21 +00:00
parent 31cd5355ee
commit 448ca1fe0b
2 changed files with 128 additions and 103 deletions

View File

@ -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の和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):

View File

@ -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>オブジェクトの名前は、&lt;<I>table</I>&gt;_&lt;<I>serialcolumn</I>&gt;_<I>seq</I> のようになり、このうち、<I>table</I><I>serialcolumn</I> はそれぞれテーブルの名前と<small>SERIAL</small>の名前です。
そうして、<tt>new_id</tt> に保存した新しい値を他の問い合わせに(たとえば、<tt>person</tt> テーブルに対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作られた<small>SEQUENCE</small>オブジェクトの名前は、&lt;<I>table</I>&gt;_&lt;<I>serialcolumn</I>&gt;_<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 &lt;juk@postgresql.jp&gt;</A>)
このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):