.replace extents 命令

此命令在特定数据库的上下文中运行。 它将指定的区从其源表移至目标表,然后从目标表中删除指定的区。 所有删除和移动操作都在单个事务中完成。

注意

数据分片称为“区”,所有命令都将“extent”或“extents”作为同义词使用。 若要详细了解区,请参阅区(数据分片)概述

权限

对于源表和目标表,你必须至少具有表管理员权限。

限制

  • 源表和目标表都必须位于上下文数据库中。
  • ExtentsToDropQuery 指定的所有区都应属于目标表。
  • 源表中的所有列均应以相同的名称和数据类型存在于目标表中。
  • 如果目标表是具体化视图的源表,则命令可能会失败,因为具体化视图不会处理移动盘区中的记录。 在具体化视图限制页中查看更多详细信息。 可以通过在移动命令期间设置新的引入时间来解决此错误。 请参阅支持的属性中的 setNewIngestionTime

语法

.replace [async] extentsintableDestinationTableName [ with(PropertyName=PropertyValue [, ...])] <|{ExtentsToDropQuery},{ExtentsToMoveQuery}

详细了解语法约定

参数

客户 类型​​ 必需 说明
async string 如果指定此参数,命令将以异步方式运行。
DestinationTableName string 要将区移动到其中的表的名称。
FromDate datetime 查询窗口开始日期。
ToDate datetime 查询窗口结束日期。
PropertyName、PropertyValue string 一个或多个支持的属性
ExtentsToDropQuery string 此查询的结果指定应从目标表中删除的区 ID。 应返回一个包含名为“ExtentId”的列的记录集。
ExtentsToMoveQuery string Kusto 查询语言 (KQL) 查询的结果指定要移动到目标表的源表和盘区 ID。 应返回一个具有“ExtentId”和“TableName”列的记录集。

支持的属性

属性名称 类型 必需 说明
setNewIngestionTime bool 如果设置为 true,则会为要移动的区内的所有记录分配一个新的引入时间。 当记录应由依赖于数据库游标的工作负荷(例如具体化视图连续数据导出)处理时,这很有用。
extentCreatedOnFrom datetime 应用于在此时间点之后创建的区。
extentCreatedOnTo datetime 应用于在此时间点之前创建的区。

注意

为了提高性能,请将 extentCreatedOnFrom 和 extentCreatedOnTo 参数设置为尽可能小的范围。

返回

同步运行此命令时,将返回具有以下架构的表。

输出参数 类型 说明
OriginalExtentId string 源表中原始区(已移至目标表)或目标表中已被删除的区的唯一标识符。
ResultExtentId string 已从源表移至目标表的结果区的唯一标识符 (GUID)。 如果已从目标表中删除该区,则为空。 失败时:“失败”。
详细信息 string 包括失败详细信息(如果操作失败)。

异步运行此命令时,将返回操作 ID (GUID)。 使用 .show operations 命令监视操作的状态,使用 .show operation details 命令检索成功的执行的结果。

注意

如果目标表中不存在 ExtentsToDropQuery 查询返回的区,该命令将失败。 如果在执行 replace 命令之前合并了盘区,则可能会发生这种情况。 为确保命令在缺失盘区时失败,请检查查询是否返回所需的盘区 ID。 如果表 MyOtherTable 中不存在要删除的区,下面的示例 #1 将会失败。 但是,即使要删除的区不存在,示例 #2 也会成功,因为用于执行删除操作的查询未返回任何区 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
}