Пример (
https://www.db-fiddle.com/f/bZRFDcpt8DfvLPUBuMEi7t/0):
CREATE TABLE test (id SERIAL, array_field INT[]);
CREATE INDEX test_arr ON test USING gin (array_field);
INSERT INTO test (array_field)
SELECT ARRAY[round(random()*10000), round(random()*10000), round(random()*10000)]::int[]
FROM generate_series(1, 1000000);
ANALYZE test;
SET enable_seqscan = OFF;
-- NOT USED
EXPLAIN ANALYZE SELECT * FROM test WHERE 10 = ANY(array_field);
-- USED
EXPLAIN ANALYZE SELECT * FROM test WHERE ARRAY[10]::int[] <@ array_field;
Два последний запроса идентичны, однако постгрес не хочет использовать индекс в первом случае. Почему? Если это какое-то ограничение, то с чем оно связано?