Изменить параметр 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()

Другие вопросы по тегам