【发布时间】:2018-06-22 04:02:16
【问题描述】:
我正在使用 PostgreSQL 10.1,切入正题...
假设我有一个 TABLE:
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 查询 展平,这样规划器执行 Seq Scan 而不是 Index扫描会导致查询速度降低 300 倍!
我认为这个问题很明显,我该如何解决这个问题,以便全文搜索查询保持快速?
提前致谢!
【问题讨论】:
-
我认为这是 RLS 的已知限制。
标签: sql database postgresql row-level-security