Azure Synapse SQL Server 分区开关 - 分区完整性

问题描述 投票:0回答:1

我正在从《Azure 数据工程师助理认证指南》一书中学习分区切换。

我对 GitHub Repo 中的代码示例有疑问。下面是代码。

我的第一个问题:下面的alter语句是将数据从TripTable传输到TripTable_20220101,但是TripTable_20220101是否只定义了1个分区边界,而不是为TripTable定义的3个边界。 这符合标准做法吗?

ALTER TABLE dbo.TripTable SWITCH PARTITION 2 TO dbo.TripTable_20220101 PARTITION 2 WITH (TRUNCATE_TARGET = ON);

我的第二个问题: 为什么 TripTable_20220301 这里必须有 3 个分区边界,而不是像 TripTable_20220101 表那样只有 1 个边界。

ALTER TABLE dbo.TripTable SWITCH PARTITION 4 TO dbo.TripTable_20220301 PARTITION 4 WITH (TRUNCATE_TARGET = ON);
sql-server partitioning azure-synapse
1个回答
0
投票

使用 SWITCH PARTITION 语句时,通常不会为目标表仅定义一个分区边界。 然而,在提供的代码示例中,创建表 TripTable_20220101 时仅使用一个分区边界来匹配要切换的分区。 这是必要的,因为SWITCH PARTITION语句要求源表和目标表具有相同的分区方案和功能。 在这种情况下,由于被切换的分区是针对单个日期的,因此还为同一日期创建了具有单个分区边界的TripTable_20220101表。

例如我尝试过以下示例:

CREATE TABLE Sales
(
    [SaleID] INT NOT NULL,
    [SaleDate] DATE NOT NULL,
    [ProductID] INT NOT NULL,
    [Quantity] INT NOT NULL,
    [Price] DECIMAL(10,2) NOT NULL
)
WITH
(
    CLUSTERED COLUMNSTORE INDEX,
    DISTRIBUTION = HASH([SaleID]),
    PARTITION ([SaleDate] RANGE RIGHT FOR VALUES
        ('2022-01-01', '2022-02-01', '2022-03-01')
    )
);

上表由 SaleDate 列分区,具有 2022 年 1 月、2 月和 3 月的三个分区边界。

如果我们要做分区切换 并且想要删除 1 月份的数据并添加 4 月份的数据。

您可以尝试以下方法:

创建一个与Sales表相同分区方案和分区函数的临时表, 但一月份只有一个分区边界:

CREATE TABLE Sales_January
WITH
(
    CLUSTERED COLUMNSTORE INDEX,
    DISTRIBUTION = HASH([SaleID]),
    PARTITION ([SaleDate] RANGE RIGHT FOR VALUES
        ('2022-01-01')
    )
)
AS
SELECT * FROM Sales WHERE 1=2;
© www.soinside.com 2019 - 2024. All rights reserved.