我在让查询规划器为启用行级安全性 (RLS) 的表编写良好的计划时遇到一些麻烦。似乎所需要做的就是从启用行级安全性的表到启用非行级安全性的表的联接来强制执行错误的计划,即使规划器应该能够使用两个表上都有适当的索引。
有没有办法帮助规划者解决这个问题?或者当涉及 RLS 时某些统计数据不可用?
USING (TRUE)
我尝试为不需要 RLS 的表启用 RLS(使用 添加广泛开放的策略),这与在该表上不包含策略具有相同的效果。
DROP SCHEMA IF EXISTS foo CASCADE;
CREATE SCHEMA foo;
CREATE TABLE foo.bar AS
SELECT generate_series(1,10000000) AS id, md5(random()::text) AS descr, random() * 5 + 1 AS licflag;
CREATE TABLE foo.baz AS
SELECT generate_series(1,10000000) AS id, md5(random()::text) AS descr, random() * 5 + 1 AS licflag;
CREATE UNIQUE INDEX ON foo.bar (id);
CREATE INDEX ON foo.bar (licflag);
CREATE UNIQUE INDEX ON foo.baz (id);
CREATE INDEX ON foo.baz (licflag); …
Run Code Online (Sandbox Code Playgroud) postgresql performance row-level-security sql-execution-plan
不确定这在 PostgreSQL 9.3+ 中是否可行,但我想在非唯一列上创建唯一索引。对于这样的表:
CREATE TABLE data (
id SERIAL
, day DATE
, val NUMERIC
);
CREATE INDEX data_day_val_idx ON data (day, val);
Run Code Online (Sandbox Code Playgroud)
我希望能够[快速]仅查询不同的日期。我知道我可以用来data_day_val_idx
帮助执行不同的搜索,但如果不同值的数量大大少于索引覆盖中的行数,这似乎会增加额外的开销。就我而言,大约每 30 天就有 1 个是明显的。
创建关系表以仅跟踪唯一条目是我唯一的选择吗?思维:
CREATE TABLE days (
day DATE PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)
并在每次插入数据时使用触发器更新它。
如何确保我的全文搜索结果按完全匹配和 THEN 前缀匹配排序?
SELECT ticker, name, ts_rank(document, to_tsquery('english', 'MAT:*')) AS rank
FROM (
SELECT *, setweight(to_tsvector('english', ticker), 'A') || setweight(to_tsvector('english', name), 'B') AS document
FROM ( VALUES
('MATI-R' , 'MATICHON PCL.NVDR')
,('MATCH-R', 'MATCHING MAXIMIZE SLN. NVDR')
,('MATV' , 'MATAV-CABLE SYS.MEDIA SPN.ADR 1:2 DEAD - DELIST.03/07/06')
,('MAT' , 'MATISSE HOLDINGS DEAD - 03/10/06')
,('MAT' , 'MATTEL')
) data (ticker,name)
) ss ORDER BY rank DESC
Run Code Online (Sandbox Code Playgroud)
我尝试了一些的建议上https://www.postgresql.org/docs/9.5/static/datatype-textsearch.html像to_tsquery('english', 'MAT:A & MAT:*B')
,但没有人可以给我,我要找的排序。当前输出为
ticker | name | rank
---------+----------------------------------------------------------+----------
MATI-R | …
Run Code Online (Sandbox Code Playgroud)