Postgresql - производительность использования массива в большой базе данных

Допустим, у нас есть таблица с 6 миллионами записей. Есть 16 целочисленных столбцов и несколько текстовых столбцов. Это таблица только для чтения, поэтому у каждого целочисленного столбца есть индекс. Каждая запись составляет около 50-60 байт.

Имя таблицы - «Элемент»
Сервер: 12 ГБ ОЗУ, 1,5 ТБ SATA, 4 CORES. Весь сервер для postgres.
В этой базе данных еще много таблиц, поэтому ОЗУ не охватывает всю базу данных.

Я хочу добавить в таблицу & quot; Элемент & quot; столбец "a_elements" (тип массива больших целых чисел) Каждая запись будет содержать не более 50-60 элементов в этом столбце.

После этого я бы создал индекс GIN для этого столбца, и типичный запрос должен выглядеть так:

select * from item where ...... and '{5}' <@ a_elements;

У меня есть и второй, более классический вариант.

Не добавляйте столбец a_elements к элементу таблицы, но создайте элементы таблицы с двумя столбцами:

id_item id_element

Эта таблица будет содержать около 200 миллионов записей.

Я могу сделать разбиение по этим таблицам, чтобы количество записей сократилось до 20 млн в элементах таблицы и до 500 К в элементе таблицы.

Второй вариант запроса выглядит так:

select item.* 
from item 
    left join elements on (item.id_item=elements.id_item) 
where .... 
and 5 = elements.id_element

Интересно, какой вариант будет лучше с точки зрения производительности. Может ли postgres использовать много разных индексов с индексом GIN (вариант 1) в одном запросе?

Мне нужно принять правильное решение, потому что импорт этих данных займет у меня 20 дней.

Ответы на вопрос(1)

Ваш ответ на вопрос