はい、欠点がある可能性があります。別のクエリが日付で決定されない別のデータセグメントを調べる場合、行がより多くのデータページに分散されていると、パフォーマンスに影響する可能性があります。最初のクエリの利益とまったく同じです。それはあなたの質問にない情報に完全に依存しています。
テーブルのPKを使用する他のクエリ(id_fooとしましょう)
それは何でもかまいません。それはあなたが持っているものとあなたが正確に何をクエリするかに依存します。単一の行のクエリはどちらの方法でも影響を受けませんが、複数の行は影響を受ける可能性があります。
のCLUSTER
ように元の状態でテーブルを書き換えるVACUUM FULL
(デッドタプルを削除する、テーブルの物理サイズを圧縮する、インデックスを書き換える)ことに注意してください。したがって、並べ替え順序とは関係なく、読み取りパフォーマンスにすぐにプラスの影響が出る可能性があります。(と同じようにVACUUM FULL
。)
その後CLUSTER
、VACUUM
テーブルでプレーンを実行して可視性マップを更新することもできます。これにより、インデックスのみのスキャンが可能になる場合があります。
CLUSTER
書き込み頻度とともに縮小するすべての利点。
あなたがテーブルに多くの更新を持っている場合にも、CLUSTER
実際にできる傷 HOTのために、「ウィグルの部屋」を除去することにより、書き込み性能は、同じデータページに更新します。FILLFACTOR
100未満の設定でその影響に対抗できる場合があります。ここでも、更新された行の局所性などに依存します。
関連:
いずれにせよ、私はおそらくでインデックスを作成してクラスター化せずmy_timestamp::date
、my_timestamp
直接オンにします。何も失わず、何かが得られた。キャストは非常に安価ですが、まったくキャストしない方が安いです。インデックスはより多くのクエリをサポートできます。
CREATE INDEX foo_my_timestamp_idx ON foo (my_timestamp);
にもかかわらず、date
ディスク上の唯一の4バイトを占有し、timestamp
8つのバイトを占め、差は通常、あなたのケースのためのアライメントパディングに失われた、との両方のインデックスが持っている、正確に同じ大きさで。
式インデックスに起因する同じ日の複数の行の順序は任意です。それでも2つの同じタイムスタンプが存在する可能性がありますが、通常はほとんどあり得ない6つの小数桁があります。それとは別に、行の確定的な順序を取得します。これにはさまざまな利点があります。
DESC
Postgresは実質的に高速で前方にインデックスを逆方向に読み取ることができるため、キーワードも省略しました。(ただし、マルチカラムインデックスではソート順が重要です!)詳細:
の代わりに:
SELECT * FROM foo
WHERE my_timestamp::date = '2016-07-25';
あなたは今使うでしょう:
SELECT * FROM foo
WHERE my_timestamp >= '2016-07-25' -- this is a timestamp literal now
WHERE my_timestamp < '2016-07-26';
同じパフォーマンス。
あなたは、列の時間コンポーネントを必要としない場合は、すべてで、に列を変換しますdate
...
ロールバックする方法はCLUSTER
?
CLUSTER
単一のテーブルではROLLBACK
、トランザクションがコミットされていない限り、他の通常のコマンドと同様にロールバックできます。
しかし、私はマニュアルを引用します:
CLUSTER
パラメータを指定しないと、呼び出し元のユーザーが所有する現在のデータベース内の以前にクラスタ化されたすべてのテーブル、またはスーパーユーザーから呼び出された場合はそのようなすべてのテーブルが再クラスタ化されます。この形式はCLUSTER
、トランザクションブロック内では実行できません。
いつでもCLUSTER
別のインデックスで実行して、行の物理的な順序をもう一度変更できます。
CLUSTER
です。次に、「ロールバック」する方法を尋ねる必要がありますか?CLUSTER
今すぐPK を使用する必要がありますか?