Оптимизировать таблицы только для чтения в PostgreSQL - PullRequest
5 голосов
/ 15 сентября 2011

У меня есть много таблиц только для чтения в базе данных Postgres.Все эти таблицы могут быть запрошены с использованием любой комбинации столбцов.

Что можно сделать для оптимизации запросов?Полезно ли добавлять индексы ко всем столбцам во все таблицы?

Ответы [ 2 ]

12 голосов
/ 16 сентября 2011

Столбцы, которые используются для фильтрации или объединения (или, в меньшей степени, сортировка ) представляют интерес для индексации. Колонки, которые только что выбраны, едва уместны! Для следующего запроса могут быть полезны только индексы a и e :

SELECT a,b,c,d
  FROM tbl_a
 WHERE a = $some_value
   AND e < $other_value;

Здесь f и, возможно, c также являются кандидатами:

SELECT a,b,c,d
  FROM tbl_a
  JOIN tbl_b USING (f)
 WHERE a = $some_value
   AND e < $other_value
 ORDER BY c;

После создания индексов проверьте, действительно ли они полезны, с помощью EXPLAIN ANALYZE. Также сравните время выполнения с и без индексов. Удаление и воссоздание индексов происходит быстро и просто. Есть также параметры для эксперимента с EXPLAIN ANALYZE. Разница может быть ошеломляющей или не существующей.
Поскольку ваши таблицы предназначены только для чтения, обслуживание индекса обходится дешево. Это просто вопрос дискового пространства.

Если вы действительно хотите знать, что делаете, начните с чтения документов .

Если вы не знаете, каких запросов ожидать ...

  1. Попробуйте зарегистрировать достаточно запросов, чтобы найти типичные варианты использования. Для этого регистрируйте запросы с параметром log_statement = all. Или просто регистрируйте медленные запросы, используя log_min_duration_statement.

  2. Создайте индексов , которые могут быть полезны, и через некоторое время проверьте статистику, чтобы увидеть, что на самом деле используется. PostgreSQL имеет целую инфраструктуру для мониторинга статистики . Одним из удобных способов изучения статистики (и многих других задач) является pgAdmin , где вы можете выбрать свою таблицу / функцию / индекс и получить все данные на вкладке "статистика" в браузере объектов (главное окно).

  3. Выполните действия, описанные выше, чтобы увидеть, действительно ли используемые индексы ускоряют процесс.

  4. Если планировщик запросов должен выбрать один или несколько ваших индексов, но без каких-либо или неблагоприятных последствий, то, вероятно, что-то не так с вашей настройкой, и вам нужно изучить основы оптимизации производительности: вакуум, анализ, параметры стоимости, использование памяти, ...

0 голосов
/ 17 сентября 2011

Если вы используете фильтрацию по большему количеству индексов столбцов, может помочь, но не слишком сильно. Также индексы могут не помочь для небольших таблиц.

Сначала найдите «postgresql tuning» - вы найдете полезную информацию.

Если база данных может поместиться в памяти - купите достаточно оперативной памяти. Если база данных не помещается в памяти - SSD поможет. Если этого недостаточно и база данных доступна только для чтения - запустите 2, 3 или более серверов. Или разделить базу данных (в лучшем случае поместиться в памяти каждого сервера).

Даже если запросы генерируются, я думаю, они не будут случайными. Контролируйте базу данных на предмет медленных запросов и улучшайте только их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...