F.40. pg_hint_plan#
F.40. pg_hint_plan
F.40.1. О расширении pg_hint_plan
Версия: 1.5.2
Авторское право (c) 2012-2023, КОРПОРАЦИЯ NIPPON TELEGRAPH AND TELEPHONE
F.40.2. Краткий обзор
pg_hint_plan
позволяет настраивать
планы выполнения Tantor SE с использованием так называемых “подсказок” в
комментариях SQL, например /*+ SeqScan(a) */
.
Tantor SE использует оптимизатор на основе стоимости, который использует статистику данных, а не статические правила. Планировщик (оптимизатор) оценивает стоимость каждого возможного плана выполнения для SQL-запроса, затем план выполнения с наименьшей стоимостью в конечном итоге выполняется. Планировщик делает все возможное, чтобы выбрать наилучший план выполнения, но не всегда получается выбрать оптимальный план, поскольку он не учитывает некоторые свойства данных, например, корреляцию между столбцами.
F.40.3. Описание
F.40.3.1. Основное использование
pg_hint_plan
читает фразы подсказок в комментарии специальной формы, заданной
SQL-выражением. Подсказка может быть указана, если она начинается с последовательности
"/\*+"
и заканчивается "\*/"
. Фразы подсказок состоят из имен подсказок
и параметров, заключенных в скобки и разделенных пробелами. Фразы
подсказок могут использовать переводы строк для удобочитаемости.
В приведенном ниже примере в качестве метода соединения выбран хеш-соединение, при этом выполняется последовательное сканирование pgbench_accounts
:
=# /*+ HashJoin(a b) SeqScan(a) */ EXPLAIN SELECT * FROM pgbench_branches b JOIN pgbench_accounts a ON b.bid = a.bid ORDER BY a.aid; QUERY PLAN --------------------------------------------------------------------------------------- Sort (cost=31465.84..31715.84 rows=100000 width=197) Sort Key: a.aid -> <b>Hash Join</b> (cost=1.02..4016.02 rows=100000 width=197) Hash Cond: (a.bid = b.bid) -> <b>Seq Scan on pgbench_accounts a</b> (cost=0.00..2640.00 rows=100000 width=97) -> Hash (cost=1.01..1.01 rows=1 width=100) -> Seq Scan on pgbench_branches b (cost=0.00..1.01 rows=1 width=100) (7 rows)
F.40.4. Таблица подсказок
Подсказки могут быть указаны в комментарии, однако это может быть неудобно в случае, когда запросы нельзя редактировать. В этом случае подсказки могут быть размещены в специальной таблице с именем "hint_plan.hints"
. Таблица состоит из следующих столбцов:
столбец | описание |
---|---|
id
| Уникальный номер для идентификации строки подсказки. Эта колонка заполняется автоматически по последовательности. |
norm_query_string
| Шаблон, соответствующий запросу, к которому будет применена подсказка. Константы в запросе заменяются на “?”, как в следующем примере. |
application_name
|
Значение application_name , где сессии могут применить подсказку.
Подсказка в примере ниже применяется к сессиям, подключенным из psql.
Пустая строка означает, что все сессии будут применять подсказку.
|
hints
| Фраза подсказки. Это должна быть серия подсказок, исключая окружающие знаки комментариев. |
Следующий пример показывает, как работать с таблицей подсказок.
=# INSERT INTO hint_plan.hints(norm_query_string, application_name, hints) VALUES ( 'EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = ?;', '', 'SeqScan(t1)'); INSERT 0 1 =# UPDATE hint_plan.hints SET hints = 'IndexScan(t1)' WHERE id = 1; UPDATE 1 =# DELETE FROM hint_plan.hints WHERE id = 1; DELETE 1
Таблица подсказок принадлежит владельцу расширения и имеет те же
привилегии по умолчанию, что и на момент её создания, во время CREATE EXTENSION
.
Подсказки в таблице подсказок имеют приоритет над подсказками в комментариях.
F.40.4.1. Типы подсказок
Подсказочные фразы классифицируются на несколько типов в зависимости от того, какой объект и как они могут повлиять на планировщик. См. Список подсказок для получения более подробной информации.
F.40.4.1.1. Подсказки для методов сканирования
Подсказки метода сканирования обеспечивают использование конкретных методов сканирования для
целевой таблицы. pg_hint_plan
распознает
целевую таблицу по псевдонимам, если они есть. Это, например,
SeqScan
или IndexScan
.
Подсказки сканирования работают с обычными таблицами, таблицами наследования, НЕЖУРНАЛИРУЕМЫМИ таблицами, временными таблицами и системными каталогами. Внешние (удаленные) таблицы, табличные функции, конструкция VALUES, CTE, представления и подзапросы не затрагиваются.
=# /*+ SeqScan(t1) IndexScan(t2 t2_pkey) */ SELECT * FROM table1 t1 JOIN table table2 t2 ON (t1.key = t2.key);
F.40.4.1.2. Подсказки по методам соединения
Подсказки метода соединения обеспечивают методы соединения для соединений, включающих указанные таблицы.
Это может повлиять на соединения только на обычных таблицах. Таблицы наследования, НЕЖУРНАЛИРУЕМЫЕ таблицы, временные таблицы, внешние (иностранные) таблицы, системные каталоги, табличные функции, результаты команды VALUES и CTE разрешены в списке параметров. Соединения на представлениях и подзапросах не затрагиваются.
F.40.4.1.3. Подсказки для порядка соединения
Эта подсказка, называемая «Leading», задает порядок соединения двух или более таблиц. Существует два метода его задания. Первый метод задает конкретный порядок соединения, но не ограничивает направление на каждом уровне соединения. Второй метод дополнительно задает направление соединения. См. список подсказок для получения более подробной информации. Например:
=# /*+ NestLoop(t1 t2) MergeJoin(t1 t2 t3) Leading(t1 t2 t3) */ SELECT * FROM table1 t1 JOIN table table2 t2 ON (t1.key = t2.key) JOIN table table3 t3 ON (t2.key = t3.key);
F.40.4.1.4. Подсказки для исправления номера строки
Эта подсказка, названная “Rows”, изменяет оценку количества строк при соединениях, которая исходит из ограничений в планировщике. Например:
=# /*+ Rows(a b #10) */ SELECT... ; Sets rows of join result to 10 =# /*+ Rows(a b +10) */ SELECT... ; Increments row number by 10 =# /*+ Rows(a b -10) */ SELECT... ; Subtracts 10 from the row number. =# /*+ Rows(a b *10) */ SELECT... ; Makes the number 10 times larger.
F.40.4.1.5. Подсказки для параллельных планов
Эта подсказка, названная Parallel
, обеспечивает
конфигурацию параллельного выполнения на сканах. Третий параметр
указывает степень принуждения.
soft
означает, что
pg_hint_plan
изменяет только
max_parallel_worker_per_gather
и оставляет
все остальные параметры планировщику для установки. hard
изменяет другие параметры планировщика, чтобы принудительно применить
обновление. Это может повлиять на обычные таблицы, родительские таблицы наследования,
незарегистрированные таблицы и системные каталоги. Внешние таблицы, табличные
функции, VALUES
выражения, CTE, представления и
подзапросы не затрагиваются. Внутренние таблицы представления могут быть
указаны по их реальному имени или псевдониму как целевой объект.
Следующий пример показывает, что запрос применяется
по-разному к каждой таблице:
=# EXPLAIN /*+ Parallel(c1 3 hard) Parallel(c2 5 hard) */ SELECT c2.a FROM c1 JOIN c2 ON (c1.a = c2.a); QUERY PLAN ------------------------------------------------------------------------------- Hash Join (cost=2.86..11406.38 rows=101 width=4) Hash Cond: (c1.a = c2.a) -> Gather (cost=0.00..7652.13 rows=1000101 width=4) Workers Planned: 3 -> Parallel Seq Scan on c1 (cost=0.00..7652.13 rows=322613 width=4) -> Hash (cost=1.59..1.59 rows=101 width=4) -> Gather (cost=0.00..1.59 rows=101 width=4) Workers Planned: 5 -> Parallel Seq Scan on c2 (cost=0.00..1.59 rows=59 width=4) =# EXPLAIN /*+ Parallel(tl 5 hard) */ SELECT sum(a) FROM tl; QUERY PLAN ----------------------------------------------------------------------------------- Finalize Aggregate (cost=693.02..693.03 rows=1 width=8) -> Gather (cost=693.00..693.01 rows=5 width=8) Workers Planned: 5 -> Partial Aggregate (cost=693.00..693.01 rows=1 width=8) -> Parallel Seq Scan on tl (cost=0.00..643.00 rows=20000 width=4)
F.40.4.1.6. Параметры GUC, установленные во время планирования
Set
подсказки изменяют параметры GUC только во время
планирования. Параметры GUC, показанные в
Раздел 19.7, могут иметь ожидаемые эффекты на планирование,
если только другая подсказка не конфликтует с параметрами конфигурации метода планировщика.
Когда несколько подсказок изменяют один и тот же GUC, последняя подсказка вступает в силу.
Параметры GUC
для pg_hint_plan
также могут быть установлены
этой подсказкой, но это может не сработать, как ожидалось. См.
Функциональные
ограничения для подробностей.
=# /*+ Set(random_page_cost 2.0) */ SELECT * FROM table1 t1 WHERE key = 'value'; ...
F.40.4.2. Параметры GUC для pg_hint_plan
Следующие параметры GUC влияют на поведение
pg_hint_plan
:
Название параметра | Описание | По умолчанию |
---|---|---|
pg_hint_plan.enable_hint
|
True включает pg_hint_plan .
|
on
|
pg_hint_plan.enable_hint_table
| True включает подсказки по таблице. |
off
|
pg_hint_plan.parse_messages
|
Определяет уровень журнала ошибок разбора подсказок. Допустимые
значения: error ,
warning , notice ,
info , log ,
debug .
|
INFO
|
pg_hint_plan.debug_print
|
Управляет отладочной печатью и подробностью. Допустимые значения:
off , on ,
detailed и
verbose .
|
off
|
pg_hint_plan.message_level
|
Указывает уровень сообщений для отладки. Допустимые значения:
error ,
warning , notice ,
info , log ,
debug .
|
INFO
|
F.40.5. Установка
В этом разделе описываются шаги установки.
F.40.5.1. Загрузка pg_hint_plan
pg_hint_plan
не требует
CREATE EXTENSION
. Загрузка его с помощью команды
LOAD
активирует его, и, конечно, вы можете загрузить его глобально, установив
shared_preload_libraries
в
postgresql.conf
. Или вам может быть интересно
ALTER USER SET
/ALTER DATABASE SET
для автоматической загрузки в определенных сессиях.
postgres=# LOAD 'pg_hint_plan'; LOAD postgres=#
Выполните CREATE EXTENSION
и
SET pg_hint_plan.enable_hint_table TO on
, если
вы планируете использовать таблицу подсказок.
F.40.6. Подробности в подсказке
F.40.6.1. Синтаксис и размещение
pg_hint_plan
читает подсказки только из первого
блочного комментария и прекращает разбор с любых символов, кроме
буквенных символов, цифр, пробелов, подчеркиваний, запятых и
круглых скобок. В следующем примере,
HashJoin(a b)
и
SeqScan(a)
разбираются как подсказки, но
IndexScan(a)
и
MergeJoin(a b)
не разбираются:
=# /*+ HashJoin(a b) SeqScan(a) */ /*+ IndexScan(a) */ EXPLAIN SELECT /*+ MergeJoin(a b) */ * FROM pgbench_branches b JOIN pgbench_accounts a ON b.bid = a.bid ORDER BY a.aid; QUERY PLAN --------------------------------------------------------------------------------------- Sort (cost=31465.84..31715.84 rows=100000 width=197) Sort Key: a.aid -> Hash Join (cost=1.02..4016.02 rows=100000 width=197) Hash Cond: (a.bid = b.bid) -> Seq Scan on pgbench_accounts a (cost=0.00..2640.00 rows=100000 width=97) -> Hash (cost=1.01..1.01 rows=1 width=100) -> Seq Scan on pgbench_branches b (cost=0.00..1.01 rows=1 width=100) (7 rows)
F.40.6.2. Использование с PL/pgSQL
pg_hint_plan
работает для запросов в скриптах PL/pgSQL с некоторыми ограничениями.
Подсказки влияют только на следующие виды запросов:
Запросы, которые возвращают одну строку (
SELECT
,INSERT
,UPDATE
иDELETE
)Запросы, которые возвращают несколько строк (
RETURN QUERY
)Динамические SQL-запросы. (
EXECUTE
)Открыть курсор. (
OPEN
)Цикл по результату запроса (
FOR
)
Подсказка должна быть размещена после первого слова в запросе, так как предшествующие комментарии не отправляются как часть этого запроса.
=# CREATE FUNCTION hints_func(integer) RETURNS integer AS $$ DECLARE id integer; cnt integer; BEGIN SELECT /*+ NoIndexScan(a) */ aid INTO id FROM pgbench_accounts a WHERE aid = $1; SELECT /*+ SeqScan(a) */ count(*) INTO cnt FROM pgbench_accounts a; RETURN id + cnt; END; $$ LANGUAGE plpgsql;
F.40.6.3. Обработка прописных и строчных букв в именах объектов
В отличие от того, как Tantor SE обрабатывает имена объектов,
pg_hint_plan
сравнивает простые имена объектов в
подсказках с внутренними именами объектов базы данных с учетом регистра. Поэтому имя объекта TBL в подсказке соответствует
только “TBL” в базе данных и не соответствует никаким
некавычным именам, таким как TBL, tbl или Tbl.
F.40.6.4. Экранирование специальных символов в именах объектов
Объекты, определенные в параметре подсказки, могут использовать двойные кавычки, если они содержат скобки, двойные кавычки и пробелы. Правила экранирования такие же, как в Tantor SE.
F.40.6.5. Различие между несколькими вхождениями таблицы
pg_hint_plan
идентифицирует целевой объект, используя псевдонимы, если они есть. Это поведение полезно для указания на конкретное вхождение среди нескольких вхождений одной таблицы.
=# /*+ HashJoin(t1 t1) */ EXPLAIN SELECT * FROM s1.t1 JOIN public.t1 ON (s1.t1.id=public.t1.id); INFO: hint syntax error at or near "HashJoin(t1 t1)" DETAIL: Relation name "t1" is ambiguous. ... =# /*+ HashJoin(pt st) */ EXPLAIN SELECT * FROM s1.t1 st JOIN public.t1 pt ON (st.id=pt.id); QUERY PLAN --------------------------------------------------------------------- Hash Join (cost=64.00..1112.00 rows=28800 width=8) Hash Cond: (st.id = pt.id) -> Seq Scan on t1 st (cost=0.00..34.00 rows=2400 width=4) -> Hash (cost=34.00..34.00 rows=2400 width=4) -> Seq Scan on t1 pt (cost=0.00..34.00 rows=2400 width=4)
F.40.6.6. Подлежащие таблицы представлений или правил
Подсказки не применимы к представлениям, но они могут повлиять на запросы внутри представления, если имена объектов совпадают с именами в развернутом запросе на представление. Присвоение псевдонимов таблицам в представлении позволяет манипулировать ими извне представления.
=# CREATE VIEW v1 AS SELECT * FROM t2; =# EXPLAIN /*+ HashJoin(t1 v1) */ SELECT * FROM t1 JOIN v1 ON (c1.a = v1.a); QUERY PLAN ------------------------------------------------------------------ Hash Join (cost=3.27..18181.67 rows=101 width=8) Hash Cond: (t1.a = t2.a) -> Seq Scan on t1 (cost=0.00..14427.01 rows=1000101 width=4) -> Hash (cost=2.01..2.01 rows=101 width=4) -> Seq Scan on t2 (cost=0.00..2.01 rows=101 width=4)
F.40.6.7. Наследование
Подсказки могут указывать только на родителя дерева наследования, и подсказки влияют на все таблицы в дереве наследования. Подсказки, указывающие непосредственно на унаследованных потомков, не имеют эффекта.
F.40.6.8. Подсказки в многооператорных выражениях
Один многооператорный запрос может иметь ровно один комментарий-подсказку, и подсказка влияет на все отдельные операторы в многооператорном запросе.
F.40.6.9. Значения выражений
VALUES
выражения в FROM
предложении называются как *VALUES*
внутренне, они
могут быть указаны, если это единственное VALUES
в
запросе. Два или более выражений VALUES
в
запросе не могут быть различены при просмотре результата
EXPLAIN
, что приводит к неоднозначным
результатам:
=# /*+ MergeJoin(*VALUES*_1 *VALUES*) */ EXPLAIN SELECT * FROM (VALUES (1, 1), (2, 2)) v (a, b) JOIN (VALUES (1, 5), (2, 8), (3, 4)) w (a, c) ON v.a = w.a; INFO: pg_hint_plan: hint syntax error at or near "MergeJoin(*VALUES*_1 *VALUES*) " DETAIL: Relation name "*VALUES*" is ambiguous. QUERY PLAN ------------------------------------------------------------------------- Hash Join (cost=0.05..0.12 rows=2 width=16) Hash Cond: ("*VALUES*_1".column1 = "*VALUES*".column1) -> Values Scan on "*VALUES*_1" (cost=0.00..0.04 rows=3 width=8) -> Hash (cost=0.03..0.03 rows=2 width=8) -> Values Scan on "*VALUES*" (cost=0.00..0.03 rows=2 width=8)
F.40.6.10. Подзапросы
Контекст подзапросов можно иногда указать с помощью имени
ANY_subquery
:
IN (SELECT ... {LIMIT | OFFSET ...} ...) = ANY (SELECT ... {LIMIT | OFFSET ...} ...) = SOME (SELECT ... {LIMIT | OFFSET ...} ...)
Для этих синтаксисов планировщик внутренне присваивает имя подзапросу при планировании соединений с таблицами, включая его, поэтому подсказки соединения применимы к таким соединениям с использованием неявного имени. Например:
=# /*+HashJoin(a1 ANY_subquery)*/ EXPLAIN SELECT * FROM pgbench_accounts a1 WHERE aid IN (SELECT bid FROM pgbench_accounts a2 LIMIT 10); QUERY PLAN --------------------------------------------------------------------------------------------- Hash Semi Join (cost=0.49..2903.00 rows=1 width=97) Hash Cond: (a1.aid = a2.bid) -> Seq Scan on pgbench_accounts a1 (cost=0.00..2640.00 rows=100000 width=97) -> Hash (cost=0.36..0.36 rows=10 width=4) -> Limit (cost=0.00..0.26 rows=10 width=4) -> Seq Scan on pgbench_accounts a2 (cost=0.00..2640.00 rows=100000 width=4)
F.40.6.11. Используя подсказку IndexOnlyScan
Индексное сканирование может быть неожиданно выполнено по другому индексу, когда индекс, указанный в подсказке IndexOnlyScan, не может выполнить только индексное сканирование.
F.40.6.12. О NoIndexScan
Подсказка NoIndexScan
подразумевает
NoIndexOnlyScan
.
F.40.6.13. Параллельные подсказки и UNION
A UNION
может выполняться параллельно только в том случае, если все
подзапросы, на которых он основан, безопасны для параллельного выполнения. Таким образом, принуждение
параллельного выполнения любого из подзапросов позволит параллельно выполняемому
UNION
выполняться параллельно. Между тем, параллельная
подсказка с нулевым количеством рабочих потоков предотвращает выполнение сканирования в
параллельном режиме.
F.40.6.14. Настройка параметров pg_hint_plan
с помощью указаний Set
pg_hint_plan
параметры влияют на их собственное
поведение, поэтому некоторые параметры могут не работать так, как можно было бы ожидать:
Подсказки для изменения
enable_hint
,enable_hint_table
игнорируются, даже если они сообщаются как «использованные подсказки» в журналах отладки.Установка
debug_print
иmessage_level
в середине обработки запроса.
F.40.7. Ошибки
pg_hint_plan
прекращает разбор подсказок при любой ошибке
и будет использовать уже разобранные подсказки. Вот некоторые типичные
ошибки.
F.40.7.1. Синтаксические ошибки
Любые синтаксические ошибки или неправильные имена подсказок сообщаются как синтаксическая ошибка. Эти ошибки сообщаются в журнале сервера с уровнем сообщения, указанным в pg_hint_plan.message_level
, если pg_hint_plan.debug_print
включен и выше.
F.40.7.2. Некорректные определения объектов
Некорректные определения объектов приводят к тихому игнорированию подсказок. Этот вид ошибки сообщается как «Неиспользуемая подсказка» в журналах сервера.
F.40.7.3. Лишние или противоречивые подсказки
Последняя подсказка рассматривается, когда определены избыточные подсказки или подсказки конфликтуют друг с другом. Этот вид ошибки сообщается как дублированные подсказки.
F.40.7.4. Вложенные комментарии
Подсказка: комментарии не могут быть рекурсивными. Если это обнаружено, разбор подсказок немедленно прекращается, и все уже разобранные подсказки игнорируются.
F.40.8. Функциональные ограничения
F.40.8.1. Влияние параметров GUC планировщика
Планировщик не пытается учитывать порядок соединения для элементов
предложения FROM более чем from_collapse_limit
.
pg_hint_plan
не может повлиять на порядок
соединения в этом случае.
F.40.8.2. Подсказки, пытающиеся навязать невыполнимые планы
Планировщик выбирает любые исполняемые планы, когда невозможно выполнить заданный план.
FULL OUTER JOIN
для использования вложенного циклаИспользование индексов, которые не имеют столбцов, используемых в условиях.
TID сканирования для запросов без условий ctid.
F.40.8.3. Запросы в ECPG
ECPG удаляет комментарии в запросах, написанных как встроенные SQL, поэтому
подсказки не могут быть переданы ему. Единственное исключение —
EXECUTE
, который передает строку запроса на
сервер как есть. В этом случае можно использовать таблицу подсказок.
F.40.8.4. Идентификаторы Запросов
Когда compute_query_id
включен, PostgreSQL
генерирует идентификатор запроса, игнорируя комментарии. Таким образом, запросы с
различными подсказками, но написанные одинаково, могут иметь
одинаковый идентификатор запроса.
F.40.9. Список подсказок
Доступные подсказки перечислены ниже.
Группа | Формат | Описание |
---|---|---|
Метод сканирования |
SeqScan(таблица)
| Принудительное последовательное сканирование таблицы |
TidScan(table)
| Принудительно выполняет сканирование таблицы по TID. | |
IndexScan(table[ index...])
| Принуждает к индексному сканированию таблицы. Ограничивает до указанных индексов, если таковые имеются. | |
IndexOnlyScan(table[ index...])
| Принудительно использовать индексное сканирование только по индексу для таблицы. Ограничивает использование указанными индексами, если они заданы. Индексное сканирование может быть использовано, если индексное сканирование только по индексу недоступно. | |
BitmapScan(table[ index...])
| Принудительно использовать bitmap-сканирование на таблице. Ограничивает использование указанными индексами, если они заданы. | |
IndexScanRegexp(table[ POSIX Regexp...])
IndexOnlyScanRegexp(table[ POSIX Regexp...])
BitmapScanRegexp(table[ POSIX Regexp...])
| Принудительно выполняет индексное сканирование, сканирование только по индексу или сканирование по битовой карте на таблице. Ограничивает индексы, которые соответствуют указанному шаблону POSIX регулярного выражения. | |
NoSeqScan(table)
| Принуждает не выполнять последовательное сканирование таблицы. | |
NoTidScan(table)
| Принуждает не выполнять TID-сканирование на таблице. | |
NoIndexScan(table)
| Принуждает не выполнять индексное сканирование и сканирование только по индексу на таблице. | |
NoIndexOnlyScan(table)
| Принуждает не выполнять только индексное сканирование таблицы. | |
NoBitmapScan(table)
| Принуждает не выполнять bitmap-сканирование таблицы. | |
Метод соединения |
NestLoop(table table[ table...])
| Принудительно использовать вложенные циклы для соединений на указанных таблицах. |
HashJoin(table table[ table...])
| Принудительно использовать хеш-соединение для соединений на указанных таблицах. | |
MergeJoin(table table[ table...])
| Принудительно использовать слияние соединений для соединений на указанных таблицах. | |
NoNestLoop(table table[ table...])
| Заставляет не выполнять вложенный цикл для соединений на указанных таблицах. | |
NoHashJoin(table table[ table...])
| Принуждает не выполнять хеш-соединение для соединений на указанных таблицах. | |
NoMergeJoin(table table[ table...])
| Принуждает не выполнять слияние соединений для соединений на указанных таблицах. | |
Порядок соединения |
Leading(table table[ table...])
| Принудительно задает указанный порядок соединения. |
Leading(<join pair>)
| Задает порядок и направления соединений, как указано. Пара соединений - это пара таблиц и/или других пар соединений, заключенных в скобки, что может создать вложенную структуру. | |
Управление поведением при соединении |
Memoize(table table[ table...])
| Позволяет верхнему соединению среди указанных таблиц использовать Memoize для внутреннего результата. Не принудительно. |
NoMemoize(table table[ table...])
| Запрещает верхнему соединению среди указанных таблиц использовать мемоизацию для внутреннего результата. | |
Коррекция номера строки |
Строки(таблица таблица[ таблица...] коррекция)
| Корректирует номер строки результата соединений на указанных таблицах. Доступные методы коррекции: абсолютный (#), сложение (+), вычитание (-) и умножение (*). должно быть строкой, которую может понять strtod(). |
Конфигурация параллельного запроса |
Parallel(table <# of workers> [soft\|hard])
| Принуждает или запрещает параллельное выполнение указанной таблицы. <# of workers> — это желаемое количество параллельных рабочих процессов, где ноль означает запрет параллельного выполнения. Если третий параметр soft (по умолчанию), он просто изменяет max_parallel_workers_per_gather и оставляет все остальное планировщику. Hard принуждает использовать указанное количество рабочих процессов. |
GUC |
Set(GUC-param value)
| Устанавливает параметр GUC в заданное значение во время работы планировщика. |