你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
.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)的唯一标识符(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
}