Если планировщик запросов выбирает неоптимальные планы запросов, то, скорее всего, он имеет неполную или вводящую в заблуждение информацию для работы.
См. Эту Вики-страницу PostgreSQL по настройке сервера.Особое внимание обратите на главы random_page_cost и default_statistics_target .
Также прочтите соответствующие главы в руководстве по Статистика, используемая планировщиком и Константы стоимости планировщика .
Более конкретно, это может помочь увеличить statistics target
для следующих столбцов:
ALTER TABLE postgres.products ALTER COLUMN id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN company_id SET STATISTICS 1000;
ALTER TABLE goods_return_notes ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE goods_return_notes ALTER COLUMN company_id SET STATISTICS 1000;
ALTER TABLE retailer_category_leaf_nodes ALTER COLUMN tree_left SET STATISTICS 1000;
ALTER TABLE channels ALTER COLUMN principal_id SET STATISTICS 1000;
Они используются в фильтрах, в результате чего
огромная разница между оценочными и фактическими строками.
Есть больше .Проверьте каждый столбец, где строгальный станок сильно отклоняется от оценки.По умолчанию это просто 100. Имеет смысл только для таблиц с >> 1000 строк.Поэкспериментируйте с настройкой.Затем запустите ANALYZE
для таблиц, чтобы изменения вступили в силу.
Может также помочь создать частичный индекс для postgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL
(в зависимости от того, насколько распространены значения NULL).
Еще одна вещь, которая может вам помочь, - обновить до последней версии 9.1.В этой области произошел ряд существенных улучшений.