Postgresql - wydajność używania tablicy w dużej bazie danych

Powiedzmy, że mamy tabelę z 6 milionami rekordów. Jest 16 kolumn całkowitych i kilka kolumn tekstowych. Jest to tabela tylko do odczytu, więc każda kolumna liczb całkowitych ma indeks. Każdy rekord ma około 50-60 bajtów.

Nazwa tabeli to „Przedmiot”
Serwer to: 12 GB RAM, 1,5 TB SATA, 4 CORES. Cały serwer dla postgres.
W tej bazie danych jest dużo więcej tabel, więc RAM nie obejmuje całej bazy danych.

Chcę dodać do tabeli „Element” kolumnę „a_elements” (typ tablicy dużych liczb całkowitych). Każdy rekord miałby nie więcej niż 50–60 elementów w tej kolumnie.

Następnie utworzyłem indeks GIN w tej kolumnie, a typowe zapytanie powinno wyglądać tak:

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

Mam też drugą, bardziej klasyczną opcję.

Nie dodawaj kolumn a_elements do elementu tabeli, ale twórz elementy tabeli z dwiema kolumnami:

id_itemid_element

Ta tabela miałaby około 200 milionów rekordów.

Na tych tabelach mogę wykonywać partycjonowanie, więc liczba rekordów zmniejszyłaby się do 20 mln w elementach tabeli i 500 K w elemencie tabeli.

Drugie zapytanie opcji wygląda tak:

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

Zastanawiam się, jaka opcja byłaby lepsza z punktu widzenia wydajności. Czy postgres może używać wielu różnych indeksów z indeksem GIN (opcja 1) w pojedynczym zapytaniu?

Muszę podjąć dobrą decyzję, ponieważ import tych danych zajmie mi 20 dni.

questionAnswers(1)

yourAnswerToTheQuestion