#postgresql
Вопрос:
Я запускаю эту команду SQL на PostgreSQL 11:
CREATE TABLE IF NOT EXISTS my_temp_table AS TABLE my_enormous_table WITH NO DATA;
Создание новой таблицы занимает 5 минут.
То EXPLAIN ...
есть:
Seq Scan on my_enormous_table (cost=0.00..35999196.34 rows=143407234 width=3278)
Переход к такому запросу CREATE TABLE ... (SELECT * FROM my_enormous_table WHERE FALSE);
происходит на порядки быстрее — нет сканирования seq, и результат тот же.
Есть идеи, что может быть причиной этой проблемы?
Ответ №1:
WITH NO DATA
по-прежнему выполняет запрос, он просто игнорирует результат.
Лучший способ сделать это-избежать CREATE TABLE ... AS
:
CREATE TABLE my_temp_table (LIKE my_enormous_table);
Это также позволяет использовать INCLUDING
предложение для копирования значений по умолчанию, параметров хранения, ограничений и прочего из исходной таблицы:
CREATE TABLE my_temp_table (LIKE my_enormous_table INCLUDING CONSTRAINTS INCLUDING DEFAULTS);
Комментарии:
1. Спасибо. Интересно, что я не могу выполнить
EXPLAIN
этот запрос, но запрос работает хорошо и быстро. Объясните результаты вERROR: syntax error at or near "LIKE"
. Еще многое предстоит узнать!2. Вы не можете выполнять
EXPLAIN
большинство инструкций DDL. Поскольку у этих утверждений нет плана выполнения, это не имело бы смысла.