1

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

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

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

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

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

  • SET pg_trgm.similarity_threshold = 0.2;
  • SELECT set_limit(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;

任何帮助都深表感谢。

4

1 回答 1

2

我不确定,如果我对您的理解正确,但您可以尝试将 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()

于 2018-04-20T12:39:53.367 回答