在子查询 PostgreSQL 之前更改 GUC 参数

Change GUC parameter before subquery PostgreSQL

我目前正在做这样的查询:

SELECT * FROM (
    (SELECT * from A WHERE first_name % 'fakeFirstName') 
    UNION 
    (SELECT * from B WHERE last_name % 'fakeLastName')
) AS result;

A 和 B 都是同一基础 table C 的视图,具有完全相同的列。

但是 % 运算符使用 GUC 参数 pg_trgm.similarity_threshold 来计算 first_name % 'fakeFirstName'last_name % 'fakeLastName',我的目标是在每个子查询之前更改此参数,因为这两列的相似度阈值不同。

要更改 pg_trgm.similarity_threshold 参数,例如值 0.2,我有两个选择:

我非常关心执行速度,这意味着我更愿意使用带有 GIN 索引的 % 操作而不是带有 GIST 索引的 <-> 操作符。

我尝试做类似下面的事情,但没有成功,因为函数 set_limit() 在使用 % 运算符之前没有被调用:

SELECT * FROM (
    (SELECT *, set_limit(0.2) from A WHERE first_name % 'fakeFirstName') 
    UNION 
    (SELECT *, set_limit(0.6) from B WHERE last_name % 'fakeLastName')
) AS result;

非常感谢任何帮助。

我不确定,如果我理解正确的话,但是你可以尝试加入 A 和 B 对抗 CTE set_limit(),例如:

t=# with a as (select set_limit(0.21))
, b as (select set_limit(0.22))
select show_limit(), 'a' from pg_database where datname = 't'
union
select show_limit(), 'b' from pg_database join a on true where datname = 't'
union
select show_limit(), 'c' from pg_database join b on true where datname = 't'
t-# order by 2;
 show_limit | ?column?
------------+----------
        0.2 | a
       0.21 | b
       0.22 | c
(3 rows)

另请注意,您不要将其改回原来的值,因此该值仍然是最后调用的值 set_limit()