Вопрос:

Новичок PostgreSQL: настройка среды для запросов к большой существующей базе данных

postgresql postgresql-performance

31 просмотра

1 ответ

11 Репутация автора

Я новичок в реляционных базах данных, и мне нужна помощь в настройке базовой рабочей среды для запросов к большой (уже существующей) базе данных. Я подключился к нашему удаленному серверу через PGAdmin, но все мои базовые запросы выполняются очень медленно.

запрос

SELECT to_char(created, 'YYYY-MM-DD'), user_id 
FROM transactions
WHERE type = 'purchase'
AND created > NOW() AT TIME ZONE 'US/Mountain' - INTERVAL '1 month'
ORDER BY created;

EXPLAIN(BUFFERS, ANALYZE) выход:

Index Scan using payments_transaction_created_42e34d6ca1e04ffe_uniq
      on     payments_transaction  (cost=0.44..339376.18 rows=481811 width=24) (actual time=2.643..49422.733 rows=511058 loops=1)
Index Cond: (created > (timezone('US/Mountain'::text, now()) - '1 mon'::interval))
Filter: ((type)::text = 'purchase'::text)
Rows Removed by Filter: 955691
Buffers: shared hit=405597 read=295625 written=764
Planning time: 0.111 ms
Execution time: 49569.324 ms

Насколько я знаю, время исполнения кажется мне слишком длинным.

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

Помните, я новичок в базах данных, поэтому здесь нет слишком простых ответов.

Автор: gidgicken Источник Размещён: 22.08.2016 09:34

Ответы (1)


1 плюс

12571 Репутация автора

Ваш запрос, похоже, использует индекс transactions(created). Вы возвращаете около 0,5 млн. Строк, отбрасывая в 2 раза больше.

В зависимости от распределения ваших значений по typeстолбцу вы можете получить выгоду от добавления индекса для столбцов текста и отметки времени:

CREATE INDEX ON transactions(type, created);

Основное правило при добавлении индексов - сначала индексировать операторы равенства, а затем даты. На самом деле это может значительно ускорить ваш запрос - хотя, как я упоминал ранее, в зависимости от распределения значений.

Не забудьте обновить статистику таблицы после создания индекса, используя:

ANALYZE transactions;

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

Автор: Kamil Gosciminski Размещён: 22.08.2016 10:19
Вопросы из категории :
32x32