CREATE TABLE AS
Создание новой таблицы на основе результатов запроса.
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE table_name
[ (column_name [, ...] ) ]
[ USING MARS2 ]
[ 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|QUICKLZ|RLE_TYPE|NONE}
compresslevel={1-19 | 1}
fillfactor={10-100}
[oids=FALSE]
Описание
CREATE TABLE AS создает таблицу и заполняет её данными, полученными в результате выполнения команды SELECT. Столбцы новой таблицы получают имена и типы данных, соответствующие выходным столбцам SELECT, однако вы можете переопределить имена столбцов, явно указав список новых имён.
CREATE TABLE AS создаёт новую таблицу и однократно выполняет запрос для заполнения этой таблицы. Новая таблица не отслеживает последующие изменения в исходных таблицах запроса.
Параметры
GLOBAL | LOCAL
- Игнорируется для обеспечения совместимости. Эти ключевые слова устарели.
TEMPORARY | TEMP
- Если указано, новая таблица создается как временная. Временные таблицы автоматически удаляются по завершении сессии или текущей транзакции (см. ON COMMIT). Если временная таблица существует, постоянные таблицы с тем же именем становятся невидимыми в текущей сессии, если только они не ссылаются через имя схемы. Все индексы, созданные на временных таблицах, также автоматически становятся временными индексами.
UNLOGGED
- Если указано, таблица будет создана как незаписываемая (unlogged). Запись данных в такие таблицы не фиксируется в журнале предзаписи (WAL), что делает их значительно быстрее обычных таблиц. Однако содержимое незаписываемой таблицы не копируется на зеркальный экземпляр. Кроме того, такие таблицы не защищены от сбоев. После аварийного завершения работы или сбоя экземпляра Segment данные незаписываемой таблицы будут обрезаны. Все индексы, созданные на незаписываемой таблице, также автоматически становятся незаписываемыми.
table_name
- Имя новой таблицы (может быть указано с указанием схемы).
column_name
- Имя столбца в новой таблице. Если имена столбцов не заданы, они берутся из имён выходных столбцов запроса.
WITH (storage_parameter=value)
- Предложение WITH может использоваться для установки параметров хранения таблицы или её индексов. Обратите внимание, что различные параметры хранения можно также задать для конкретной партиции или подпартиции, указав предложение WITH в спецификации партиционирования. Доступны следующие параметры хранения:
- appendoptimized — при значении TRUE таблица создается как таблица с добавлением (append-optimized). При значении FALSE или отсутствии параметра таблица создается как обычная таблица с кучным хранилищем.
- blocksize — размер каждого блока таблицы в байтах. Значение blocksize должно находиться в диапазоне от 8192 до 2097152 байт и быть кратным 8192. По умолчанию — 32768. Этот параметр действует только при appendoptimized = TRUE.
- orientation — column означает хранение по столбцам, row (по умолчанию) — хранение по строкам. Эта опция допустима только при appendoptimized = TRUE. Таблицы с кучным хранилищем могут быть только ориентированы по строкам.
- compresstype — ZLIB (по умолчанию), ZSTD или QUICKLZ1 — тип используемого сжатия. Значение NONE отключает сжатие. ZSTD обеспечивает хорошее соотношение скорости и степени сжатия, которое можно настроить с помощью параметра compresslevel. QuickLZ и ZLIB поддерживаются для обратной совместимости. В типичных рабочих нагрузках ZSTD работает лучше этих методов сжатия. Параметр compresstype действителен только при appendoptimized = TRUE.
- compresslevel — для таблиц с дополнительной оптимизацией сжатия ZSTD устанавливается целое значение от 1 (самое быстрое сжатие) до 19 (максимальная степень сжатия). Для ZLIB эффективный диапазон — от 1 до 9. Уровень сжатия QuickLZ может быть только 1. Если не указано, используется значение по умолчанию — 1. Параметр compresslevel действителен только при appendoptimized = TRUE.
- fillfactor — подробнее об этом параметре хранения индекса см. в разделе CREATE INDEX.
- oids=FALSE — значение по умолчанию, OID не присваивается каждой строке данных. YMatrix настоятельно рекомендует не включать OIDS при создании таблиц. В больших таблицах (например, в типичной системе баз данных YMatrix) использование OID может привести к переполнению 32-битного счётчика OID. После этого уникальность OID уже нельзя гарантировать, что делает их бесполезными для приложений и вызывает проблемы в каталоговых таблицах системы YMatrix. Кроме того, исключение OID уменьшает объём дискового пространства, необходимого для хранения каждой строки, на 4 байта, что даёт небольшое повышение производительности. OIDS не разрешены для таблиц, ориентированных по столбцам.
ON COMMIT
- Позволяет управлять поведением временной таблицы в конце блока транзакции. Возможны три варианта:
PRESERVE ROWS — при завершении транзакции с временной таблицей ничего не происходит. Это поведение по умолчанию.
DELETE ROWS — все строки во временной таблице удаляются в конце каждого блока транзакции. По сути, после каждого COMMIT автоматически выполняется TRUNCATE.
DROP — временная таблица удаляется в конце текущего блока транзакции.
TABLESPACE tablespace_name
- Параметр tablespace_name — имя табличного пространства, в котором будет создана новая таблица. Если не указано, используется табличное пространство по умолчанию для базы данных.
AS query
- Команда SELECT, TABLE или VALUES, либо команда EXECUTE для выполнения подготовленного запроса SELECT или VALUES.
DISTRIBUTED BY ({column [opclass]}, [ ... ] )
DISTRIBUTED RANDOMLY
DISTRIBUTED REPLICATED
- Политика распределения таблиц в базе данных YMatrix. DISTRIBUTED BY распределяет данные по хэшу одного или нескольких столбцов, объявленных ключами распределения. Для наиболее равномерного распределения данных ключом распределения должен быть первичный ключ или уникальный столбец (или набор столбцов) таблицы. Если это невозможно, можно выбрать DISTRIBUTED RANDOMLY, который распределяет данные случайным образом между экземплярами Segment.
DISTRIBUTED REPLICATED копирует все строки таблицы на все сегменты базы данных YMatrix. Не может использоваться с партиционированными таблицами или таблицами, унаследованными от других таблиц.
Если при создании таблицы не указано предложение DISTRIBUTED BY, поведение определяется конфигурационным параметром сервера gp_create_table_random_default_distribution. Если политика распределения не указана, база данных YMatrix применяет следующие правила:
- Если таблицу создаёт оптимизатор Postgres и значение параметра — off, политика распределения определяется по команде.
- Если таблицу создаёт оптимизатор Postgres и значение параметра — 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 >= '2007-01-01';
Использовать подготовленный оператор для создания новой временной таблицы films_recent, содержащей только последние записи из таблицы films. Новая таблица будет иметь OID и будет удалена при фиксации транзакции:
PREPARE recentfilms(date) AS SELECT * FROM films WHERE
date_prod > $1;
CREATE TEMP TABLE films_recent ON COMMIT DROP AS
EXECUTE recentfilms('2007-01-01');
Совместимость
CREATE TABLE AS соответствует стандарту SQL, за исключением следующих моментов:
- Стандарт требует, чтобы подзапрос заключался в скобки; в базе данных YMatrix эти скобки являются необязательными.
- Стандарт определяет предложение WITH [NO] DATA; эта возможность в настоящее время не реализована в базе данных YMatrix. База данных YMatrix реализует поведение, эквивалентное стандартному WITH DATA. Ситуацию WITH NO DATA можно смоделировать, добавив LIMIT 0 к запросу.
- Временные таблицы в базе данных YMatrix работают иначе, чем в стандарте. Подробнее см. CREATE TABLE.
- Предложение WITH является расширением базы данных YMatrix. Ни параметры хранения, ни OID не предусмотрены стандартом. Синтаксис создания системного столбца OID объявлен устаревшим.
- Концепция табличных пространств в базе данных YMatrix не является частью стандарта. Предложение TABLESPACE является расширением.
См. также
ALTER TABLE, CREATE TABLE, DROP TABLE