在子查询 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,我有两个选择:
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;
非常感谢任何帮助。
我不确定,如果我理解正确的话,但是你可以尝试加入 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()
我目前正在做这样的查询:
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,我有两个选择:
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;
非常感谢任何帮助。
我不确定,如果我理解正确的话,但是你可以尝试加入 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()