1

有关这方面的背景,请参阅:我的表是否需要一个主键,它有一个 UNIQUE(复合 4 列),其中一个可以为 NULL?

我的问题很简单:

  • 我有一个包含产品定价信息的表,从另一个数据库同步。此表中只有一个字段由客户端控制,其余字段在同步时每隔一段时间删除并重新插入(例如,每天一次到每周一次,由客户端使用 PHP 脚本手动运行)。

1) 该表在 4 列上有一个索引(其中一个可以为空),在 3 个非空列上有另一个部分索引。当您删除大约 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 = on; 记录此脚本的所有语句和时间。

于 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 回答