当我创建太多分区时,postgreSQL中的性能下降很糟糕

时间:2014-10-17 03:52:56

标签: performance postgresql

我不明白为什么当我为表创建了太多分区时,postgreSQL会出现性能下降的原因。

  • 100 - > 0.05秒
  • 200 - > 0.07秒
  • 400 - > 0.16秒
  • 600 - > 0.24秒
  • 800 - > 0.29秒
  • 1,000 - > 0.37秒
  • 1,500 - > 0.62秒
  • 2,000 - > 0.82秒
  • 4,000 - > 1.86秒
  • 10,000 - > 7.62秒

以下是测试查询和解释结果。

select count(*) from test_sql_stat_daily
where partition_key=1000000099;

Aggregate  (cost=20000000011.88..20000000011.89 rows=1 width=0)"
  Output: count(*)"
  ->  Append  (cost=10000000000.00..20000000011.88 rows=2 width=0)"
        ->  Seq Scan on test_sql_stat_daily  (cost=10000000000.00..10000000000.00 rows=1 width=0)"
              Filter: (test_sql_stat_daily.partition_key = 1000000099)"
        ->  Seq Scan on test_sql_stat_daily_p0000000099 test_sql_stat_daily  (cost=10000000000.00..10000000011.88 rows=1 width=0)"
              Filter: (test_sql_stat_daily.partition_key = 1000000099)"

我想克服这种情况。 对这种情况没有任何影响。

  1. 增加共享缓冲区的大小
  2. 为CHECK约束列
  3. 创建主键约束(和创建索引)的索引
  4. set constraint_exclusion = on

1 个答案:

答案 0 :(得分:6)

documented approach是"不要这样做。"

  

检查主表的所有分区上的所有约束   在约束排除期间,可能存在大量分区   大大增加查询计划时间。使用这些分区   技术可以很好地与大约一百个分区一起使用;   不要尝试使用数千个分区

强调补充。

如果我是你,我会尝试将分区数减少到1000.