Конвертация таблиц между строковой и колоночной ориентацией

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

  1. Подготовка новой таблицы
  2. Копирование данных
  3. Переключение нагрузки (опционально)

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

Примечание

В примерах используется профиль quickstart, подробнее смотрите в Создание профиля для соединения с тестовой БД.

Подготовка новой таблицы

Возьмите копию исходной команды CREATE TABLE, использованной для создания исходной таблицы. Проделайте в этом запросе следующие изменения, чтобы создать файл с запросом CREATE TABLE для таблицы назначения:

  1. Измените имя таблицы на желаемое новое имя.
  2. Установите значение параметра STORE в COLUMN, чтобы сделать таблицу колоночной.

Запустите этот запрос (предполагается, что он сохранён в файле с именем create_column_oriented_table.yql):

$ ydb -p quickstart yql -f create_column_oriented_table.yql
Примеры схем тестовых таблиц и заполнения их данными

Исходная строковая таблица:

CREATE TABLE `row_oriented_table` (
    id Int64 NOT NULL,
    metric_a Double,
    metric_b Double,
    metric_c Double,
    PRIMARY KEY (id)
)

Колоночная таблица назначения:

CREATE TABLE `column_oriented_table` (
    id Int64 NOT NULL,
    metric_a Double,
    metric_b Double,
    metric_c Double,
    PRIMARY KEY (id)
)
PARTITION BY HASH(id)
WITH (STORE = COLUMN)

Примечание

Обратитесь к документации для разработчиков приложений, чтобы узнать больше о партицировании колоночных таблиц и выборе ключа их партицирования (параметр PARTITION BY).

Заполнение исходной строковой таблицы случайными данными:

INSERT INTO `row_oriented_table` (id, metric_a, metric_b, metric_c)
SELECT
    id,
    Random(id + 1),
    Random(id + 2),
    Random(id + 3)
FROM (
    SELECT ListFromRange(1, 1000) AS id
) FLATTEN LIST BY id

Копирование данных

На данный момент рекомендуемый способ копирования данных между YDB таблицами разных типов — это экспорт и импорт:

  1. Экспорт данных в локальную файловую систему:

    $ ydb -p quickstart dump -p row_oriented_table -o tmp_backup/
    
  2. Импорт этих данных в другую таблицу YDB:

    $ ydb -p quickstart import file csv -p column_oriented_table tmp_backup/row_oriented_table/*.csv
    

Убедитесь, что у вас достаточно свободного места в файловой системе для хранения всех данных.

Переключение нагрузки

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

Если исходная таблица больше не нужна, её можно удалить с помощью ydb -p quickstart table drop row_oriented_table или yql -p quickstart yql -s "DROP TABLE row_oriented_table".

Смотрите также

Предыдущая