У меня есть два идентичных сервера (с точки зрения аппаратного обеспечения), они оба являются стандартными установками Windows Server 2008 r2, с минимальным количеством установленного программного обеспечения (в основном мой код и необходимые вещи, такие как jvm и т. Д.).
На одном сервере я запускаю sql server 2005, на втором сервере postgresql 9.1. Разница в производительности между этими двумя серверами ошеломляет, это настолько плохо на postgresql, что я сожалею о своей первоначальной речи «давайте использовать postgresql вместо того, чтобы платить за лицензию sql server» моему боссу. Мы говорим о разнице в 30 секунд и 15 минут для одной и той же команды, и это не просто одна команда, это любой запрос или команда, которую я бросаю на нее. Они оба имеют практически одинаковые данные (записи были вставлены в разном порядке), и обе базы данных имеют одинаковую структуру / индексы и т. Д.
Но я надеюсь, что это просто вопрос настройки производительности. Дело в том, что сервер sql в значительной степени использует все 32 гигабайта оперативной памяти на сервере, в то время как postgresl ничего не использует, определенно меньше, чем концерт, хотя на самом деле я не разобрался в деталях.
Как мне заставить postgresql использовать более 20 гигабайт оперативной памяти? Эти серверы были созданы специально для этой базы данных, поэтому, по моему мнению, все оперативные памяти, не используемые базой данных и вспомогательными процессами, теряются.
источник
SET effective_cache_size=18G;
(настройка по умолчанию очень низкая) Кстати: если предположить, что это 64-битный компьютер (без PTE)Ответы:
Есть много настраиваемых констант, инициализированных через
postgres.conf
. Самые важные из них:max_connections
: количество одновременных сеансовwork_mem
: максимальный объем памяти, который будет использоваться для промежуточных результатов, таких как хеш-таблицы, и для сортировкиshared_buffers
объем памяти, выделенный для «закрепленного» буферного пространства.effective_cache_size
объем памяти, предположительно используемый буферами LRU операционной системы.random_page_cost
: оценка относительной стоимости дисков ищет.max_connections
не должен быть установлен выше, чем необходимо, соединения стоят ресурсов, даже когда простаивают; в большинстве случаев соединение будет тратить больше времени на ожидание внутри, чем на ожидание снаружи. (за счет параллелизма) Хорошая формула «большого пальца»: «количество шпинделей + количество процессоров + X»work_mem
является хитрым: это может быть применено к каждому подзапросу, поэтому запрос с 5HASHJOINS
может стоить 5 *work_mem
. И для наихудших сценариев вы также должны подумать о том, что несколько сеансов потребляют эту сумму (опять же, причина оставатьсяmax_connections
низкой).shared_buffers
это (имхо) переоценено. Обычно рекомендуется устанавливать его примерно на 1/4 ... 1/2 от всей доступной "свободной" памяти, но я склонен держать ее на низком уровне и устанавливатьeffective_cache_size
на всю доступную "свободную" память.random_page_cost
это стоимость поиска + чтения на диске. Это относительноsequential_disk_cost
1. Это значение по умолчанию (4)random_page_cost
установлено слишком высоким для современных машин и сетевого хранилища, обычно оно может быть снижено до 2–1. Для дисков SSD вы даже можете установить его на 1,0, поскольку поиск на SSD практически бесплатный.источник
work_mem
, когда поmax_connections
умолчанию 100, а объем оперативной памяти сервера составляет 32 ГБ (выделенный сервер postgres)? Я знал, что мне нужно настроить это самостоятельно, основываясь на ежедневных запросах. Мне просто интересно, можете ли вы сказать мне значение «один размер подходит для всех» (или начальную точку). 50 МБ слишком большой? Большое спасибо.Подумайте об использовании pgtune, чтобы помочь вам настроить конфигурацию PostgreSQL. Из PgFoundry:
Конфигурация PostgreSQL по умолчанию очень консервативна, и этот инструмент призван помочь в этой конкретной ситуации. Документация легко читается и использовать инструмент довольно просто.
Имейте в виду, что нет необходимости использовать точные предложения pgtune. Играя с его настройками и наблюдая за полученными изменениями в файле conf, вы получите лучшее представление о конфигурации PostgreSQL и о том, как настроить его вручную.
источник
Если каждый запрос или команда выполняется медленно, я подозреваю, что:
Не могли бы вы сказать нам, сколько времени требуется для выполнения запроса
select version()
? Если должно быть мгновенным (0,16мс на моей рабочей станции).источник
Если КАЖДЫЙ запрос намного медленнее, значит что-то не так с сервером или чем-то еще. По моему опыту, каждая база данных имеет несколько вещей, в которых она лучше других, но с точки зрения производительности pgsql легко находится в той же области, что и сервер mssql.
Итак, на какой ОС вы запускаете pgsql? Какое оборудование? Какие настройки вы уже изменили? Насколько большой ваш набор данных? Что является примером плохого запроса и вывода объяснения анализа (Запустите ваш запрос следующим образом:
объяснить, проанализировать, выбрать ... остальную часть запроса здесь ...;
Опубликовать вывод на http://explain.depesz.com/ и разместить ссылку здесь.
источник