我有tsvector列的表,我也为该列创建索引。此外,我还有一些搜索所需的列(以及这些列的索引)。
例如:
表:职位空缺
列:标题,描述(标题+描述= tsvector),工资(带索引的int值)。
我想找到所有空缺的文字,其中包含标题+描述以及工资> 1000。
哪一列是第一个条件。
SELECT *
FROM vacancies
WHERE title_description_tsvector @@ plainto_tsquery('php developer')
AND salary > 1000;
OR
SELECT *
FROM vacancies
WHERE salary > 1000
AND title_description_tsvector @@ plainto_tsquery('php developer');
答案 0 :(得分:1)
更改WHERE
中的顺序不会影响优化器的决策。
如果由于某种原因你想要强制它将一个索引的肉体状态与另一个相比(例如,你检查了计划并看到它使用salary
索引然后Filter: (title_description_tsvector @@ plainto_tsquery('php developer'))
所以你不会看到你在title_description_tsvector
上的索引,你觉得优化器是错误的)。所以你想让它首先选择想要的索引(比如Oracle中的提示),你可以使用CTE来试试它,比如:
EXPLAIN
WITH pre as (SELECT *
FROM vacancies
WHERE title_description_tsvector @@ plainto_tsquery('php developer')
)
SELECT *
FROM pre
WHERE salary > 1000;
我很确定成本会更高。如果没有 - 时间检查autovacuum