@Tregoreg zadał pytanie w komentarzu do swojej oferowanej nagrody:
Obecne odpowiedzi nie działają. Użycie indeksu GIN w kolumnie typu tablicowego nie zwiększa wydajności operatora ANY (). Czy naprawdę nie ma rozwiązania?
Zaakceptowana odpowiedź @ Franka mówi, że należy używać operatorów tablicowych , co nadal jest poprawne dla Postgres 11. Podręcznik:
... standardowa dystrybucja PostgreSQL zawiera klasę operatora GIN dla tablic, która obsługuje indeksowane zapytania przy użyciu tych operatorów:
<@
@>
=
&&
Pełna lista wbudowanych klas operatorów dla indeksów GIN w standardowej dystrybucji znajduje się tutaj.
W Postgres indeksy są powiązane z operatorami (które są zaimplementowane dla pewnych typów), a nie z samymi typami danych, funkcjami czy czymkolwiek innym. To dziedzictwo oryginalnego projektu Postgres Berkeley i bardzo trudne do zmiany. I ogólnie działa dobrze. Tutaj jest wątek na temat pgsql-bugs z komentarzem Tom'a Lane'a.
Niektóre funkcje PostGis (takie jak ST_DWithin()
) wydają się naruszać tę zasadę, ale tak nie jest. Te funkcje są przepisywane wewnętrznie, aby używać odpowiednich operatorów .
Indeksowane wyrażenie musi znajdować się po lewej stronie operatora. W przypadku większości operatorów (w tym wszystkich powyższych ) planista zapytań może to osiągnąć, odwracając operandy, jeśli umieścisz indeksowane wyrażenie po prawej stronie - zakładając, że COMMUTATOR
zdefiniowano a. ANY
Konstrukt może być stosowany w połączeniu z różnych operatorów i nie jest sama w sobie operatora. Gdy jest używany jako constant = ANY (array_expression)
tylko indeksy obsługujące =
operator na elementach tablicy , kwalifikowałby się i potrzebowalibyśmy komutatora = ANY()
. Indeksy GIN są wyłączone.
Postgres nie jest obecnie wystarczająco inteligentny, aby wyprowadzić z niego wyrażenie indeksowalne GIN. Na początek nieconstant = ANY (array_expression)
jest całkowicie równoważne z array_expression @> ARRAY[constant]
. Operatory tablicowe zwracają błąd, jeśli zaangażowane są jakiekolwiek elementy NULL , podczas gdy ANY
konstrukcja może obsłużyć NULL po obu stronach. Istnieją różne wyniki dla niezgodności typów danych.
Powiązane odpowiedzi:
Poza tym
Podczas pracy z integer
tablicami ( int4
nie int2
lub int8
) bez NULL
wartości (jak sugeruje twój przykład) rozważ dodatkowy moduł intarray
, który zapewnia wyspecjalizowane, szybsze operatory i obsługę indeksów. Widzieć:
Jeśli chodzi o UNIQUE
ograniczenie w twoim pytaniu, które pozostało bez odpowiedzi: jest zaimplementowane z indeksem btree na całej wartości tablicy (tak jak podejrzewasz) i wcale nie pomaga w wyszukiwaniu elementów . Detale:
jsonb
i indeksów? postgresql.org/docs/9.5/static/functions-json.html i postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING