web-dev-qa-db-ja.com

Postgres:セカンダリインデックスはACIDに含まれていますか?

一意でないインデックス/インデックスは[〜#〜] c [〜#〜] a [〜#〜] c [〜#〜]の一貫性句でカバーされていますかid? (データに制約を課さないインデックスの他の属性についても同じです)Postgresで特定のパフォーマンスの問題(実際にはメリット)が見られ、そうであるかどうか疑問に思います。

インデックス/インデックスがファーストクラスのオブジェクトではないことを考えると(つまり、Postgresで直接アクセスしたり、使用をリクエストしたりすることはできません)、Postgresがこれをサポートする必要がある理由はまったくわかりません。 「トランザクションが完了する前にインデックスが完全に完了し、ハッキングされてはならない」というACIDの定義が見つかりません。

挿入に制限を課さない特定の条件下(インデックスが一意でないなど)では、インデックスは本質的に「無効」になる可能性があります(つまり、「インデックスの再作成が完了するまで使用しないでください」)。 「インデックスは以下の範囲をカバーしていません」というセット。

Postgresがこのトリックをプレイした場合、copy from演算子はexceedinglySwift(これは私が見ているものです))にすることができます。トランザクション。

私はこれを作っているだけではありません...

Redshiftは悪い例ですが、Amazonは、(唯一の)ソートキー(基本的にはプライマリインデックス)の格納方法を巧みに操ることで、一貫性を失います[〜#〜] c [〜#〜] -Redshiftのような構成)。 vacuumコマンドを実行するまで、主キーはどんどん悪化し続け、データベースはブラックホールになり始めます。クエリは入りますが、結果は出ません。

明らかに、内部化された真空レジメンは、大量輸入中にしばしば発生する赤方偏移の愚かさを防ぎます。

2

一意でないインデックス/インデックスはaCidのConsistency句でカバーされていますか?

はい。これに違反すると、PostgreSQLのバグと見なされます。

引用したドキュメントは、postgresがインデックスのみのスキャンを実行する代わりに一時的にヒープをスキャンするか、一貫した結果を得るために追加の作業を行う必要がある場合です。

たとえば、BRINインデックスとGINインデックスはどちらも、保留中の変更のバッチを蓄積してから、バッチ更新を実行します。インデックスがクエリで使用される場合、このキューもスキャンされ、現在の最新で一貫性のあるビューが表示されていることを確認します。

インデックスが現在無効である場合、プランナーによってスキップされ、クエリでは使用されません。

Redshiftは実際にはPostgreSQLではなく、たまたま同じフロントエンドとプロトコルを共有しているだけです。 Redshiftに基づいて比較を描画すると、通常は混乱が生じます。

5
Craig Ringer