Доброго времени суток!
Я использую Postgresql 9.5. Настройки из коробки.
Разбил таблицу на ~7000 партиций. Вставил одну запись.
Когда делаю
SELECT * FROM "Offer";
, запрос длится 1,5 сек.
Когда делаю
SELECT * FROM "Offer" WHERE bid=4793;
, где bid -- ограничение партиционирования (по одной таблице на каждое значение bid), запрос длится 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 не держит в озу условия ограничений своих партиций и каждый раз читает с диска.
Очень рассчитываю на помощь!
UPDATE:
Ещё мне посоветовали каскадное партицирование (у основной таблицы 10 детей, у каждого из которых тоже по десять детей итд). Результат не лучше:
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