PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres łączący wiele indeksów

Nie wiem, czy Pg może łączyć indeks GiST i zwykłe indeksy b-drzewa ze skanowaniem indeksu bitmapy, ale podejrzewam, że nie. Możesz uzyskać najlepszy możliwy wynik bez dodawania user_id kolumnę do indeksu GiST (i w konsekwencji powiększając ją i zwalniając dla innych zapytań, które nie używają user_id ).

W ramach eksperymentu możesz:

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

co prawdopodobnie spowoduje duży indeks, ale może wzmocnić to zapytanie - jeśli zadziała. Pamiętaj, że utrzymanie takiego indeksu znacznie spowolni INSERT i UPDATE s. Jeśli porzucisz stary ix_coords Twoje zapytania będą używać ix_coords_and_user_id nawet jeśli nie filtrują według user_id , ale będzie wolniejszy niż ix_coords . Zachowanie obu spowoduje, że INSERT i UPDATE spowolnienie jeszcze gorsze.

Zobacz btree-gist

(Przestarzałe przez edycję pytania, które całkowicie zmienia pytanie; po zapisaniu użytkownik miał indeks wielokolumnowy, został teraz podzielony na dwa oddzielne ):

Wygląda na to, że nie filtrujesz ani nie sortujesz według user_id , tylko create_date . Pg nie będzie (nie może?) używać tylko drugiego terminu indeksu wielokolumnowego, takiego jak (user_id, create_date) , wymaga również użycia pierwszego elementu.

Jeśli chcesz zindeksować create_date , utwórz dla niego osobny indeks. Jeśli używasz i potrzebujesz (user_id, create_date) indeksuj i zazwyczaj nie używaj tylko user_id sam, sprawdź, czy możesz odwrócić kolejność kolumn. Alternatywnie utwórz dwa niezależne indeksy, (user_id) i (create_date) . Gdy potrzebne są obie kolumny, Pg może połączyć dwa niezależne indeksy za pomocą skanowania indeksu bitmapy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy używanie tablic w bazie danych to zły projekt?

  2. INSERT INTO ... RETURNING - niejednoznaczne odniesienie do kolumny

  3. Wdrażanie Django + Python 3 + PostgreSQL do AWS Elastic Beanstalk

  4. Oracle Cast i MULTISET dostępne w POSTGRES

  5. zaktualizować wiele wierszy w jednym zapytaniu, ale dane wejściowe, których oczekujemy, pochodzą z obiektu json z wieloma danymi