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

オンラインの本でこれを見つけました:

2 つの方法のいずれかで、既存の非パーティション テーブルをパーティション テーブルに変換できます。

1 つの方法は、CREATE INDEX ステートメントを使用して、テーブルにパーティション クラスター化インデックスを作成することです。SQL Server は基本的にテーブルを削除し、クラスター化インデックス形式で再作成するため、このアクションは任意のテーブルにクラスター化インデックスを作成するのと似ています。テーブルに既にパーティション化されたクラスター化インデックスが適用されている場合は、DROP EXISTING = ON 句を指定した CREATE INDEX を使用して、インデックスを削除し、パーティション構成で再構築できます。

これで問題が解決するかもしれないと思います。

于 2012-09-25T08:23:50.157 に答える
0

自動化できますが、それだけの価値があるかどうかはわかりません。数百ではなく「数」のテーブルのみの場合は、各テーブルをスクリプト化してから、コピー アウト/コピーの分割/スイッチ アウト/ソースの分割/スイッチ インを実行するスクリプトを作成することをお勧めします。

sys.tablesこれを自動化するには、 / sys.columns/ sys.indexes/sys.index_columnsおよび他の同様のビューから、すべてのインデックスを含む一時テーブル定義を動的に構築する必要があります。SMO スクリプティングが行うのと同じ方法です。

于 2012-09-25T08:55:47.417 に答える
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 に答える