我正在使用PostgreSQL 10.1,直奔主题...
可以说我有一张桌子:
CREATE TABLE public.document (
id uuid PRIMARY KEY,
title text,
content text NOT NULL
);
连同上面的GIN INDEX:
CREATE INDEX document_idx ON public.document USING GIN(
to_tsvector(
'english',
content || ' ' || COALESCE(title, '')
)
);
还有一个基本的全文搜索查询:
SELECT * FROM public.document WHERE (
to_tsvector(
'english',
content || ' ' || COALESCE(title, '')
) @@ plainto_tsquery('english', fulltext_search_documents.search_text)
)
无论public.document表大小如何,查询(您已经知道)非常快!规划师使用 INDEX,一切都很好。
现在我通过RLS (Row Level Security)介绍一些基本的访问控制,首先我启用它:
ALTER TABLE public.document ENABLE ROW LEVEL SECURITY;
然后我添加策略:
CREATE POLICY document_policy ON public.document FOR SELECT
USING (EXISTS (
SELECT 1 FROM public.user WHERE (is_current_user) AND ('r' = ANY(privileges))
));
为了简单起见,is_current_user是另一个查询,它可以准确检查。
现在全文搜索查询被document_policy 查询展平,通过这样做,规划器执行序列扫描而不是索引扫描,导致查询速度降低 300 倍!
我认为这个问题很明显,我该如何解决这个问题,以便全文搜索查询保持快速?
提前致谢!