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_elementTa 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.