PostgreSQL

时间:2016-06-13 22:59:44

标签: postgresql partitioning database-partitioning postgresql-9.5

我使用Postgresql 9.5。这些设置是默认设置。

我已将表拆分为~7000个分区。然后我插了一行。

当我查询SELECT * FROM "Offer";时,它正在运行 1,5 秒。

当我查询SELECT * FROM "Offer" WHERE bid=4793;,其中出价 - 分区的约束(每个出价一个表格)时,它正在运行 1 秒。

这是第二个查询的EXPLAIN ANALYZE:

Append  (cost=0.00..12.14 rows=2 width=596) (actual time=0.014..0.014 rows=1 loops=1)
  ->  Seq Scan on "Offer"  (cost=0.00..1.01 rows=1 width=344) (actual time=0.011..0.011 rows=0 loops=1)
        Filter: (bid = 4793)
        Rows Removed by Filter: 1
  ->  Seq Scan on "Offer-4793"  (cost=0.00..11.12 rows=1 width=848) (actual time=0.002..0.002 rows=1 loops=1)
        Filter: (bid = 4793)
Planning time: 996.243 ms
Execution time: 0.261 ms

为什么这么慢?我可以用什么来描述它? 我只有一个猜测 - postgresql不会在RAM中保留分区约束,并且每次都从HDD中读取它们。

期待一些帮助!

更新

我试图创建级联分区(正如@jmelesky所写)。结果更糟:

Append  (cost=0.00..12.24 rows=5 width=848) (actual time=0.013..0.013 rows=1 loops=1)
  ->  Seq Scan on "Offer"  (cost=0.00..1.11 rows=1 width=848) (actual time=0.006..0.006 rows=0 loops=1)
    Filter: (bid = 4793)
  ->  Seq Scan on "Offer-ddd-3"  (cost=0.00..0.00 rows=1 width=848) (actual time=0.001..0.001 rows=0 loops=1)
    Filter: (bid = 4793)
  ->  Seq Scan on "Offer-dd-33"  (cost=0.00..0.00 rows=1 width=848) (actual time=0.000..0.000 rows=0 loops=1)
    Filter: (bid = 4793)
  ->  Seq Scan on "Offer-d-336"  (cost=0.00..0.00 rows=1 width=848) (actual time=0.000..0.000 rows=0 loops=1)
    Filter: (bid = 4793)
  ->  Seq Scan on "Offer-4793"  (cost=0.00..11.12 rows=1 width=848) (actual time=0.006..0.006 rows=1 loops=1)
    Filter: (bid = 4793)
Planning time: 1449.872 ms
Execution time: 0.354 ms

0 个答案:

没有答案