.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 ✔️ 此查询的结果必须包括 ExtentIdTableName 列,其中包含要移动到目标表的源表和盘区 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。

示例

从两个表移动指定创建时间范围内的所有盘区

将指定创建时间范围内的两个特定表(MyTable1MyTable2)的所有盘区移至表 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
}