Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

CREATE TABLE AS

Определяет новую таблицу на основе результатов запроса.

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE <table_name>
        [ (<column_name> [, ...] ) ]
        [ WITH ( <storage_parameter> [= <value>] [, ... ] ) | WITHOUT OIDS ]
        [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
        [ TABLESPACE <tablespace_name> ]
        AS <query>
        [ WITH [ NO ] DATA ]
        [ DISTRIBUTED BY (<column> [, ... ] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]

где storage_parameter может принимать следующие значения:

appendoptimized={TRUE|FALSE}
blocksize={8192-2097152}
orientation={COLUMN|ROW}
compresstype={ZLIB|ZSTD|RLE_TYPE|NONE}
compresslevel={1-19}
fillfactor={10-100}
[oids=FALSE]

Описание

CREATE TABLE AS создает таблицу и заполняет ее данными, полученными в результате выполнения команды SELECT. Столбцы таблицы получают имена и типы данных, ассоциированные с выходными столбцами SELECT, однако имена столбцов можно переопределить, указав явный список новых имен.

CREATE TABLE AS создает новую таблицу и вычисляет запрос только один раз для первоначального заполнения таблицы. Новая таблица не будет отслеживать последующие изменения в исходных таблицах запроса.

Параметры

Параметр Описание

GLOBAL | LOCAL

Игнорируется для обеспечения совместимости. Эти ключевые слова являются устаревшими; подробнее см. CREATE TABLE

TEMPORARY | TEMP

Если указано, новая таблица создается как временная. Временные таблицы автоматически удаляются по завершении сеанса или, по выбору, по завершении текущей транзакции (см. ON COMMIT). Существующие постоянные таблицы с тем же именем не видны текущему сеансу, пока существует временная таблица, если только они не указываются с квалификацией по схеме. Любые индексы, созданные для временной таблицы, также автоматически являются временными

UNLOGGED

Если указано, таблица создается как нежурналируемая (unlogged). Данные, записываемые в нежурналируемые таблицы, не записываются в журнал предзаписи (WAL), что делает их значительно быстрее обычных таблиц. Однако содержимое нежурналируемой таблицы не реплицируется на зеркальные экземпляры сегментов. Кроме того, нежурналируемые таблицы не являются устойчивыми к сбоям. После сбоя или некорректного завершения работы экземпляра сегмента данные нежурналируемой таблицы на этом сегменте усекаются. Любые индексы, созданные на нежурналируемой таблице, также автоматически являются нежурналируемыми

table_name

Имя (опционально указанное со схемой) создаваемой таблицы

column_name

Имя столбца в новой таблице. Если имена столбцов не указаны, они берутся из имен выходных столбцов запроса

WITH ( <storage_parameter>=<value> )

Выражение WITH позволяет задать параметры хранения для таблицы или ее индексов. Обратите внимание, что также можно задать различные параметры хранения для конкретной партиции или подпартиции, указав выражение WITH в спецификации партиционирования. Доступны следующие параметры хранения:

  • appendoptimized — установите значение TRUE для создания append-optimized таблицы. Если указано FALSE или параметр не объявлен, таблица будет создана как обычная таблица с хранением типа heap.

  • blocksize — размер каждого блока в таблице, в байтах. Значение blocksize должно быть в диапазоне от 8192 до 2097152 байт и кратно 8192. Значение по умолчанию — 32768. Параметр blocksize действует только при appendoptimized=TRUE.

  • orientation — установите column для колоночного хранения или row (по умолчанию) для строкового хранения. Этот параметр действует только при appendoptimized=TRUE. Таблицы с хранением типа heap могут быть только строковыми.

  • compresstype — установите ZLIB (по умолчанию), ZSTD или RLE_TYPE для указания типа сжатия. Значение NONE отключает сжатие. Zstd обеспечивает как высокую скорость, так и хорошую степень сжатия; настраивается с помощью параметра compresslevel. Zlib предоставляется для обратной совместимости. Zstd превосходит данные типы сжатия на типичных нагрузках. Параметр compresstype действует только при appendoptimized=TRUE.

    Значение RLE_TYPE, которое поддерживается только при указании orientation=column, включает алгоритм сжатия на основе кодирования длин серий (RLE). RLE сжимает данные лучше, чем алгоритмы Zstd или zlib, когда одно и то же значение повторяется в большом числе последовательных строк.

    Для столбцов типов BIGINT, INTEGER, DATE, TIME или TIMESTAMP дополнительно применяется дельта-сжатие, если параметр compresstype установлен в RLE_TYPE. Алгоритм дельта-сжатия основан на разнице значений столбца в последовательных строках и предназначен для улучшения сжатия при загрузке данных в отсортированном порядке или при применении сжатия к уже отсортированным данным столбца.

  • compresslevel — для сжатия Zstd таблиц, оптимизированных для добавления, установите целочисленное значение от 1 (самое быстрое сжатие) до 19 (наивысшая степень сжатия). Для сжатия zlib допустимый диапазон — от 1 до 9. Если параметр не объявлен, значение по умолчанию — 1. Параметр compresslevel действует только при appendoptimized=TRUE.

  • fillfactor — подробнее об этом параметре хранения индекса см. CREATE INDEX.

  • oids=FALSE — это значение используется по умолчанию и гарантирует, что строкам не назначаются идентификаторы объектов. Greengage DB не поддерживает использование WITH OIDS или oids=TRUE для назначения системного столбца OID. В больших таблицах, характерных для типичных систем Greengage DB, использование OID для строк может привести к переполнению 32-битного счетчика OID. После переполнения счетчика уникальность OID больше не гарантируется, что делает их бесполезными для пользовательских приложений, а также может вызвать проблемы в таблицах системного каталога Greengage DB. Кроме того, исключение OID из таблицы уменьшает объем дискового пространства, необходимого для хранения таблицы, на 4 байта на строку, незначительно повышая производительность. Нельзя создавать OID для партиционированных или колоночных таблиц (выдается ошибка). Этот синтаксис является устаревшим.

ON COMMIT

Поведение временных таблиц по завершении блока транзакций можно контролировать с помощью ON COMMIT. Доступны три варианта:

  • PRESERVE ROWS — по завершении транзакций для временных таблиц не выполняется никаких специальных действий. Это поведение по умолчанию.

  • DELETE ROWS — все строки временной таблицы будут удалены по завершении каждого блока транзакций. По сути, при каждом коммите автоматически выполняется TRUNCATE.

  • DROP — временная таблица будет удалена по завершении текущего блока транзакций.

TABLESPACE <tablespace_name>

Параметр <tablespace_name> — имя табличного пространства, в котором будет создана новая таблица. Если не указано, используется табличное пространство базы данных по умолчанию или temp_tablespaces, если таблица является временной

AS query

Команда SELECT, TABLE или VALUES, либо команда EXECUTE, выполняющая подготовленный запрос SELECT или VALUES

DISTRIBUTED BY ({<column> [<opclass>]}, [ …​ ] )

DISTRIBUTED RANDOMLY

DISTRIBUTED REPLICATED

Используется для объявления политики распределения Greengage DB для таблицы. DISTRIBUTED BY использует хеш-распределение с одним или несколькими столбцами в качестве ключа распределения. Для наиболее равномерного распределения данных ключом распределения должен быть первичный ключ таблицы или уникальный столбец (или набор столбцов). Если это невозможно, можно выбрать DISTRIBUTED RANDOMLY, при котором данные будут распределяться по экземплярам сегментов по принципу round-robin.

DISTRIBUTED REPLICATED реплицирует все строки таблицы на все сегменты Greengage DB. Этот вариант нельзя использовать с партиционированными таблицами или с таблицами, наследующими от других таблиц.

Серверный параметр конфигурации Greengage DB gp_create_table_random_default_distribution управляет политикой распределения таблицы по умолчанию, если выражение DISTRIBUTED BY не указано при создании таблицы. Greengage DB использует следующие правила для создания таблицы, если политика распределения не указана:

  • Если таблицу создает Postgres Planner и значение параметра — off, политика распределения определяется на основе команды.

  • Если таблицу создает Postgres Planner и значение параметра — on, используется случайное распределение.

  • Если таблицу создает GPORCA, используется случайное распределение. Значение параметра не имеет значения.

Примечания

Эта команда функционально аналогична SELECT INTO, однако предпочтительнее, поскольку ее реже путают с другими вариантами использования синтаксиса SELECT INTO. Кроме того, CREATE TABLE AS предоставляет расширенный набор функциональности по сравнению с SELECT INTO.

CREATE TABLE AS можно использовать для быстрой загрузки данных из источников внешних таблиц. См. CREATE EXTERNAL TABLE.

Примеры

Создать новую таблицу films_recent, содержащую только недавние записи из таблицы films:

CREATE TABLE films_recent AS
SELECT *
FROM films
WHERE date_prod >= '2025-01-01';

Создать новую временную таблицу films_recent, содержащую только недавние записи из таблицы films, с использованием подготовленного оператора. Новая таблица будет удалена при коммите:

PREPARE recentfilms(date) AS SELECT *
                             FROM films
                             WHERE date_prod > $1;

CREATE TEMP TABLE films_recent ON COMMIT DROP AS
    EXECUTE recentfilms
(
    '2025-01-01'
);

Совместимость

CREATE TABLE AS соответствует стандарту SQL со следующими исключениями:

  • Стандарт требует круглых скобок вокруг подзапроса; в Greengage DB эти скобки являются необязательными.

  • В стандарте выражение WITH [NO] DATA обязательно; в Greengage DB его использование необязательно.

  • Greengage DB обрабатывает временные таблицы иначе, чем определено в стандарте; подробнее см. CREATE TABLE.

  • Выражение WITH является расширением Greengage DB; ни параметры хранения, ни OIDs не входят в стандарт. Синтаксис создания системных столбцов OID является устаревшим.

  • Концепция табличных пространств в Greengage DB не является частью стандарта. Выражение TABLESPACE является расширением.

См. также