gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:52:54 27 4
gpt4 key购买 nike

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

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

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

然而 %运算符使用 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() 而没有成功。在使用 % 之前未被调用运算符(operator):

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;

非常感谢任何帮助。

最佳答案

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

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()

关于sql - 在子查询 PostgreSQL 之前更改 GUC 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49941564/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com