aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordcherednik <dcherednik@ydb.tech>2023-03-15 11:55:04 +0300
committerdcherednik <dcherednik@ydb.tech>2023-03-15 11:55:04 +0300
commita8bfa77c8bcaf013f546a8f735fe72e3ef3d87ba (patch)
treefcc58d5b2a10495f258769d485a7c65ec2359311
parent37c8e6daa14894ac5c80794042203224f2804ba9 (diff)
downloadydb-a8bfa77c8bcaf013f546a8f735fe72e3ef3d87ba.tar.gz
Rename index cli support. Update the Documentation.
-rw-r--r--ydb/docs/ru/core/best_practices/_includes/secondary_indexes.md8
-rw-r--r--ydb/docs/ru/core/reference/ydb-cli/commands/_includes/secondary_index.md26
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/alter_table.md11
-rw-r--r--ydb/public/lib/ydb_cli/commands/ydb_service_table.cpp40
-rw-r--r--ydb/public/lib/ydb_cli/commands/ydb_service_table.h12
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.cpp10
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.h7
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);