0

在网上和网上的书上看了一下,找不到我的问题的答案,所以就这样吧。

在进行其他人的设计时,我有几个表都绑定到相同的分区模式和分区函数。我希望执行会影响数亿行的拆分操作。

拆分没问题:

ALTER PARTITION SCHEME [ps_Scheme] NEXT USED [FG1]  ; 
ALTER PARTITION FUNCTION [pfcn_Function]() SPLIT RANGE (20120331)

但是,我担心这会同时影响许多表并且不可取。

因此,我打算创建一个表的新副本并在一个新函数上进行拆分

CREATE PARTITION FUNCTION [pfcn_Function1](INT) 
AS RANGE RIGHT 
FOR VALUES 
(
 20090101, 20090130, 20090131, 20090201...etc
)

CREATE PARTITION SCHEME [ps_Scheme1] 
AS PARTITION [pfcn_Function1] TO 
([FG1], [FG2] etc

CREATE TABLE [dbo].[myTableCopy]
(
....
) ON ps_Scheme1

然后我会切换我希望拆分的分区:

-- The partition numbers did not align because they are based on 2 different functions.
ALTER TABLE [Table] SWITCH PARTITION 173 TO [TableCopy] PARTITION 172

最后我的问题是这可以自动化吗?您可以使用 SELECT INTO 在 SQL 中轻松制作表的副本,但我看不到如何自动对表进行分区,即 CREATE TABLE 语句末尾指向分区方案的位。

感谢您的任何回复。

4

3 回答 3

1

在网上的书上找到这个:

您可以通过以下两种方式之一将现有的非分区表转换为分区表。

一种方法是使用 CREATE INDEX 语句在表上创建分区聚集索引。此操作类似于在任何表上创建聚集索引,因为 SQL Server 实质上会删除该表并以聚集索引格式重新创建它。如果表已经应用了分区聚集索引,则可以删除索引并在分区方案上通过使用带有 DROP EXISTING = ON 子句的 CREATE INDEX 重建它

我认为这可能会解决我的问题。

于 2012-09-25T08:23:50.157 回答
0

是的,您可以在自动化过程中切换分区。这是您可以自定义的代码示例。它由元数据表驱动。

CREATE TABLE [dbo].[PartitionTableSetup](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TableName] [varchar](256) NULL,
[SwitchTable] [varchar](256) NULL,
[Partition] [int] NULL)

select @merge = (
Select N'' + com + '' from (
Select N' ALTER TABLE  '
+ TableName +
' SWITCH PARTITION 2 TO '
+ SwitchTable 
+ ' PARTITION 2 Truncate table ' 
+ SwitchTable as com
,value
,1 as ord
From (
SELECT convert(datetime,value) as value
,pt.TableName
,pt.SwitchTable
FROM sys.partition_range_values AS RV
JOIN sys.partition_functions AS PF 
ON RV.function_id = PF.function_id
Join dbo.[Partitions] pr 
On name = PartitionFunction
Join dbo.PartitionTableSetup pt 
On pt.[Partition] = pr.ID
WHERE datediff(d,convert(datetime,value),GETDATE()) > pr.[Range] -3
) a
Union all
Select N' ALTER PARTITION FUNCTION '
+ b.PartitionFunction 
+ '() MERGE RANGE ('''
+ Convert(nvarchar,value,121) 
+''')' as com
,value
,2 as ord
From (
SELECT convert(datetime,value) as value
,pr.PartitionFunction
FROM sys.partition_range_values AS RV
JOIN sys.partition_functions AS PF 
ON RV.function_id = PF.function_id
Join dbo.[Partitions] pr 
On name = PartitionFunction
WHERE datediff(d,convert(datetime,value),GETDATE()) > pr.[Range] -3
) b       
) c Order by value
, ord
for xml path ('')
)   
EXECUTE (@merge)
于 2012-09-25T09:03:17.410 回答
0

它可以自动化,但我不确定是否值得。如果只是“几个”表,而不是数百个,那么最好只编写每个表的脚本,然后构建一个脚本来执行复制/拆分复制/切换/拆分源/切换。

sys.tables自动化这将涉及从/ sys.columns/ sys.indexes/sys.index_columns和其他类似视图动态构建临时表定义,包括所有索引。与SMO Scripting相同的方式。

于 2012-09-25T08:55:47.417 回答