.replace extents 命令
适用于:✅Azure 数据资源管理器
此命令可在特定数据库的单个事务中删除和移动盘区。 此命令会从目标表中删除任何指定的盘区,并将指定的盘区从源表移动到目标表。
注意
数据分片称为“区”,所有命令都将“extent”或“extents”作为同义词使用。 若要详细了解区,请参阅区(数据分片)概述。
权限
对于源表和目标表,你必须至少具有表管理员权限。
限制
- 源表和目标表都必须位于上下文数据库中。
- ExtentsToDropQuery 指定的所有区都应属于目标表。
- 源表中的所有列均应以相同的名称和数据类型存在于目标表中。
- 如果目标表是具体化视图的源表,则命令可能会失败,因为具体化视图无法处理移动盘区中的记录。 在具体化视图限制页中查看更多详细信息。 可以通过在移动命令中设置新的引入时间来解决这个错误。 请参阅支持的属性中的
setNewIngestionTime
。
语法
.replace
[async
] extents
in
table
DestinationTableName [ with
(
PropertyName =
PropertyValue [,
...])
] <|
{
ExtentsToDropQuery},{
ExtentsToMoveQuery}
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
async |
string |
如果指定此参数,命令将以异步方式运行。 | |
DestinationTableName | string |
✔️ | 要将区移动到其中的表的名称。 |
FromDate | datetime |
查询窗口开始日期。 | |
ToDate | datetime |
查询窗口结束日期。 | |
PropertyName、PropertyValue | string |
一个或多个支持的属性。 | |
ExtentsToDropQuery | string |
✔️ | 此查询的结果必须包括 ExtentId 列,其中包含要从目标表中删除的盘区 ID。 |
ExtentsToMoveQuery | string |
✔️ | 此查询的结果必须包括 ExtentId 和 TableName 列,其中包含要移动到目标表的源表和盘区 ID。 |
支持的属性
属性名称 | 类型 | 必需 | 说明 |
---|---|---|---|
setNewIngestionTime |
bool |
如果设置为 true ,则会为要移动的区内的所有记录分配一个新的引入时间。 当记录由依赖于数据库游标的工作负荷(如具体化视图和连续数据导出)处理时,这会非常有用。 |
|
extentCreatedOnFrom |
datetime |
✔️ | 应用于在此时间点之后创建的区。 |
extentCreatedOnTo |
datetime |
✔️ | 应用于在此时间点之前创建的区。 |
注意
为了提高性能,请将 extentCreatedOnFrom 和 extentCreatedOnTo 参数设置为尽可能小的范围。
返回
同步运行此命令时,将返回具有以下架构的表。
输出参数 | 类型 | 说明 |
---|---|---|
OriginalExtentId | string |
源表中被移动到目标表的原始盘区或目标表中被删除的盘区的唯一标识符 (GUID)。 |
ResultExtentId | string |
从源表移动到目标表的结果盘区的唯一标识符 (GUID)。 如果已从目标表中删除该区,则为空。 失败时:“失败”。 |
详细信息 | string |
包括失败详细信息(如果操作失败)。 |
异步运行此命令时,将返回操作 ID (GUID)。 使用 .show operations 命令监视操作的状态,使用 .show operation details 命令检索成功的执行的结果。
注意
如果目标表中不存在 ExtentsToDropQuery 查询返回的区,该命令将失败。 如果在执行 replace 命令之前合并了盘区,则可能会发生这种情况。 为确保命令在缺失盘区时失败,请检查查询是否返回所需的盘区 ID。 如果要删除的范围不存在于表 MyOtherTable 中,第一个示例将会失败。 然而,第二个示例即使要删除的盘区不存在也会成功,因为要删除的查询没有返回任何盘区 ID。
示例
从两个表移动指定创建时间范围内的所有盘区
将指定创建时间范围内的两个特定表(MyTable1
、MyTable2
)的所有盘区移至表 MyOtherTable
,并删除 MyOtherTable
中标有 drop-by:MyTag
的所有盘区:
.replace extents in table MyOtherTable with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
{
.show table MyOtherTable extents where tags has 'drop-by:MyTag'
},
{
.show tables (MyTable1,MyTable2) extents
}
示例输出
OriginalExtentId | ResultExtentId | 详细信息 |
---|---|---|
e133f050-a1e2-4dad-8552-1f5cf47cab69 | 0d96ab2d-9dd2-4d2c-a45e-b24c65aa6687 | |
cdbeb35b-87ea-499f-b545-defbae091b57 | a90a303c-8a14-4207-8f35-d8ea94ca45be | |
4fcb4598-9a31-4614-903c-0c67c286da8c | 97aafea1-59ff-4312-b06b-08f42187872f | |
2dfdef64-62a3-4950-a130-96b5b1083b5a | 0fb7f3da-5e28-4f09-a000-e62eb41592df |
将指定创建时间范围内的所有盘区从一个表移到另一个表,删除特定盘区
将指定创建时间范围内的所有盘区从一个特定表 (MyTable1
) 移到表 MyOtherTable
,并通过 ID 删除 MyOtherTable
中的特定盘区:
.replace extents in table MyOtherTable with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
{
print ExtentId = "2cca5844-8f0d-454e-bdad-299e978be5df"
},
{
.show table MyTable1 extents
}
.replace extents in table MyOtherTable with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
{
.show table MyOtherTable extents
| where ExtentId == guid(2cca5844-8f0d-454e-bdad-299e978be5df)
},
{
.show table MyTable1 extents
}
实现幂等逻辑
实现幂等逻辑,以便 Kusto 仅在有区要从表 t_source
移至表 t_dest
的情况下才从表 t_dest
中删除区:
.replace async extents in table t_dest with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
{
let any_extents_to_move = toscalar(
t_source
| where extent_tags() has 'drop-by:blue'
| summarize count() > 0
);
let extents_to_drop =
t_dest
| where any_extents_to_move and extent_tags() has 'drop-by:blue'
| summarize by ExtentId = extent_id()
;
extents_to_drop
},
{
let extents_to_move =
t_source
| where extent_tags() has 'drop-by:blue'
| summarize by ExtentId = extent_id(), TableName = 't_source'
;
extents_to_move
}