Изменить параметр GUC перед подзапросом PostgreSQL
В настоящее время я делаю такой запрос:
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;
Любая помощь высоко ценится.
1 ответ
Я не уверен, правильно ли я вас понимаю, но вы можете попробовать объединить 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()