Когда Postgres использует сканирование кучи растровых изображений для оценки запроса, включающего !
, это дает мне другие результаты, чем при выполнении seqscan.
Кто-нибудь может пролить свет на это? Простое включение / отключение bitmapscan изменяет результаты запроса, что для меня похоже на ошибку. Есть ли обходные пути? Я нашел один для моего игрушечного запроса ниже (используя NOT
), но для некоторых из сложных аргументов tsquery я не уверен, что смогу заставить это работать.
CREATE TABLE examples (content text);
CREATE INDEX ts_idx ON examples USING gin(to_tsvector('simple', content));
INSERT INTO examples VALUES ('Example with a word');
/* Incorrectly returns no results */
SET enable_seqscan = OFF;
SET enable_indexscan = OFF;
SET enable_bitmapscan = ON;
SELECT * FROM examples
WHERE to_tsvector('simple', content) @@ to_tsquery('simple', '!(example<->word)')
/* Correctly returns results */
SET enable_seqscan = OFF;
SET enable_indexscan = OFF;
SET enable_bitmapscan = OFF; /* disabled */
SELECT * FROM examples
WHERE to_tsvector('simple', content) @@ to_tsquery('simple', '!(example<->word)')
/* Also correctly returns results by using index and NOT keyword */
SET enable_seqscan = OFF;
SET enable_indexscan = OFF;
SET enable_bitmapscan = ON; /* enabled */
SELECT * FROM examples
WHERE NOT to_tsvector('simple', content) @@ to_tsquery('simple', '(example<->word)')
/* Latest version of Postgres 11 */
SELECT VERSION();
/* PostgreSQL 11.7 (Ubuntu 11.7-0ubuntu0.19.10.1) on x86_64-pc-linux-gnu,
compiled by gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008, 64-bit */