GIN-Index für Spalte smallint [] nicht verwendet oder Fehler "Operator ist nicht eindeutig"

create table test(
    id serial primary key,
    tagged smallint[]
);

Es gibt einen Gin-Index fürtagged Spalte, mit_int2_ops Bedienerklasse:

CREATE INDEX ix ON test USING GIN(col _int2_ops);

Wenn ich diese Abfrage starte:

select * from test
where tagged @> ARRAY[11]
order by id limit 100;

EXPLAIN ANALYZE zeigt an

Limit  (cost=0.43..19524.39 rows=100 width=36) (actual time=25024.124..25027.263 rows=100 loops=1)
  ->  Index Scan using test_pkey on test  (cost=0.43..508404.37 rows=2604 width=36) (actual time=25024.121..25027.251 rows=100 loops=1)
        Filter: ((tagged)::integer[] @> '{11}'::integer[])
        Rows Removed by Filter: 2399999
Planning time: 6.912 ms
Execution time: 25027.307 ms

Fettdruck meine. Warum ist dertagged Spalte konvertiert zuinteger[] Art? Ich denke, dies ist der Grund, warum GIN der Index nicht verwendet wird und die Abfrage langsam läuft.

Ich habe es versuchtWHERE tagged @> ARRAY[11]::smallint[] bekam aber diesen Fehler:

operator is not unique: smallint[] @> smallint[]

Wenn ich dasselbe mache, aber @ benuttagged int[] und erstelle einen Index als

CREATE INDEX ix ON test USING GIN(tagged gin__int_ops);

dann verwendet die obige Abfrage den GIN-Index:

"->  Bitmap Index Scan on ix  (cost=0.00..1575.53 rows=2604 width=0) (actual time=382.840..382.840 rows=2604480 loops=1)"
"   Index Cond: (tagged @> '{11}'::integer[])"

Dies ist etwas schneller als vorher, aber es dauert durchschnittlich 10 Sekunden - immer noch zu langsam. Ich möchte es versuchensmallint[] Anstatt vonint[], vielleicht geht das schneller ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage