Postgres 10 lub nowszy
btree_gist
teraz obejmuje również typ danych uuid
, jak Paweł skomentował
. (I kilka innych typów danych, szczególnie wszystkie enum
typy.)
Teraz wszystko, co musisz zrobić:zainstaluj rozszerzenie raz na bazę danych:
CREATE EXTENSION btree_gist;
Wtedy twój indeks powinien po prostu działać.
Powiązane:
- Ograniczenie wykluczenia kolumny ciągu bitowego z bitowym operatorem AND
- Tworzenie indeksu wielokolumnowego w PostgreSQL, zawierającego zarówno kolumny skalarne, jak i tablicowe
Postgres 9.6 lub starszy
(Oryginalna odpowiedź.)
Zwykle sugerowałbym dodatkowy moduł btree_gist
, ale typ uuid
jest nie objęte tym.
Teoretycznie, ponieważ UUID to a 128-bit quantity
(w dokumentacji
), najbardziej efektywnym sposobem byłoby przekonwertowanie go na dwa bigint
lub float8
do celów indeksu. Ale żaden z tych rzutów nie jest zdefiniowany w standardowym Postgresie.
Udało mi się znaleźć w tym kierunku na liście pqsql-hackerów , ale wydaje się, że się nie udało.
Pozostała opcja to funkcjonalny indeks GiST w text
reprezentacja:
CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));
Aby skorzystać z tego indeksu funkcjonalnego, zapytania muszą pasować do tego wyrażenia. Możesz użyć skrótu "value"::text
w zapytaniach (ale nie w definicji indeksu bez dodawania kolejnych nawiasów).
Na marginesie:nie używaj value
jako nazwa kolumny jest to zastrzeżone słowo w standardowym SQL .
Pytanie brzmi:dlaczego czy potrzebujesz indeksu GiST. Najlepsze rozwiązanie zależy od celu.