Когда материализованный вариант PostgreSQL 12 CTE обеспечивает преимущество в оптимизации? - PullRequest
2 голосов
/ 16 марта 2020

РЕДАКТИРОВАТЬ: я переместил этот вопрос на dba.stackexchange, так как я получил совет, что это сообщество может лучше ответить на мой вопрос.

Я был прочтение о новой функции CTE PostgreSQL - ключевом слове MATERIALIZED или NOT MATERIALIZED, которая может предложить дополнительные возможности оптимизации при определенных обстоятельствах при условии, что это безопасно. Комментарий к этому PostgreSQL обновлению здесь говорит:

... пользователь может принудительно установить старое поведение [LESS OPTIMIZED], указав MATERIALIZED; в основном это было бы полезно, если в запросе преднамеренно использовался WITH в качестве защитного ограждения для предотвращения неправильного выбора плана.

Мне было интересно, учитывая, что существует ситуация, когда это безопасно использовать оптимизацию CTE (ключевое слово NOT MATERIALIZED), при каких условиях менее оптимизированное ключевое слово "MATERIALIZED" может "предотвратить неудачный выбор плана", как говорится в цитате, или обеспечить еще лучший план?

1 Ответ

1 голос
/ 16 марта 2020

Это означает, что встроенный подзапрос может привести к медленным запросам, и CTE (который работает как забор оптимизации, избегает этого). Вот пример ошибка для этого.

...