当Postgres使用位图堆扫描来评估一个包含了 !
当它执行seqscan的时候,它给我的结果是不同的。
谁能给我一些提示?简单地启用禁用bitmapscan就会改变查询结果,我觉得这是一个bug。有什么变通的办法吗?我在下面的玩具查询中找到了一个(使用 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 */
这被证实是Postgres <=11.7,<=12.2中的一个bug,将在未来的小版本中修复,每。
https:/www.postgresql.orgmessage-id27773.1587773551%40sss.pgh.pa.us
与候选补丁。
https:/www.postgresql.orgmessage-id16254.1587852873%40sss.pgh.pa.us