sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで継承されたテーブルを使用するのはいつですか?

    postgresでテーブル継承を使用する主な理由はいくつかあります。

    たとえば、統計に必要なテーブルがいくつかあり、毎月作成されて入力されます。

    statistics
        - statistics_2010_04 (inherits statistics)
        - statistics_2010_05 (inherits statistics)
    

    このサンプルでは、​​各テーブルに2.000.000行があります。各テーブルには、一致する月のデータのみが格納されるようにするためのCHECK制約があります。

    では、継承が優れた機能である理由は何ですか?データを分割するのが優れているのはなぜですか?

    • パフォーマンス:データを選択するときは、SELECT * FROM statistics WHERE date BETWEEN x and Yであり、Postgresは意味のあるテーブルのみを使用します。例えば。 SELECT * FROM statistics WHERE date BETWEEN '2010-04-01' AND '2010-04-15'はテーブルstatistics_2010_04のみをスキャンし、他のすべてのテーブルは変更されません-高速です!
    • インデックスサイズ:列の日付に大きなファットインデックスを持つ大きなファットテーブルはありません。月に小さなテーブルがあり、インデックスが小さく、読み取りが高速です。
    • メンテナンス:他のすべてのデータをロックすることなく、毎月のテーブルでバキュームフル、インデックスの再作成、クラスター化を実行できます

    パフォーマンスブースターとしてのテーブル継承の正しい使用法については、postgresqlのマニュアルを参照してください。各テーブルにCHECK制約を設定して、データが分割(パーティション化)されるキーをデータベースに通知する必要があります。

    特に月ごとにグループ化されたログデータを格納する場合は、テーブルの継承を多用します。ヒント:変更されないデータ(ログデータ)を保存する場合は、CREATE INDEX ON()WITH(fillfactor =100);を使用してインデックスを作成またはインデックス付けします。これは、更新用のスペースがインデックスに予約されないことを意味します。インデックスはディスク上で小さくなります。

    UPDATE:fillfactorのデフォルトは100で、http://www.postgresql.org/docs/9.1/static/sql-createtable.htmlから:

    テーブルのフィルファクターは10から100の間のパーセンテージです。100(完全なパッキング)がデフォルトです



    1. SSHトンネル経由のPostgreSQL

    2. mySQL replace()を使用して複数のレコードの文字列を置き換えるにはどうすればよいですか?

    3. ORA-01775をデバッグする方法:シノニムのチェーンをループしますか?

    4. SQL Server(T-SQL)でのCURRENT_TIMESTAMPの例