Postgres многостолбцовый индекс с множеством столбцов против множества одиночных индексов - PullRequest
0 голосов
/ 03 августа 2020

У меня очень большая таблица с более чем двумя миллиардами строк и ~ 90 столбцами. Размер таблицы составляет 1,8 ТБ, и цель состоит в том, чтобы выполнить запрос для любого отдельного столбца или комбинации столбцов в кратчайшие сроки. Данные не будут обновлены, и новые строки не будут вставлены. Большая часть данных - это строки, и возможно, что будет использован полнотекстовый поиск. после наблюдения за производительностью запроса и более подробного ознакомления с ним я узнал, что имеет значение только первый столбец индекса, и если в предложении WHERE не используется столбец, который является первым - это неоптимально.

Doing explain analyze select * from data where person_name = 'Joe Smith' возвращает, что он использует один из 32 индексов столбцов, но запрос по-прежнему намного длиннее, чем я ожидал бы с индексом. Объясните результат анализа ниже

Index Scan using data_personid_idx on data  (cost=0.83..321155265.68 rows=22580 width=2805) (actual time=981.260..3164759.559 rows=216 loops=1)
  Index Cond: ((person_name)::text = 'Joe Smith'::text)
Planning Time: 0.145 ms
JIT:
  Functions: 4
  Options: Inlining true, Optimization true, Expressions true, Deforming true
  Timing: Generation 1.373 ms, Inlining 188.532 ms, Optimization 146.744 ms, Emission 234.549 ms, Total 571.198 ms
Execution Time: 3165416.950 ms

Поможет ли нам в этом разделение больших индексов? Я занимаюсь созданием единого индекса для столбца person_name, но, как вы понимаете, это занимает много времени с такой большой таблицей, и мне было интересно, есть ли лучший способ ускорить время запроса. Может быть, даже использование индекса GIN поможет в сценарии полнотекстового поиска ios?

...