Конвертация таблиц между строковой и колоночной ориентацией
YDB поддерживает два основных типа таблиц: строковые и колоночные. Выбранный тип таблицы определяет физическое представление данных на дисках, поэтому изменение типа существующей таблицы невозможно. Однако вы можете создать новую таблицу другого типа и скопировать в неё данные. Этот рецепт состоит из следующих шагов:
- Подготовка новой таблицы
- Копирование данных
- Переключение нагрузки (опционально)
Эти инструкции предполагают, что исходная таблица является строковой, и целью является получение аналогичной колоночной таблицы; однако роли таблиц могут быть изменены на противоположные.
Примечание
В примерах используется профиль quickstart
, подробнее смотрите в Создание профиля для соединения с тестовой БД.
Подготовка новой таблицы
Возьмите копию исходной команды CREATE TABLE
, использованной для создания исходной таблицы. Проделайте в этом запросе следующие изменения, чтобы создать файл с запросом CREATE TABLE
для таблицы назначения:
- Измените имя таблицы на желаемое новое имя.
- Установите значение параметра
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 таблицами разных типов — это экспорт и импорт:
-
Экспорт данных в локальную файловую систему:
$ ydb -p quickstart dump -p row_oriented_table -o tmp_backup/
-
Импорт этих данных в другую таблицу 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"
.