diff options
author | dcherednik <dcherednik@ydb.tech> | 2023-03-15 11:55:04 +0300 |
---|---|---|
committer | dcherednik <dcherednik@ydb.tech> | 2023-03-15 11:55:04 +0300 |
commit | a8bfa77c8bcaf013f546a8f735fe72e3ef3d87ba (patch) | |
tree | fcc58d5b2a10495f258769d485a7c65ec2359311 | |
parent | 37c8e6daa14894ac5c80794042203224f2804ba9 (diff) | |
download | ydb-a8bfa77c8bcaf013f546a8f735fe72e3ef3d87ba.tar.gz |
Rename index cli support. Update the Documentation.
7 files changed, 114 insertions, 0 deletions
diff --git a/ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md b/ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md index f04463964a8..89751f38aed 100644 --- a/ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md +++ b/ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md @@ -82,6 +82,14 @@ FROM series VIEW views_index WHERE views = 0; ``` +## Атомарная подмена вторичного индекса под {#atomic_index_replacement} + +Существует возможность атомарной замены вторичного индекса. Для работающих приложений эта операция прозрачна - в момент подмены индекса произойдет инвалидация скомпилированных запросов. Последовательность действий: + +1. Создать [новый индекс](#create) одним из указанных способов +2. Атомарно заменить существующий индекс с использованием [комманды YDB CLI](../../reference/ydb-cli/commands/secondary_index.md#rename) + + ## Производительность записи в таблицы со вторичными индексами {#write_performance} Для работы вторичных индексов необходимы дополнительные структуры данных. Поддержка этих структур приводит к повышению стоимости операций изменения данных в таблицах. diff --git a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md index aad699555d2..4ca48f35291 100644 --- a/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md +++ b/ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md @@ -105,3 +105,29 @@ ```bash {{ ydb-cli }} -p db1 table index drop episodes --index-name idx_aired ``` + +## Переименование вторичного индекса {#rename} + +Переименование вторичного индекса выполняется командой `table index rename`: + +```bash +{{ ydb-cli }} [connection options] table index rename <table> --index-name STR --to STR +``` + +Если индекс с новым именем существует, то команда вернет ошибку. +Чтобы заменить существующий индекс выполните команду переименования с опцией `--replace`. В результате выполнения такой команды существующий индекс будет заменён новым атомарно. + +```bash +{{ ydb-cli }} [connection options] table index rename <table> --index-name STR --to STR --replace +``` + + +**Пример** + +{% include [example_db1.md](../../_includes/example_db1.md) %} + +Переименование индекса `idx_aired` с таблицы episodes, построенного в примере создания индекса выше: + +```bash +{{ ydb-cli }} -p db1 table index rename episodes --index-name idx_aired --to idx_aired_renamed +``` diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/alter_table.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/alter_table.md index 9a5724f7f50..c804f7ceaeb 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/alter_table.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/alter_table.md @@ -46,6 +46,17 @@ ALTER TABLE `series` DROP INDEX `title_index`; Также добавить или удалить вторичный индекс можно с помощью команды [table index](https://ydb.tech/ru/docs/reference/ydb-cli/commands/secondary_index) {{ ydb-short-name }} CLI. +## Переименование вторичного индекса {#rename-secondary-index} + +```RENAME INDEX``` — переименовывает индекс с указанным именем + +Если индекс с новым именем существует, будет возвращена ошибка. Возможность транзакционной подмены индекса под нагрузкой поддерживается специализированными методами в [CLI](https://ydb.tech/ru/docs/reference/ydb-cli/commands/secondary_index#rename) и SDK. + +Пример преименования индекса: +```sql +ALTER TABLE `series` RENAME INDEX `title_index` TO `title_index_new`; +``` + {% endif %} {% if feature_changefeed %} diff --git a/ydb/public/lib/ydb_cli/commands/ydb_service_table.cpp b/ydb/public/lib/ydb_cli/commands/ydb_service_table.cpp index 0a200972e7b..a9129b3b277 100644 --- a/ydb/public/lib/ydb_cli/commands/ydb_service_table.cpp +++ b/ydb/public/lib/ydb_cli/commands/ydb_service_table.cpp @@ -42,6 +42,7 @@ TCommandIndex::TCommandIndex() { AddCommand(std::make_unique<TCommandIndexAdd>()); AddCommand(std::make_unique<TCommandIndexDrop>()); + AddCommand(std::make_unique<TCommandIndexRename>()); } TCommandAttribute::TCommandAttribute() @@ -1007,6 +1008,45 @@ int TCommandIndexDrop::Run(TConfig& config) { return EXIT_SUCCESS; } +TCommandIndexRename::TCommandIndexRename() + : TYdbCommand("rename", {}, "Rename index for specified table") +{} + +void TCommandIndexRename::Config(TConfig& config) { + TYdbCommand::Config(config); + + config.Opts->AddLongOption("index-name", "Name of index to rename.").Required() + .RequiredArgument("NAME").StoreResult(&IndexName); + + config.Opts->AddLongOption("to", "New index name").Required() + .RequiredArgument("NAME").StoreResult(&NewIndexName); + + config.Opts->AddLongOption("replace", "Allow to replace existing index. In case if there already exists an index with the same name that current index is renamed to, the existing one will be deleted.") + .StoreTrue(&Replace); + + config.SetFreeArgsNum(1); + SetFreeArgTitle(0, "<table path>", "Path to a table"); +} + +void TCommandIndexRename::Parse(TConfig& config) { + TClientCommand::Parse(config); + ParsePath(config, 0); +} + +int TCommandIndexRename::Run(TConfig& config) { + NTable::TTableClient client(CreateDriver(config)); + + auto settings = NTable::TAlterTableSettings() + .AppendRenameIndexes({IndexName, NewIndexName, Replace}); + auto session = client.GetSession().GetValueSync(); + ThrowOnError(session); + auto result = session.GetSession().AlterTable(Path, settings).GetValueSync(); + ThrowOnError(result); + + return EXIT_SUCCESS; +} + + TCommandAttributeAdd::TCommandAttributeAdd() : TYdbCommand("add", {}, "Add attributes to the specified table") {} diff --git a/ydb/public/lib/ydb_cli/commands/ydb_service_table.h b/ydb/public/lib/ydb_cli/commands/ydb_service_table.h index 771f4a80d25..713a512c258 100644 --- a/ydb/public/lib/ydb_cli/commands/ydb_service_table.h +++ b/ydb/public/lib/ydb_cli/commands/ydb_service_table.h @@ -195,6 +195,18 @@ private: TString IndexName; }; +class TCommandIndexRename : public TYdbCommand, public TCommandWithPath { +public: + TCommandIndexRename(); + virtual void Config(TConfig& config) override; + virtual void Parse(TConfig& config) override; + virtual int Run(TConfig& config) override; +private: + TString IndexName; + TString NewIndexName; + bool Replace = false; +}; + class TCommandAttributeAdd : public TYdbCommand, public TCommandWithPath { public: TCommandAttributeAdd(); diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp index 0cf6b6ba9c0..1336a6605d8 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp @@ -245,6 +245,12 @@ static TInstant ProtobufTimestampToTInstant(const NProtoBuf::Timestamp& timestam return TInstant::MicroSeconds(lastModificationUs); } +static void SerializeTo(const TRenameIndex& rename, Ydb::Table::RenameIndexItem& proto) { + proto.set_source_name(rename.SourceName_); + proto.set_destination_name(rename.DestinationName_); + proto.set_replace_destination(rename.ReplaceDestination_); +} + class TTableDescription::TImpl { using EUnit = TValueSinceUnixEpochModeSettings::EUnit; @@ -3521,6 +3527,10 @@ static Ydb::Table::AlterTableRequest MakeAlterTableProtoRequest( request.add_drop_indexes(name); } + for (const auto& rename : settings.RenameIndexes_) { + SerializeTo(rename, *request.add_rename_indexes()); + } + for (const auto& addChangefeed : settings.AddChangefeeds_) { addChangefeed.SerializeTo(*request.add_add_changefeeds()); } diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.h b/ydb/public/sdk/cpp/client/ydb_table/table.h index c333baf0953..d2d900ea453 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.h +++ b/ydb/public/sdk/cpp/client/ydb_table/table.h @@ -172,6 +172,12 @@ private: ui64 SizeBytes = 0; }; +struct TRenameIndex { + TString SourceName_; + TString DestinationName_; + bool ReplaceDestination_ = false; +}; + bool operator==(const TIndexDescription& lhs, const TIndexDescription& rhs); bool operator!=(const TIndexDescription& lhs, const TIndexDescription& rhs); @@ -1407,6 +1413,7 @@ struct TAlterTableSettings : public TOperationRequestSettings<TAlterTableSetting FLUENT_SETTING_VECTOR(TIndexDescription, AddIndexes); FLUENT_SETTING_VECTOR(TString, DropIndexes); + FLUENT_SETTING_VECTOR(TRenameIndex, RenameIndexes); FLUENT_SETTING_VECTOR(TChangefeedDescription, AddChangefeeds); FLUENT_SETTING_VECTOR(TString, DropChangefeeds); |