Изменение таблиц в Greenplum 7 без их перезаписи

изменение таблиц Greenplum 7, Greenplum курсы, обучение Greenplum, обучение Arenadata DB курсы, Greenplum для инженеров данных и архитекторов СУБД, Greenplum особенности хранения данных, хранение и аналитика больших данных с Greenplum, курсы NoSQL, обучение NoSQL, Школа Больших Данных Учебный центр Коммерсант

Какие команды изменения таблиц добавлены в 7-ю версию Greenplum и чем они полезны дата-инженеру. Разбираемся с новыми функциями: как добавить столбец, изменить его тип, кодировку хранения и перезаписать несколько таблиц одной командой.

Добавление столбца

О новых функциях работы с партиционированаными таблицами в Greenplum 7 мы уже писали. В частности, Greenplum 7 позволяет определять партиционированную таблицу без определения дочерних разделов, используя новое ключевое слово ONLY, которое позволяет избежать рекурсии при изменении с помощью команды ALTER TABLE. Впрочем, это не единственное изменение, связанное с командой ALTER TABLE, которая используется для таких операций, как добавление столбцов, изменение типа данных столбца и пр. Обычно такие команды требуют перезаписи всей таблицы с сохранением монопольной блокировки таблицы. Для больших таблиц это занимает очень много времени и другие операции над таблицей (включая даже SELECT-запрос) блокируются, пока ALTER TABLE перезаписывает таблицу.

Поэтому в Greenplum 7 сделано несколько оптимизаций, которые помогают избежать перезаписи всей таблицы для многих команд ALTER TABLE, особенно для  таблиц, оптимизированных для добавления (AO, Append Only). В частности, добавлена возможность добавления столбца с помощью ALTER TABLE … ADD COLUMN. Благодаря оптимизации, представленной в PostgreSQL 11, на которой основана СУБД Greenplum 7, теперь не требуется перезаписи таблицы при добавлении столбца в таблицу кучи,  если  значение  нового столбца по умолчанию не является изменяемым (volatile). При этом с точки зрения существующих строк в таблице новый добавленный столбец будет считаться  отсутствующим. При чтении существующих строк отсутствующие столбцы заполняются значением столбца по умолчанию. Таким образом, не приходится переписывать существующие строки во время  выполнения команды ALTER TABLE.

Однако для таблиц, ориентированных на строки или оптимизированных для добавления, возникает проблема, связанная с другой организацией табличных данных: в отличие от таблицы кучи, AO-таблица не хранит количество столбцов, которое содержит. Поэтому оптимизация не может быть тривиально применена к AO-таблицам. Это решено через добавление внутреннего номера, который уникален для каждой строки в AO-таблице. Запись текущего наибольшего номера строки на момент выполнения ADD COLUMN, позволяет знать, в каких строках отсутствует этот столбец. Та же самая оптимизация может быть применена к таблицам, ориентированным на столбцы и оптимизированным для добавления и ориентированным на столбцы (AO/CO). Это улучшение избавляет от необходимости переписывать всю таблицу.

Изменение типа столбца

При изменении типа столбца с помощью команды ALTER COLUMN… TYPE, если это не является бинарным приведением к существующему типу столбца, т.е. без изменения самих данных, вся таблица будет переписана. Это относится ко всем категориям таблиц: таблица кучи, AO, AOCO. По своей природе трудно избежать перезаписи таблиц для кучи и таблиц AO из-за их формата данных, ориентированного на строки. Однако для таблиц AOCO можно тоже реализована ​​оптимизация для AOCO-таблиц: перезаписывается только тот столбец, который редактируется. Следовательно, изменение типа столбца больше не требует перезаписи таблицы.

Изменение кодировки столбца и перезапись таблицы

Таблицы AOCO часто имеют разные параметры кодирования, например, параметры сжатия, для разных столбцов. Поэтому команда изменения  параметра кодирования  ALTER COLUMN … SET ENCODING для таблиц AOCO пригодится, когда необходимо настроить каждый столбец в таблице. При этом не нужно переписывать всю таблицу.

Подобно изменению параметров кодирования столбцов, в Greenplum 7 поддерживается изменение параметров хранения таблиц  для таблиц AO и AOCO с помощью таблицы ALTER TABLE … SET. В отличие от предыдущих случаев, придется переписать всю таблицу, потому параметры хранения влияют на нее. Но если изменить параметр хранения так, чтобы он совпадал с существующими параметрами таблицы, перезаписи таблицы не произойдет. Если необходимо выполнить несколько  команд ALTER TABLE, требующих перезаписи таблицы, можно объединить их вместе в одну  команду, так что каждая из команд будет  подкомандой. Таким образом, выполняется только одна перезапись таблицы вместо нескольких.

Однако, пока в Greenplum 7 пока не поддерживается изменение метода доступа  и параметров хранения в  двух подкомандах. Но то же самое можно сделать одной   командой: ALTER TABLE … SET ACCESS METHOD … WITH …

Как задать разные параметры для отдельных столбцов и разделов с помощью команды ALTER TABLE, читайте в нашем новом материале.

В заключение отметим, что регрессионные тесты выявили недостаток нового синтаксиса DDL-инструкций при восстановлении базы данных из резервной копии, который пришлось устранять, о чем мы рассказываем в новой статье.

Узнайте больше подробностей про администрирование и эксплуатацию Greenplum с Arenadata DB для эффективного хранения и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://greenplum.org/alter-table-in-gpdb-7-avoiding-table-rewrite/
  2. https://greenplum.org/altered-states-greenplum-alter-table-command-howard-goldberg/
Поиск по сайту