我正在从《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);
使用 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;