создать несколько частичных индексов, сканируя только один раз (Postgresql)? - PullRequest
1 голос
/ 07 июня 2011

У меня есть таблица со статистикой по округам США.

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

CREATE INDEX county_stats_34_idx on stats_county (stateid, countyid, site, yeargroup, foo, bar)
WHERE stateid = 1;
CREATE INDEX county_stats_25_idx on stats_county (stateid, countyid, site, yeargroup, foo, bar)
WHERE stateid = 2;
...
CREATE INDEX county_stats_32_idx on stats_county (stateid, countyid, site, yeargroup, foo, bar)
WHERE stateid = 53;

Это будет сканировать каждую строку таблицы 53 раза, проверяя stateid и добавляя в индекс там, где это необходимо. Интересно - есть ли более эффективный способ создания этих индексов? По логике вещей, требуется для сканирования таблицы один раз с переключателем из 53 пунктов ...

Просто любопытно, поскольку мне кажется, что мне нужно будет делать подобные вещи с некоторой частотой ...

Спасибо!

1 Ответ

1 голос
/ 07 июня 2011

Если вы добавите индекс на stateid, PG не придется сканировать всю таблицу. Конечно, для построения этой таблицы нужно будет отсканировать всю таблицу, а для создания ваших фактических индексов потребуется отсканировать этот индекс.

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

Я думаю, вам следует попробовать создать простой индекс для stateid.

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