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 дней.