Скажем, у нас есть таблица с 6 миллионами записей. Есть 16 целых столбцов и несколько столбцов текста. Это таблица только для чтения, поэтому каждый целочисленный столбец имеет индекс. Каждая запись составляет около 50-60 байт.
Название таблицы - "Item"
Сервер: 12 ГБ оперативной памяти, 1,5 ТБ SATA, 4 CORES. Весь сервер для postgres.
В этой базе данных еще много таблиц, поэтому операционная система не распространяется на всю базу данных.
Я хочу добавить в таблицу "Item" столбец "a_elements" (тип массива больших целых чисел) Каждая запись будет содержать не более 50-60 элементов в этом столбце.
После этого я создам индекс GIN в этом столбце, и типичный запрос должен выглядеть так:
select * from item where ...... and '{5}' <@ a_elements;
У меня есть второй, более классический вариант.
Не добавляйте столбец a_elements в элемент таблицы, но создавайте элементы таблицы с двумя столбцами:
- id_item
- id_element
В этой таблице будет около 200 млн записей.
Я могу сделать разбиение на эти таблицы, поэтому количество записей уменьшится до 20 миллионов в элементах таблицы и 500 K в элементе таблицы.
Второй вариант запроса выглядит следующим образом:
select item.*
from item
left join elements on (item.id_item=elements.id_item)
where ....
and 5 = elements.id_element
Интересно, какой вариант будет лучше с точки зрения производительности. Может ли postgres использовать множество разных индексов с индексом GIN (вариант 1) в одном запросе?
Мне нужно принять правильное решение, потому что импорт этих данных займет у меня 20 дней.