当禁止位图扫描时,Postgres返回不同的结果。

问题描述 投票:0回答:1

当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 */
postgresql full-text-search tsvector
1个回答
0
投票

这被证实是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

© www.soinside.com 2019 - 2024. All rights reserved.