
このリリースは PostgreSQL 8.1 (2005/11/08リリース)に関する技術情報をお届けします。本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
- 共有バッファキャッシュへの同時アクセスの改良(Tom)
-
共有バッファキャッシュへのアクセスが、特に、マルチCPUシステムにおいて深刻なスケーラビリティ問題であることは分かっていました。本リリースでは、バッファマネージャ内で行われていたロックの方法を見直し、ロックの競合を軽減し、スケーラビリティを向上しました。また、バッファマネージャは”clock sweep”置換ポリシーを使用するように変更されました。
CPU数4個のマシンで同時接続数10以上のとき40%程度の性能アップが測定されています。
- インデックススキャンが中間でメモリ内ビットマップを使用することができるようになりました。
-
過去のリリースでは、テーブル検索の実行において単一インデックスのみを使用することができました。この機能により、WHERE tab.col1 = 4 and tab.col2 = 9を持つ問い合わせで、col1とcol2に対する複数列インデックスが存在しない場合、col1に対するインデックスとcol2に対するインデックスがあれば、両方のインデックスを検索し、結果をメモリ内で組み合わせ、col1とcol2に関する両方の制約に一致する行のみをヒープから取り出すことができるようになります。これは、問い合わせが構造化されておらず、すべての起こり得るアクセス条件に一致するインデックスを前もって作成できないような状況では、非常に有用です。必要なランダムアクセスの総数を減少させるため、ビットマップスキャンは単一のインデックスの場合でも有用です。ビットマップインデックススキャンはテーブル全体で多くの割合を占める部分を取り出す際に効率的です。この場合、通常のインデックススキャンでは非効率的です。
以下に例を示します。BitmapAnd、BitmapOr、Bitmap Heap Scan などの新しいクエリオペレータが使われます。
CREATE TABLE enquate (uid int, q1 int, q2 int, q3 int, q4 int, q5 int, value char(60)); INSERT INTO enquate SELECT i, (random()*2)::int, (random()*2)::int, (random()*2)::int, (random()*2)::int, (random()*2)::int FROM generate_series(1, 100000) AS i; CREATE INDEX iq1 ON enquate (q1); CREATE INDEX iq2 ON enquate (q2); CREATE INDEX iq3 ON enquate (q3); => EXPLAIN SELECT * FROM enquate WHERE q1 = 0 AND q2 = 0 AND q3 = 0; QUERY PLAN ------------------------------------------------------------------------------ Bitmap Heap Scan on enquate (cost=280.82..1365.68 rows=1519 width=228) Recheck Cond: ((q1 = 0) AND (q2 = 0)) Filter: (q3 = 0) -> BitmapAnd (cost=280.82..280.82 rows=5935 width=0) -> Bitmap Index Scan on iq1 (cost=0.00..137.65 rows=23900 width=0) Index Cond: (q1 = 0) -> Bitmap Index Scan on iq2 (cost=0.00..142.92 rows=24833 width=0) Index Cond: (q2 = 0)
- ニ相コミットの追加(Heikki Linnakangas, Alvaro, Tom)
-
二相コミットを使用して、トランザクションを複数のコンピュータで”準備”することができます。すべてのコンピュータでトランザクションの準備を(失敗することなく)行った後、すべてのトランザクションをコミットすることができます。準備した後でマシンがクラッシュしたとしても、マシンの再起動後に準備したトランザクションをコミットすることができます。PREPARE TRANSACTIONおよびCOMMIT/ROLLBACK PREPAREDという新しい構文があります。また、新しいpg_prepared_xactsシステムビューも追加されました。
一つのクライアントアプリケーションの実行コンテキストから複数のデータベースサーバに「一貫性を維持した」アクセスをしたいときに用いられます。準備されたトランザクションの識別名は定数文字列でないといけません。複数のクライアントから同時アクセスをする場合には識別名が重ならないように工夫が必要です。
=> BEGIN; BEGIN => INSERT INTO booking (bdate, bname) VALUES (CURRENT_DATE, 'Yamada'); INSERT 0 1 => PREPARE TRANSACTION 'x01-20051108-001'; PREPARE TRANSACTION (ここでトランザクションの外に出る、以下は別セッションでもよい) => SELECT * FROM pg_prepared_xacts; transaction | gid | prepared | owner | database -------------+------------------+-------------------------------+-------+---------- 1007867 | x01-20051108-001 | 2005-12-07 15:35:50.208045+09 | oss | oss (1 row) => COMMIT PREPARED 'x01-20051108-001'; COMMIT PREPARED
- ユーザとグループを置き換える、新しいロールシステムの作成(Stephen Frost)
-
ロールとは、ユーザとグループを組み合わせたものです。ユーザのようにロールはログイン機能を持つことができますし、グループのようにロールは他のロールをメンバとして持つこともできます。基本的にロールは、ユーザとグループの区別を取り除きました。例えば、ロールは以下のことを行うことができます。
-
ログイン機能を有す(省略可能)
-
オブジェクトを所有する
-
データベースオブジェクトに対するアクセス権限を保持する
-
属している他のロールの権限を継承する
ユーザがあるロールにログインした後、そのユーザはログインロールの能力の他、継承したロールの能力も持つことになります。また、SET ROLEを使用して、属している他のロールに変わることもできます。この機能は、標準SQLのロールの概念を汎用化したものです。またこの変更により、pg_shadowとpg_groupは、新しいロール機能の付いたカタログpg_authidとpg_auth_membersに置き換わりました。古いテーブルは、新しいロールテーブルに対する読み取りのみのビューとして再定義されています。
CREATE USER や CREATE GROUP などユーザ・グループの概念による旧来のコマンドはCREATE ROLEコマンドの別名という扱いになっています。表面的には互換性を保つように作られていますが、互換性目的のオプションは将来的には廃止が予定されています。また、ロールの導入に伴い「ユーザ(ロール)追加権限」と「管理者権限」が分離されました。管理者権限は持たないがロールの追加はできるロールを作ることができます。
-
- MIN() とMAX()におけるインデックスの自動使用 (Tom)
-
過去のリリースでは、MIN()またはMAX()でインデックスを使用する方法は、問い合わせをSELECT col FROM tab ORDER BY col に書き換える方法しかありませんでした。インデックスが自動的に使用されるようになりました。
例を示します。
=> EXPLAIN SELECT max(uid) FROM enquate; QUERY PLAN -------------------------------------------------------------------------------------------------------- Result (cost=0.02..0.03 rows=1 width=0) InitPlan -> Limit (cost=0.00..0.02 rows=1 width=4) -> Index Scan Backward using enquate_pkey on enquate (cost=0.00..2302.00 rows=100000 width=4) Filter: (uid IS NOT NULL) (5 rows)
8.0.x 以前ではインデックスが在っても以下のような「シーケンシャルスキャン+集約」になります。
QUERY PLAN --------------------------------------------------------------------- Aggregate (cost=2231.00..2231.01 rows=1 width=4) -> Seq Scan on enquate (cost=0.00..1981.00 rows=100000 width=4) (2 rows)
- /contrib/pg_autovacuumを主サーバに移動しました。(Alvaro)
-
autovacuumをサーバに統合することで、データベースサーバと同期して自動的にautovacuumが起動、停止できるようになりました。また、postgresql.confでautovacuumの設定を行うことができるようになりました。
autovacuum(自動バキューム)を利用するには行レベルアクセス統計情報が必要です。これは行の更新量を見てVACUUMする頃合いを決めるという仕組みになっているためです。行レベルの統計情報収集を行う(stats_start_collectorとstats_row_levelをtrueにする)場合、10%程度の性能低下があります。autovacuum利用には性能面でトレードオフがあります。
- SELECT ... FOR SHAREを使用した共有行レベルロックの追加(Alvaro)
-
PostgreSQLのMVCCロックによりSELECTは書き込みによってブロックされることはありません。そのため、通常の操作では共有行レベルロックは不要ですが、共有行ロックを必要とするアプリケーションでは共有ロックは有用です。特に、これにより参照整合性検査で発生するロック要求が減少します。
共有ロックとは、排他ロック(更新、削除、FOR UPDATE)をブロックする/される一方、共有ロック同士では互いにブロックしないというものです。
- 共有オブジェクト、特にロールへの依存性を追加(Alvaro)
-
依存性機構の拡張により、データベースオブジェクトを所有するロールが削除されることを防ぎます。これまでは、所有者の削除により“親のいない”オブジェクトができてしまう可能性がありました。これは復旧させることができましたが、厄介で好まれないものでした。
以下、親のいないオブジェクトの例です。
oss=# CREATE USER foo; CREATE USER oss=# c oss foo You are now connected to database "oss" as user "foo". oss=> CREATE TABLE foo (foo int); CREATE TABLE oss=> c oss postgres You are now connected to database "oss" as user "postgres". oss=# DROP USER foo ; -- 8.1ではここでエラーになる DROP USER oss=# d -- 8.0.xでは以下のようなオーナー無し状態が作れてしまう List of relations Schema | Name | Type | Owner --------+------+-------+------- public | foo | table | (1 row)
- テーブルパーティションによる性能向上(Simon)
-
新しいconstraint_exclusion設定パラメータは、子テーブルに一致する行が存在しないことを制約が示している場合、子テーブルの検索を防ぎます。
これにより、テーブルパーティションの基本的な種類を実現できます。子テーブルが別々のキー範囲を格納し、これを適切なCHECK制約で強制している場合、オブティマイザは、この制約により子テーブル内に一致することが内ことが保証されている時にその子テーブルへのアクセスを飛ばします。
以下に例を示します。継承関係にある work と work_old テーブルを親のworkから検索します。このとき constraint_exclusion を true にして(デフォルトはfalse)、stat != ‘fin’ という条件で検索すると、制約から該当行が無いことがわかる work_old は検索されなくなります。
oss=> CREATE TABLE work (id bigint, value text, stat text); CREATE TABLE oss=> CREATE TABLE work_old (CHECK (stat = 'fin')) INHERITS (work); CREATE TABLE oss=> INSERT INTO work SELECT i, 'xxxxx', 'accept' FROM generate_series (1, 10000) AS i; INSERT 0 10000 oss=> INSERT INTO work_old SELECT i, 'xxxxx', 'fin' FROM generate_series (10001, 99999) AS i; INSERT 0 89999 ss=> EXPLAIN SELECT * FROM work WHERE stat != 'fin'; -- 2テーブルを検索 QUERY PLAN ------------------------------------------------------------------------------- Result (cost=0.00..1944.99 rows=10001 width=26) -> Append (cost=0.00..1944.99 rows=10001 width=26) -> Seq Scan on "work" (cost=0.00..199.00 rows=10000 width=26) Filter: (stat <> 'fin'::text) -> Seq Scan on work_old "work" (cost=0.00..1745.99 rows=1 width=23) Filter: (stat <> 'fin'::text) (6 rows) oss=> SET constraint_exclusion TO true; SET oss=> EXPLAIN SELECT * FROM work WHERE stat != 'fin'; -- workのみを検索 QUERY PLAN ------------------------------------------------------------------------- Result (cost=0.00..199.00 rows=10000 width=26) -> Append (cost=0.00..199.00 rows=10000 width=26) -> Seq Scan on "work" (cost=0.00..199.00 rows=10000 width=26) Filter: (stat <> 'fin'::text) (4 rows)
-
add_missing_fromのデフォルトがfalseになりました(Neil)
FROM参照を持たない問い合わせでテーブルが使用された場合、デフォルトでエラーとなるようになりました。
まだ過去の動作を使用することができますが、そのためにはこのパラメータを’true’にしなければなりません。ダンプに暗黙的なFROM構文を使用して作成したビューやルールがある場合、既存のダンプファイルをロードするために、add_missing_fromを真に設定しなければならないかもしれません。
これに悩まされるのは一回だけのはずです。
PostgreSQL 8.1は、こうしたビューやルールを標準の明示的なFROM構文に変換するためです。
したがって、今後のダンプではこの問題は起こりません。ss=> SELECT work.* FROM work w; -- 一見正しそうなこのSQLもエラーになる ERROR: missing FROM-clause entry for table "work" oss=> SET add_missing_from TO true; -- デフォルト値がfalse SET oss=> CREATE VIEW work_v AS SELECT w.* FROM work w ; CREATE VIEW oss=> ¥d work_v VIEWとして読み込ませると定義は自動的に訂正される View "public.work_v" Column | Type | Modifiers --------+--------+----------- id | bigint | value | text | stat | text | View definition: SELECT w.id, w.value, w.stat FROM "work" w;
-
float4/float8/oidに長さが0の文字列('')が入力された場合、ゼロ
として扱わずエラーとなるようになりました(Neil)この変更により、現行の整数に対する長さが0の文字列の扱いと矛盾がなくなりました。
この変更の時期については8.0でアナウンスしていました。(上記の矛盾とは) 8.0.x では int型や bigint型に空文字列 ” を与えるとエラーになる一方、float4、float8、oid型ではゼロとして解釈されていました。
-
default_with_oidsのデフォルトがfalseになりました(Neil)
このオプションをfalseに設定した場合、CREATE TABLEでWITH OIDSを指定しない限り、ユーザが作成したテーブルはOID列を持たなくなります。
すべてのPostgreSQLリリースでOIDは存在していましたが、4バイト長しかなく、インストールされたデータベース全体で共有アクセスされていることから、OIDの利用は制限されてきました。
一意に行を識別するには、シーケンスまたはSERIAL型を使用することを勧めます。
これはPostgreSQL 6.4からサポートされています。 -
float4/float8/oidに長さが0の文字列('')が入力された場合、ゼロとして扱わずエラーとなるようになりました(Neil)
この変更により、現行の整数に対する長さが0の文字列の扱いと矛盾がなくなりました。
この変更の時期については8.0でアナウンスしていました。(上記の矛盾とは) 8.0.x では int型や bigint型に空文字列 ” を与えるとエラーになる一方、float4、float8、oid型ではゼロとして解釈されていました。
-
default_with_oidsのデフォルトがfalseになりました(Neil)
このオプションをfalseに設定した場合、CREATE TABLEでWITH OIDSを指定しない限り、ユーザが作成したテーブルはOID列を持たなくなります。すべてのPostgreSQLリリースでOIDは存在していましたが、4バイト長しかなく、インストールされたデータベース全体で共有アクセスされていることから、OIDの利用は制限されてきました。一意に行を識別するには、シーケンスまたはSERIAL型を使用することを勧めます。これはPostgreSQL 6.4からサポートされています。
-
E''構文が追加されました。そのため、普通の文字列でバックスラッシュ文字を扱うことができます。(Bruce)
現在のPostgreSQLは文字列リテラル内のバックスラッシュを、特別なエスケープシーケンスの始まりとして扱います。例えば、¥nや¥010です。これで簡単に特別な値を埋め込むことができますが、非標準であり、他のデータベースからのアプリケーションの移植を困難にしています。このため、PostgreSQLプロジェクトでは、文字列内のバックスラッシュが特別な意味を持たないようにすることを計画しています。後方互換性と、特別なバックスラッシュ処理を使用したいユーザのために、新しい文字列構文を作成しました。この新しい文字列構文は、例えばE'hi¥n'のように、E、直後に単一引用符、そして文字列を始めるという形です。このリリースでは文字列内のバックスラッシュの扱いに変更はありませんが、今後のリリースに向けたアプリケーションの移行を補助するために、以下の設定パラメータが追加されました。
-
standard_conforming_strings。
このリリースで普通の文字列内のバックスラッシュをそのまま扱うかどうかを指定します。 -
escape_string_warning。
普通の文字列(非E)内でバックスラッシュが存在した場合に警告する。 -
REINDEX DATABASEがデータベース内のすべてのインデックスの再作成を行うようになりました。(Tom)
これまでは、REINDEX DATABASEはシステムテーブルのみのインデックスを再作成しました。この新しい動作の方がより直感的です。新しいREINDEX SYSTEMコマンドが、システムテーブルのみのインデックス再作成という以前の機能を提供します。
-
読みとりのみのラージオブジェクト記述子がMVCCスナップショットセマンティックスに従うようになりました。
ラージオブジェクトがINV_READ (かつINV_WRITEなし)で開かれた場合、その記述子から読みとられるデータが、lo_open()を呼び出した問い合わせで使用するトランザクションスナップショットの時点のラージオブジェクトの状態“スナップショット”を反映するようになりました。常に最新のコミットされたデータを返すという以前の動作に戻すには、lo_open()のモードフラグにINV_WRITEを付与して下さい。
-
シーケンス関数の引数に対して、適切な依存性を追加しました。(Tom)
以前のリリースでは、nextval()、currval()、setval()に渡されるシーケンス名は、単なるテキスト文字列として保持されていました。つまり、DEFAULT句で使用中のシーケンスの名称変更や削除により、DEFAULT句が無効となりました。このリリースでは、すべて新しく作成した、内部用OIDを引数として持つシーケンス関数を保持します。これにより、シーケンス名の変更を追跡できるようになり、また、不適切なシーケンスの削除を防ぐために依存情報も追加されました。また、これにより、スキーマ名称の変更や検索パスの変更から、こうしたDEFAULT句を保護できるようになりました。
currval('seq1') 等の引数'seq1'がtext型でなくregclass型(内部用OID)の表現として扱われるようになっています。
アプリケーションの中には、以前の実行時にシーケンス名を検索する動作に依存しているものがあるかもしれません。
これは、nextval('myseq'::text)のように、明示的に引数をtextにキャストすることで実現することができます。8.1より前のデータベースダンプを8.1にロードした場合、古いテキストを基とした表現が使用されますので、OIDを引数として保持させる機能は持てません。
しかし、テキスト版のDEFAULT句を持つデータベースを更新することができます。
まず、以下の問い合わせをfixseq.sqlなどという名前のファイルに保存してください。SELECT 'ALTER TABLE ' || pg_catalog.quote_ident(n.nspname) || '.' || pg_catalog.quote_ident(c.relname) || ' ALTER COLUMN ' || pg_catalog.quote_ident(a.attname) || ' SET DEFAULT ' || regexp_replace(d.adsrc, $$val¥(¥(('[^']*')::text¥)::regclass$$, $$val¥(¥1$$, 'g') || ';' FROM pg_namespace n, pg_class c, pg_attribute a, pg_attrdef d WHERE n.oid = c.relnamespace AND c.oid = a.attrelid AND a.attrelid = d.adrelid AND a.attnum = d.adnum AND d.adsrc ~ $$val¥(¥('[^']*'::text¥)::regclass$$;
次に、調整が必要であることが分かったデータベースに対してこの問い合わせを実行してください。
以下ではdb1というデータベースに対して実行しています。psql -t -f fixseq.sql db1
これにより、データベースを新しいOID版の表現に変換するためのALTER TABLEコマンドが表示されます。
このコマンドが問題ないことを確認した後に、以下を実行してデータベースを更新してください。psql -t -f fixseq.sql db1 | psql -e db1
この手続きを更新すべきデータベースそれぞれに対して繰り返し実行しなければなりません。
-
psqlにおいて、引用符で括られていない¥{digit}+という並びを8進数として扱うようになりました。(Bruce)
以前のリリースでは、¥{digit}+という並びは10進数として扱われ、¥0{digit}+のみが8進数として扱われました。この変更は一貫性のために行われました。
あくまで psql がリテラルを解釈する場合の話です (¥setコマンドで変数値を設定するときなど) 。
-
%および^演算子の接頭辞と接尾辞の文法積を削除しました。
これは文書化されておらず、また、負値の剰余演算子 (%)の使用を複雑にしていました。
%1.23 → 1 という丸め演算がなくなりました。
-
多角形用の&<と&>をボックス型の”over”演算子と矛盾がないようにしました。(Tom)
判定において端点を含むかどうかの扱いが修正されました。
-
CREATE LANGUAGEは、pg_pltemplateの情報によって指定された引数を無視する可能性があります。(Tom)
新しいpg_pltemplateシステムカタログが、手続き言語の好みの定義(検証関数をもつかどうかなど)についての情報を保持するために定義されました。作成しようとする言語に関する項目がこのカタログに存在する場合、CREATE LANGUAGEは言語名以外のパラメータをすべて無視し、カタログの情報を使用します。古いダンプファイルからロードされる古い言語定義に伴う問題が増大したため、この方式が取られました。
8.1では、ロード時にテンプレート項目が存在することに依存し、pg_dumpは手続き言語定義を単なる CREATE LANGUAGE nameとしてダンプします。
これがより将来を見込んだ表現になることを期待しています。 -
pg_cancel_backend(int)がintegerではなくbooleanを返すようになりました。(Neil)
-
GiSTとR-treeインデックスの性能を向上しました。(Neil)
-
ハッシュ結合の自動サイズ変更を含む、オプティマイザの改良を行いました。
(Tom) -
様々な所で内部用のAPIを見直しました。
-
WALレコードのCRCを64ビットから32ビットに変更しました。(Tom)
64ビットのCRCを計算するコストが過大で、信頼性に関する長所は無視できるものであると考えました。
-
WALページに巨大な空のギャップを書き出さないように変更しました。(Tom)
-
SMPマシン、特にOpteronマシンにおけるスピンロック動作を改良しました。(Tom)
-
連続していないインデックス列を複数列に対するインデックスで試用できるようにしました。(Tom)
例えば、これによりa,b,c列に対するインデックスをWHERE a = 4 and c = 10といった問い合わせで使用することができます。
-
CREATE TABLE AS/SELECT INTOに対するWALロギングを飛ばします。(Simon)
CREATE TABLE AS実行中のクラッシュにより復旧中にテーブルが削除されてしまいますので、そのテーブルをロードするためにWALに記録する意味がありません。(しかし、WALアーカイブが有効な場合はロギングを行います。)
-
GiSTインデックスへの同時アクセスを可能にしました。(Teodor, Oleg)
-
full_page_writes設定パラメータを追加し、WALへページ全体を書き出すかどうか制御できるようになりました。(Bruce)
破損したデータベースから部分的なディスク書き出しを防ぐために、チェックポイントの後に変更されたディスクページを最初に書き出す時に、PostgreSQLは各データベースディスクページ全体のコピーをWALに書き出します。
このオプションにより、この機能を無効にすることができ、より高速になります。
部分的なページ書き出しが起こることがない、バッテリでバックアップされたディスクキャッシュを持つ場合、これは安全です。 -
wal_sync_methodでO_SYNCを使用している場合、利用できるのであればO_DIRECTを使用します。
(Itagaki Takahiro)O_DIRECTによりディスクへの書き出しがカーネルキャッシュを介さずに行われます。
そのため、WALへの書き出しが高速になり、性能が向上します。 -
COPY FROMの性能を向上しました。(Alon Goldshuv)
COPY入力を一文字ずつではなくより巨大なまとまり内に読み込むことで実現しました。
-
COUNT()、SUM、AVG()、STDDEV()、VARIANCE()を改良しました。(Neil, Tom)
-
トランザクションID(XID)周回問題を防止しました。(Tom)
トランザクションカウンタが周回点に近づいた時にサーバは警告を発します。
カウンタが周回点に近づき過ぎている場合、サーバは問い合わせの受付を停止します。
これにより、必要なバキューム処理の実行を行う前にデータが損失されることは確実になくなります。 -
OIDカウンタが周回した後に生じる、既存のシステムオブジェクトとオブジェクトID(OID)が競合する問題を修正しました。
OIDを発行するときに重複していないかチェックします。OIDカウンタ周回後、次のOIDを発番する場合、そのテーブルで空いているOID番号を探して使用します。
-
VACUUM時にmax_fsm_relationsとmax_fsm_pagesを増大させる必要がある場合の警告を追加しました。
-
temp_buffers設定パラメータを追加し、一時テーブルアクセス用のローカルバッファのサイズをユーザが決定できるようになりました。
-
pg_stat_activityにセッションの開始時刻とクライアントIPアドレスを追加しました。(Magnus)
-
ビットマップスキャンのためにpg_statビューを調整しました。(Tom)
一部のフィールドの意味が少し変わりました。
-
pg_locksビューを改良しました。(Tom)
-
クライアント側におけるPREPAREおよびEXECUTEのログを記録するようにしました。(Simon)
-
Kerberos名とユーザ名に関する大文字小文字の区別をpostgresql.confで指定できるようにしました。(Magnus)
-
krb_server_hostname設定パラメータを追加し、サーバプリンシパルの一部としてサーバのホスト名を指定できるようになりました。(Todd Kover)
設定されていない場合、keytab内の一致するサービスプリンシパルが使用されます。
これは本リリースにおける新しいKerberosの検索動作です。 -
log_line_prefixオプションにミリ秒(%m)とリモートホスト(%h)を追加しました。(Ed L.)
-
GiSTインデックスに対するWALロギングを追加しました。(Teodor, Oleg)
GiSTインデックスはクラッシュに対してもポイントインタイムリカバリに対しても安全になりました。
-
pg_stop_backup()を実行した時に古い*.backupファイルを削除するようにしました。(Bruce)
これにより、多くの*.backupファイルが/pg_xlogに残らないようになります。
-
TCP/IPキープアライブ時間について待機、間隔、個数を制御する設定パラメータを追加しました。(Oliver Jowett)
これらの値を変更することで、クライアント接続の喪失を素早く検知できるようになります。
-
ユーザ毎およびデータベース毎の接続上限を追加しました。(Petr Jelinek)
ALTER USERおよびALTER DATABASEを使用して、特定ユーザが同時に接続できる、もしくは特定のデータベースへ同時に接続できる、最大セッション数に制限をかけることができるようになりました。この制限をゼロにすると、ユーザからの接続またはデータベースへの接続が無効になります。
-
64ビットマシンにおいて、2ギガバイト以上の共有メモリとバックエンド単位の作業メモリを使用できるようになりました。(Koichi Suzuki)
-
新しいpg_pltemplateによりダンプファイル内の廃止された手続き言語定義を上書きできるようになりました。(Tom)
-
一時ビューを追加しました。(Koju Iijima, Neil)
-
集約関数やGROUP BYを持たないHAVINGを、単一グループを返すように修正しました。(Tom)
これまでこうした状況では、HAVING句をWHERE句と同様に扱っていました。
これは仕様に従っていませんでした。 -
DELETEにテーブルを追加指定できるようにUSING句を追加しました。(Euler Taveira de Oliveira, Neil)
以前のリリースでは、DELETE文内で結合に使用するテーブルを追加指定する明確な方法はありませんでした。
UPDATEには、すでにこの目的のためのFROMがあります。 -
バックエンドおよびecpg文字列におけるx16進数エスケープのサポートを追加しました。(Bruce)
これは、標準Cのxエスケープ構文そのものです。
8進数エスケープはサポート済みです。 -
BETWEEN SYMMETRIC問い合わせ構文を追加しました。(Pavel Stehule)
この機能によりBETWEEN比較で、1番目の値が2番目より小さいことを必要としなくなりました。
例えば、2 BETWEEN [ASYMMETRIC] 3 AND 1は偽を返しますが、2 BETWEEN SYMMETRIC 3 AND 1は真を返します。
BETWEEN ASYMMETRICはすでにサポート済みです。 -
SELECT ... FOR UPDATE/SHAREのオプションにNOWAITを追加しました。(Hans-Juergen Schoenig)
statement_timeout設定パラメータにより、一定以上の時間がかかる問い合わせをキャンセルすることができますが、このNOWAITオプションにより、SELECT ... FOR UPDATE/SHAREが即座に行ロックを獲得できなかった時、すぐに問い合わせをキャンセルすることができます。
-
共有オブジェクトの依存関係の追跡(Alvaro)
PostgreSQLでは、グローバルテーブル(ユーザ、データベース、テーブル空間)の情報を複数のデータベースから参照することができます。
今回の変更でグローバルテーブルに関する依存性情報が追加されました。
従って、例えば、ユーザの所有権をデータベースに跨って確認できますので、他のデータベースで何かを所有しているユーザを削除できないようにすることができます。
データベースに局所的なオブジェクトに関する依存関係の追跡はすでに存在します。 -
オブジェクト所有者が制限付きのALTER OWNERコマンドを実行できるようになりました。(Stephen Frost)
以
前のリリースでは、スーパーユーザのみがオブジェクトの所有権を変更できました。
今では、コマンドを実行したユーザがオブジェクトを所有し、かつ、新しい所有者として作成できる(つまり、そのユーザが新しい所有者のロールのメンバであ
り、そのロールが新規にオブジェクトを作成する時に必要なCREATE権限を持つ場合)場合、所有権を移すことができます。 -
一部のオブジェクト型(テーブル、関数、型)に対するALTER object SET SCHEMA機能を追加しました。(Bernd Helmle)
これによりオブジェクトを異なるスキーマに移すことができるようになります。
-
トリガを無効にするALTER TABLE ENABLE/DISABLE TRIGGERを追加しました。(Satoshi Nagayasu)
-
単一のTRUNCATEコマンドで複数のテーブルの消去ができるようになりました。(Alvaro)
参照整合性検査のため、参照整合性制約の一部となるテーブルを消去することはできません。
この新しい機能を使用することで、参照整合性制約に含まれる両テーブルが単一のTRUNCATEコマンドで消去される場合、TRUNCATEを使用してこうしたテーブルを消去できるようになりました。 -
COPY CSVモードにおける復帰コード、改行コードの処理が適切になりました。(Andrew)
8.0リリースでは、CSV COPY TOにおける復帰コードと改行コードは一貫性のある方法で処理されていませんでした。
(これはTODOリストに記載されていました。)これは8.0.4でも対応されています。
-
COPYにて、先頭行にヘッダ行を記載できるようにCOPY WITH CSV HEADERを追加しました。(Andrew)
これにより、データファイルの先頭行に列名を記載するという一般的なCSVの使用方法を扱うことができます。
COPY TOでは先頭行には列名が記載され、 COPY FROMでは先頭行は無視されます。 -
Windowsにおいて、EXPLAIN ANALYZEの表示を秒以下の精度にしました。 (Magnus)
-
EXPLAIN ANALYZEの表示にトリガ期間を追加しました。
(Tom)以前のリリースではトリガの実行時間は総実行時間に含まれていました。
各トリガで費やされる時間がどのくらいかがわかるようになりました。 -
COPYにて、¥x16進数エスケープのサポートを追加しました。
(Sergey Ten)以前のリリースでは8進数エスケープのみをサポートしていました。
-
SHOW ALLが変数の説明を含むようにしました。
(Matthias Schmidt)SHOW varname はまだ変数の値のみを表示し、説明を表示しません。
-
initdbがpostgres新しい標準データベースを作成するようになりました。
このためユーティリティが標準を検索する時にtemplate1ではなくpostgresを使用するように変更されました。(Dave)以前のリリースでは、createuserなどのユーティリティのデフォルト接続用、および、新規データベースのテンプレート用として、template1が使用されていました。
テンプレートデータベースにだれかが接続しているために新しいデータベースを作成することができず、CREATE DATABASEの失敗の原因となることがありました。
この変更により、デフォルトの接続データベースがpostgresになりました。
つまり、CREATE DATABASE時にだれかがtemplate1を使用している可能性がかなり減少しました。 -
/contrib/reindexdbをサーバへ移動し、新しくreindexdbコマンドラインユーティリティを作成しました。(Euler Taveira de Oliveira)
-
配列型に対するMAX()およびMIN()集約を追加しました。(Koju Iijima)
-
CC、YY、またはこの両方のフィールドが使用されている場合に合理的な動作を行うようにto_date()およびto_timestamp()を修正しました。(Karel Zak)
CC が書式指定にあり、YYY以上の長さが年指定にあると、CC を無視します。
年指定の長さがYY以下の場合、CCを直前の世紀であると解釈します。 -
md5(bytea)を追加しました。 (Abhijit Menon-Sen)
md5(text)はすでに存在していました。
-
power(numeric, numeric)を基にしたnumeric ^ numericのサポートを追加しました。
関数はすでに存在していましたが、対応する演算子がありませんでした。
-
計算処理中に適切に商を除去するようにNUMERICの剰余を修正しました。
以前のリリースでは、巨大な値に対する剰余が商の丸めにより負の値を返すことがありました。
-
lastval()関数を追加しました。(Dennis Bjrklund)
lastval()はcurrval()を簡単にしたものです。
これは、現在のセッションで実行されたもっとも最近のnextval()またはsetval()に基づいて自動的に適切なシーケンス名を決定します。 -
to_timestamp(DOUBLE PRECISION)を追加しました。(Michael Glaesemann)
1970年からのUnix秒をTIMESTAMP WITH TIMEZONEに変換します。
-
pg_postmaster_start_time()関数を追加しました。(Euler Taveira de Oliveira, Matthias Schmidt)
-
AT TIME ZONEで完全なゾーン名を使用できるようになりました。
以前は省略形のみが使用できました。(Magnus)以前は、定義済みのタイムゾーン名の一覧のみがAT TIME ZONEでサポートされていました。
現在では、サポート済みのタイムゾーン名すべてを使用することができます。
以下に例を示します。SELECT CURRENT_TIMESTAMP AT TIME ZONE 'Europe/London';
上の問い合わせでは、タイムゾーンは指定した日付に影響する夏時間規則に従って調整されます。
-
GREATEST()およびLEAST()可変長引数関数を追加しました。(Pavel Stehule)
これらの関数は可変数の引数を取り、引数の中で最大もしくは最小の値を返します。
-
pg_column_size()を追加しました。 (Mark Kirkwood)
これは列の格納サイズを返します。圧縮が使用されている場合もあります。
-
regexp_replace()を追加しました。 (Atsushi Ogawa)
これによりsedのように正規表現による置換を行うことができます。
省略可能なフラグ引数により、全領域の選択(全置換)や大文字小文字の区別モードを指定することができます。 -
intervalの除算、乗算を修正しました。(Bruce)
以前のバージョンでは、
'4 months'::interval / 5が'1 mon -6 days'といった不揃いの結果を返すことがありました。 -
timestamp、time、interval出力における端数処理を修正しました。(Tom)
上位部分を増加させずに秒部分が60と表示される問題を修正したものです。
-
INTERVALに別途日フィールドを追加し、1日という間隔と24時間という間隔を区別できるようになりました。(Michael Glaesemann)
夏時間による時間調整を含む日にちは24時間ではなく、よく23時間や25時間となります。
この変更により、“何日間”という時間間隔と“何時間”という時間間隔の間に概念的な違いが生じます。
timestampに1 dayを加えると、その間に夏時間による時間調整があったとしても、同じローカル時間における次の日になるようになりました。
一方で24 hoursを加えると、時間調整があると異なるローカル時間となります。
US DSTの例を以下に示します。'2005-04-03 00:00:00-05' + '1 day' = '2005-04-04 00:00:00-04' '2005-04-03 00:00:00-05' + '24 hours' = '2005-04-04 01:00:00-04'
-
justify_days()およびjustify_hours()を追加しました。
(Michael Glaesemann)これらの関数はそれぞれ、日数を適切な月数と日数に、時間数を適切な日数と時間数に調整します。
-
/contrib/dbsizeをバックエンドに移し、一部の関数の名前を変更しました。 (Dave Page, Andreas Pflug)
-
pg_tablespace_size()
-
pg_database_size()
-
pg_relation_size()
-
pg_total_relation_size()
-
pg_size_pretty()
-
クラスタディレクトリへの読み取りのみのファイルアクセス用の関数を追加しました。(Dave Page, Andreas Pflug)
-
pg_stat_file()
-
pg_read_file()
-
pg_ls_dir()
-
設定ファイルを強制的に再読み込みするpg_reload_conf()を追加しました。(Dave Page, Andreas Pflug)
-
サーバログファイルを強制的にローテートするpg_rotate_logfile()を追加しました。(Dave Page, Andreas Pflug)
-
TOASTテーブルを含めるようにpg_stat_*ビューを変更しました。(Tom)
-
より一貫性を高め、かつ、国際的な標準に従うように一部の符号化方式の名前を変更しました。
-
UNICODE はUTF8になりました。
-
ALTはWIN866になりました。
-
WINはWIN1251になりました。
-
TCVNはWIN1258になりました。
-
WIN1252符号化方式のサポートを追加しました。(Roland Volkmann)
-
4バイトのUTF8文字のサポートを追加しました。(John Hansen)
これまでは1バイト、2バイトおよび3バイトのUTF8文字がサポートされていました。
これは特に一部の中国語文字セットをサポートするために重要です。 -
EUC_JP、SJIS間の直接変換を可能とし、性能を向上しました。(Atsushi Ogawa)
-
WindowsにおいてUTF8符号化方式が動作できるようになりました。(Magnus)
これはUTF8をWindows独自のUTF16実装に対応付けすることでなされました。
-
ALTER LANGUAGE RENAMEを修正しました。(Sergey Yatskevich)
-
厳密性、揮発性などの関数特性をALTER FUNCTIONで変更できるようにしました。(Neil)
-
関数引数の最大数を100まで増加しました。(Tom)
-
SQL関数およびPL/PgSQL関数でOUTおよびINOUTパラメータを使用できるようにしました。(Tom)
OUTは、関数の戻り値をあらわす別の方法です。
RETURNの代わりに使用して、OUTまたはINOUTで宣言されたパラメータに割り当てて、値を返します。これにより、特に複数の値を返さなければならない場合、記述がより簡単になる場合があります。以前のリリースでも関数から複数の値を返すことは可能でしたが、これによりその手続きが非常に簡単になりました(今後のリリースでこの機能は他のサーバサイド言語にも拡張される予定です)。以下のようにあくまで返し値を指定する方法の一種です。同様の表記法を持つC#言語等の振る舞いとは異なります。
oss=> CREATE FUNCTION func (IN x int, OUT y int, OUT z int) LANGUAGE plpgsql AS $$ oss$> BEGIN oss$> y := x * 2; oss$> z := x + 1; oss$> END; $$; CREATE FUNCTION oss=> SELECT * FROM func (3); y | z ---+--- 6 | 4 (1 row)
-
言語ハンドラ関数をpg_catalogスキーマに移動しました。
これによりpublicスキーマの削除が簡単にできるようになりました。
-
SPI_getnspname()をSPIに追加しました。(Neil)
-
PL/PgSQL関数のメモリ管理を全面的に見直しました。(Neil)
各関数の解析ツリーが異なるメモリコンテキストに保存されるようになりました。
これにより、不要になった時にメモリの回収が簡単にできるようになりました。 -
実行時ではなく、CREATE FUNCTION時に関数の構文を検査します。(Neil)
以前は、構文エラーのほとんどが関数を実行した時にのみ報告されていました。
-
OPENにより、EXPLAIN やSHOWなどのSELECT以外の問い合わせを開くことができるようになりました。(Tom)
-
関数でRETURN文を実行する必要がなくなりました。(Tom)
これはOUTおよびINOUT機能の新規追加に伴う副産物です。
関数の戻り値を提供する必要がない場合RETURNを省略することができます。 -
PL/PgSQLのEXECUTE文における省略可能なINTO句サポートを追加しました。(Pavel Stehule, Neil)
-
CREATE TABLE ASがROW_COUNTを設定するようにしました。(Tom)
-
現在の例外に関するSQLSTATEとエラーメッセージを返すSQLSTATEとSQLERRMを定義しました。(Pavel Stehule, Neil)
これらの変数は、例外ブロック内でのみ定義されます。
-
RAISE文のパラメータを式とすることが可能になりました。 (Pavel Stehule, Neil)
-
ループのCONTINUE文を追加しました。(Pavel Stehule, Neil)
-
ブロックラベルとループラベルを追加しました。(Pavel Stehule)
-
大規模な結果セットを効率的に返すことが可能になりました。(Abhijit Menon-Sen)
これにより関数で、結果セット全体をメモリ内に構築することなくreturn_next()が使用できるようになりました。
-
一度に一行という形で、問い合わせ結果の取り出しが可能になりました。(Abhijit Menon-Sen)
これにより関数で、結果セット全体をメモリ内に保存することなくspi_query()とspi_fetchrow()が使用できるようになりました。
-
サーバの符号化方式がUTF8の場合、PL/Perlは文字列を強制的にUTF8 として扱うようになりました。(David Kamholz)
-
PL/Perlで検証関数を追加しました。(Andrew)
これにより、構文エラーを実行時ではなく定義時に報告できるようになりました。
-
関数が配列型を返す場合にPL/PerlがPerlの配列を返すことができるようになりました。(Andrew)
これは基本的にはPostgreSQL配列をPerl配列に対応付けします。
-
Perlの非致命的警告でNOTICEメッセージを生成できるようになりました。(Andrew)
-
Perlのstrictモードを有効にできるようになりました。(Andrew)
-
トランザクション内の文がトランザクションの残りに影響することなくエラーになることができるように、set ON_ERROR_ROLLBACKを追加しました。(Greg Sabino Mullane)
これは、基本的に、すべての文を副トランザクション内で行うことで実装しています。
-
psql変数内でx16進数文字列のサポートを追加しました。(Bruce)
8進数エスケープはすでにサポートされていました。
-
troff -ms出力書式のサポートを追加しました。(Roger
Leigh) -
履歴ファイルの格納場所をHISTFILEで制御可能にしました。 (Andreas Seltenreich)
これによりデータベースごとに履歴ファイルの格納設定が可能になります。
-
x (拡張モード)がd tablenameの結果に影響しないようにしました。(Neil)
-
セッションのログを記録するための-Lオプションをpsqlに追加しました。 (Lorne Sunley)
オペレーティングシステムの中には簡単にコマンドライン操作をログ記録する機能がないものがありましたので、このオプションが追加されました。
-
dがインデックスのテーブル空間を表示できるようにしました。(Qingqing
Zhou) -
psqlのヘルプ(h)が適切なヘルプ情報について最善の推測を行うようになりました。
(Greg Sabino Mullane)これによりユーザは単に構文エラーとなった問い合わせの前にhを付けるだけで、サポートしている構文のヘルプ情報を得ることができるようになりました。
これまでは、hを使用する前にコマンド名以外の問い合わせテキストを削除しなければなりませんでした。 -
ロケールを考慮した書式で数値を出力できるようにpset numericlocaleを追加しました。(Eugen Nedelcu)
例えば、Cロケールでは100000は100,000.0として、Europeanロケールでは 100.000,0として出力されます。
-
起動時のバナーでサーバのバージョン番号とpsqlのバージョン番号が異なる場合に両方とも表示するようにしました。(Bruce)
また、サーバとpsqlとの間でメジャーリリース番号が異なる場合に警告を発します。
-
pg_restoreに-nおよび--schemaスイッチを追加しました。 (Richard van den Berg)
これにより指定したスキーマのオブジェクトのみをリストアすることができます。
-
テキストモードでもpg_dumpがラージオブジェクトをダンプできるようになりました。(Tom)
この変更により、ラージオブジェクトが常にダンプできるようになりました。
以前の-bスイッチは何も行いません。 -
pg_dumpが一貫性を持ったラージオブジェクトのスナップショットをダンプできるようになりました。(Tom)
-
ラージオブジェクトのコメントをダンプします。(Tom)
-
pg_dump に--encoding を追加しました。
(Magnus Hagander)これにより、サーバの符号化方式と異なる符号化方式でデータベースをダンプできるようになりました。
これは、異なる符号化方式のマシンでダンプを転送する時有用です。 -
手続き言語のpg_pltemplateに依存します。(Tom)
手続き言語用の呼び出しハンドラがpg_catalogスキーマ内に存在する場合、pg_dumpはそのハンドラをダンプしません。
代わりに、ロード時に言語の生成パラメータを提供するpg_pltemplateカタログに依存した、単なるCREATE LANGUAGE nameを使用してその言語をダンプします。 -
パスワードファイルのファイル名を指定するpg_pltemplate環境変数を追加しました。(Andrew)
-
lo_create()を追加しました。
これはlo_creat()と同じですが、ラージオブジェクトのOIDを指定することができます。(Tom) -
libpqがmalloc()失敗に関するエラーを一貫性を持ってクライアントアプリケーションに返すようにしました。 (Neil)
-
場所を変更したインストレーションに対して構築をサポートするようにpgxsを修正しました。
-
Intelコンパイラを使用するItaniumプロセッサをサポートするスピンロックを追加しました。 (Vikram Kalsi)
-
Windows用のKerberos 5サポートを追加しました。(Magnus)
-
中国語版FAQを追加しました。(laser@pgsqldb.com)
-
OS/Xの機能名称変更に合わせ、RendezvousをBonjourに名前を変更しました。(Bruce)
-
Darwinにおけるfsync_writethroughのサポートを追加しました。(Chris Campbell)
-
サーバ、オプティマイザ、ロックシステム内の情報の渡し方を合理化しました。 (Tom)
-
pg_configがMSVCを使用してコンパイルできるようになりました。(Andrew)
これには、MSVCを使用した DBD::Pgの構築が必要です。
-
Kerberos V4のサポートをやめました。(Magnus)
Kerberos 4 にはセキュリティ上の欠陥があり、保守もされていません。
-
コードを整理しました。(EnterpriseDBを使用してカバレッジに関する静的解析を行いました。)
-
postgresql.confのドキュメント上のデフォルトを、true/falseではなくon/offに変更しました
。(Bruce) -
pg_configを改良し、より多くの構築時の値を報告できるようにしました。(Tom)
-
Windowsにおいてスレッドセーフなlibpqを構築できるようにしました。(Dave Page)
-
WindowsにおいてIPv6接続が利用できるようになりました。(Andrew)
-
I/Oサブシステムの信頼性に関するサーバ管理用文書を追加しました。(Bruce)
-
秘匿可能な宣言をgist.hからgist_private.hに移しました。(Neil)
以前のリリースでは、gist.hには公開GiST API(GiSTインデックス実装者向け)とGiST自体を実装するために使用する秘匿可能な宣言が混在していました。
後者がgist_private.hという別のファイルに移りました。
ほとんどのGiSTインデックス実装には影響がないはずです。 -
GiSTメモリ管理を再作成しました。(Neil)
GiSTのメソッドが常に短命のメモリコンテキスト内で呼び出されるようになりました。
そのため、palloc()で割り当てられたメモリは自動的に回収されます。
これにより、GiSTインデックス実装ではpfree()を使用して割り当てられたメモリを解放する必要がなくなりました。 -
/contrib/pg_buffercache contribモジュールを追加しました。(Mark Kirkwood)
これはデバッグや性能の調整を目的としたもので、バッファキャッシュの内容を表示します。
-
古くなりましたので/contrib/arrayが削除されました。(Tom)
-
/contrib/loモジュールを整理しました。(Tom)
-
/contrib/findoidjoinsを/src/toolsに移動しました。(Tom)
-
/contrib/cubeから<<、>>、&<、&> 演算子を削除しました。
これらの演算子が有用ではないからです。
-
/contrib/btree_gistを改良しました。(Janko Richter)
-
/contrib/pgbenchを改良しました。 (Tomoaki Sato, Tatsuo)
固定のコマンド群だけではなく、ユーザが用意したSQLコマンドスクリプトで試験を行なう機能が追加されました。
-
/contrib/pgcryptoを改良しました。(Marko Kreen)
-
OpenPGP対称キーと公開キー暗号の実装。
RSAおよびElgamal公開キーアルゴリズムの両方をサポートします。
-
単体での構築。SHA256/384/512ハッシュ、Fortuna PRNGを含みます。
-
OpenSSLの構築。3DESのサポート。OpenSSL < 0.9.7での内部AESの利用。
-
configureの結果を使用した構築パラメータ(OpenSSL、zlib)の取得。
<!- There is no need to edit the Makefile anymore. –>Makefileを編集する必要がまったくなくなりました。
-
libmhashおよびlibmcryptサポートの削除。
PostgreSQL 8.0.4 から 8.1 の変更点
本ドキュメントは PostgreSQL のリリースノートおよびその翻訳版を元に作成しています。なお、ブランチが枝分かれしたのが 8.0.3 のため、いくつかの変更点は 8.0.4 と重複しています。
概要
このリリースの主な変更点を以下に示します。
バージョン8.1への移行
全ての以前のリリースからデータの移行を行うためには、pg_dumpを使用したダンプ、リストアが必要です。
8.0リリースでは、8.1でintervalに対するto_char()を削除するとアナウンスしましたが、より優れたAPIの提案がありませんでしたので、to_char(interval)は強化され、サーバに残りました。
以下の非互換性に注意してください。
standard_conforming_stringsの値は読み取りのみです。
アプリケーションでは、この値を読み取ることで、どのようにバックスラッシュが解釈されるかが分かります。
(また、このパラメータが存在するかどうかで、E''文字列構文がサポートされているかどうかが分かります。)
今後のリリースでは、standard_conforming_stringsは真になる予定です。
つまり、非E文字列でのバックスラッシュは文字そのものとして扱われます。
この変更に備えて、バックスラッシュの特別処理が必要な場所にE''を使用し、かつ、E''を使用するように返還しなければならない文字列を更に検出するためにescape_string_warningを有効
にしてください。
また、文字列内に単一引用符そのものを埋め込む場合には、PostgreSQLがサポートするバックスラッシュ+単一引用符(¥')という構文ではなく、2つの単一引用符('')を使用して>ください。後者は標準に準拠しており、また、E''文字列構文を使用する必要がありません。また、バックスラッシュを特別に扱わない、$$文字列構文も使用することができます。
E''文字列構文がサポートされたことによって8.0.x以前から8.1への移行に何か必要になるわけではありません。今後(おそらく8.2以降)のバージョンで”で表現される文字列内におけるバックスラッシュの扱いが変わる可能性があるので備えよという話です。
その他の変更点
PostgreSQL8.1と以前のメジャーリリースとの間でなされた、その他の変更点について詳細を以下に示します。
性能向上
サーバの変更
問い合わせの変更
オブジェクト操作の変更
ユーティリティコマンドの変更
データ型および関数の変更
pg_total_relation_size()にはインデックスとTOASTテーブルが含まれます。
符号化方式およびロケールの変更
以前の名前もまだ使用できます。