baa*_*hen 4 sql-server partitioning
我已经在具有 varchar 数据类型的列上对表进行了分区。
\n\n关于带有分区的截断表的文档使用分区ID:
\n\nTruncate table parttable with (partitions (1,2,5))\n
Run Code Online (Sandbox Code Playgroud)\n\n我只有分区列中的实际值的列表。
\n\n如何从值列表中获取分区ID,以便可以在截断表语句中使用它?
\n\n背景:
\n\n我\xe2\x80\x99m 对分区仍然很陌生,需要验证我的计划。
\n\n我有一个事实表,它按 varchar 数据类型的列进行分区。
\n\n我有一个 etl 流程,可以在月初完全加载数据。
\n\n之后加载的数据仅包含一个子集(分区列),并且需要完全替换事实表中的现有数据。
\n\n我的计划是:
\n\n首先将数据加载到临时表中。
截断临时表中分区值的事实表。
将临时表中的数据插入到事实表中。
我这样做正确吗?
\n像这样:
create partition function pf(int) as range right for values (1,2,3,4,5)
create partition scheme ps as partition pf all to ([Primary])
create table parttable(id int primary key, a int, b int, c int) on ps(id)
insert into parttable(id,a,b,c) values (0,0,0,0), (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6)
Truncate table parttable with (partitions ($partition.pf(1),$partition.pf(2),$partition.pf(5)))
select * from parttable
Run Code Online (Sandbox Code Playgroud)
输出
id a b c
----------- ----------- ----------- -----------
0 0 0 0
3 3 3 3
4 4 4 4
Run Code Online (Sandbox Code Playgroud)
您可以像这样动态地执行此操作:
declare @listOfPartitionColumnValues nvarchar(max) = '1,2,5'
declare @listOfPartitionNumbers nvarchar(max) =
(
select string_agg(pn,',')
from
(
select distinct $partition.pf(v.value) pn
from string_split(@listOfPartitionColumnValues,',') v
) p
)
declare @sql nvarchar(max) = concat('truncate table parttable with (partitions (',@listOfPartitionNumbers ,'))')
print @sql
exec (@sql)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1066 次 |
最近记录: |