Общие табличные выражения (CTE) с большими таблицами - PullRequest
1 голос
/ 18 мая 2019

Рассматривая запрос следующего формата, в котором используются CTE:

WITH
    t1 AS (SELECT some_data1 FROM some_table),
    t2 AS (SELECT some_data2 FROM t1)
SELECT some_data3 FROM t2;

Вопрос 1:

При выполнении запроса временная таблица t1 полностью создается и сохраняется впамять, тогда t2 строится полностью на основе данных из t1, тогда SELECT может работать с t2?

Вопрос 2:

Если t1 иt2 - это большие таблицы, которые не могут быть сохранены в памяти, будут ли они записываться на диск, что замедляет выполнение запроса?

Вопрос 3:

Следует ли избегать такого типа запросов для больших таблиц?

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Ответы:

  1. Да. До PostgreSQL v11 CTE материализуются в PostgreSQL. Это изменяется в версии 12, и из этой версии ваш запрос, вероятно, будет работать лучше.

    Вы можете EXPLAIN запрос, чтобы проверить это.

  2. Да.

  3. Да.

0 голосов
/ 18 мая 2019
  1. Нет. Вы можете добавить больше cte и не использовать их в списке выбора внизу, и они не имеют никакого эффекта. Оптимизатор запросов превращает их в наиболее эффективные соединения и выполняет их все вместе. По этой причине CTE лучше и быстрее, чем временные таблицы.

  2. Это может быть проблема с временными таблицами, но не проблема для CTE. CTE - это просто выражения, представляющие данные, которые не вызываются, пока оптимизатор не узнает, как вы их выбираете.

  3. Неа. На самом деле это путь вместо таблиц соблазнов, если ваши таблицы большие. Размер таблицы не должен иметь значения, если у вас правильно установлены индексы. CTE делают это таким образом, чтобы вам не приходилось обрабатывать записи, которые все равно будут отфильтрованы позже в запросе.

...