1

この背景については、以下を参照してください: UNIQUE (複合 4 列) を持つテーブルの主キーが必要ですか?そのうちの 1 つを NULL にすることができますか?

私の質問は非常に簡単です:

  • 別のデータベースから同期された製品価格情報を保持するテーブルがあります。このテーブルには、クライアントによって制御されるフィールドが 1 つだけあり、残りのフィールドは削除され、同期時に時々再挿入されます (たとえば、1 日 1 回から 1 週間に 1 回、PHP スクリプトを使用してクライアントが手動で実行します)。 )。

1) テーブルには 4 つの列 (そのうちの 1 つは null の可能性があります) にインデックスがあり、3 つの非 null 列には別の部分インデックスがあります。テーブルの約 90% を削除してデータを再挿入する場合、インデックスも削除して、すべてのデータがテーブルにある後に再作成するのが良いですか、それとも単純にインデックスを「そのまま」維持する方が良いですか? ?

Erwin Brandstetter によって提案された別のアプローチに切り替えました。

CREATE TEMP TABLE pr_tmp AS
SELECT * FROM product_pricebands WHERE my_custom_field IS TRUE;
TRUNCATE product_pricebands;
INSERT INTO product_pricebands SELECT * FROM pr_tmp;

これは非常にうまく機能しているように見えるので、インデックスを削除して再作成する必要があるかどうか、またはなぜこれを行う必要があるのか​​ わかりません。助言がありますか?

2) また、スクリプトのパフォーマンスを測定するにはどうすればよいですか? 私は実際に知りたい:

CREATE TEMP TABLE pr_tmp AS
SELECT * FROM product_pricebands WHERE my_custom_field IS TRUE;
TRUNCATE product_pricebands;
INSERT INTO product_pricebands SELECT * FROM pr_tmp;

よりも優れたパフォーマンスを持っています

DELETE FROM product_pricebands WHERE my_custom_field IS TRUE;

PHP経由でこれを伝えることはできますか? EXPLAIN ANALYZE を試してみましたが、上記のような一連のステートメントに対して機能するかどうかわかりません。

どうもありがとう!

4

2 に答える 2

2

Postgres のバージョンが 8.4 以上の場合、自動説明モジュールを使用できます: http://www.postgresql.org/docs/8.4/static/auto-explain.html

スクリプトで使用することもできます: SET log_min_duration_statement = 0; SET log_duration = オン; このスクリプトのすべてのステートメントとタイミングを記録します。

于 2012-05-11T09:21:33.057 に答える
0

第一に、インデックスを再構築することが重要かどうかはわかりませんが、テーブルが大きい場合は、インデックスを削除して再作成するよりもパフォーマンスが向上すると思います。

CREATE TEMP TABLE pr_tmp AS
    SELECT * 
    FROM product_pricebands 
    WHERE my_custom_field IS TRUE
-- drop all indexes here
TRUNCATE product_pricebands;
INSERT INTO product_pricebands 
    SELECT * 
    FROM pr_tmp;
-- recreate them here
于 2012-05-11T12:06:41.253 に答える