Оптимизация запросов при ограничении количества индексов, которые я могу использовать - PullRequest
0 голосов
/ 27 марта 2020

У меня есть запрос, который включает объединение трех таблиц. Пусть эти таблицы будут A, B и C. A и C имеют первичный ключ, и они присоединяются через равное соединение к B, используя 2 внешних ключа, которые имеет B. Оптимальной стратегией индексирования было бы использование 4 индексов для всех 4 ключей. Тем не менее, я ограничен числом индексов, которые я могу построить .. (по причинам, которые у меня были, скорее, не go).

Размер таблиц таков, что B имеет 6 миллионов строк. А имеет 10 тысяч, а C имеет 100 тысяч строк.

Мой вопрос заключается в том, должен ли я создавать отдельные индексы для обоих внешних ключей B (для таблицы A и таблицы C) или для меня создание составного индекса для внешних ключей таблицы B.

Размер индекса не является серьезной проблемой. Однако количество индексов должно быть минимизировано при сохранении производительности. Существуют также некоторые условия фильтрации для атрибутов A, B и C.

Примечание: База данных PostgreSQL 12 и ограничена в shared_buffer_space.

Редактировать Структура запроса:

SELECT A.a1, A.a2, B.b1, B.b2, C.c1, C.c2 
FROM 
   A INNER JOIN B ON A.a3=B.b3 AND A.a5 = <some value> AND B.b6 = <some value>
     INNER JOIN C ON B.b4=C.c4 AND C.c7 = <some value> AND C.c8 = <some other value>; 

Мне было интересно, что еще можно сделать для оптимизации производительности запросов, включая, помимо прочего, индексирование и настройку Оптимизатора производительности. Соединения все на целых числах.

1 Ответ

0 голосов
/ 27 марта 2020

Если ваш запрос выглядит так:

select . . .
from b join
     a
     on a.a_id = b.a_id join
     c
     on c.c_id = b.c_id

Тогда дополнительные индексы на самом деле не нужны. Индексы первичного ключа на a и c достаточны.

...