1. ホーム
  2. データベース
  3. エムエスエル

SQL Server テーブルパーティション削除の詳細

2022-01-05 04:52:23

I. はじめに

パーティションの削除は、パーティションのマージとも呼ばれ、簡単に言えば複数のパーティションのデータをマージすることです。ここでは、テーブル Sales.SalesOrderHeader を例にして、テーブル・パーティションの削除を実行する方法を説明します。

大事なことは3回言うこと。 データベースをバックアップしてください データベースをバックアップせよ! データベースをバックアップしてください

II. デモ

2.1. データクエリ

2.1.1, パーティションメタデータを見る

SELECT * FROM SYS.PARTITION_FUNCTIONS --partitioning functions
SELECT * FROM SYS.PARTITION_RANGE_VALUES -- partitioning scheme



2.1.2. 各パーティションのデータ量をカウントする

SELECT $PARTITION.SalesOrderHeader_OrderDate(OrderDate) AS NUMBER,COUNT(1) AS COUNT
FROM [Sales]. [SalesOrderHeader].
GROUP BY $PARTITION.SalesOrderHeader_OrderDate(OrderDate)




パーティション・スキームとパーティション・ファンクションは、パーティション・テーブルにデータがある状態では削除できません。データを別のテーブルに移動してから削除してください。

2.2. ハンズオンの削除

2.2.1、元のテーブルパーティションをマージする

ALTER PARTITION FUNCTION SalesOrderHeader_OrderDate() MERGE RANGE('2011-01-01 00:00:00.000')
ALTER PARTITION FUNCTION SalesOrderHeader_OrderDate() MERGE RANGE('2012-01-01 00:00:00.000')
ALTER PARTITION FUNCTION SalesOrderHeader_OrderDate() MERGE RANGE('2013-01-01 00:00:00.000')
ALTER PARTITION FUNCTION SalesOrderHeader_OrderDate() MERGE RANGE('2014-01-01 00:00:00.000')



2.2.2, 元テーブルの全インデックスの作成スクリプトをバックアップする。

ALTER TABLE [Sales]. [SalesOrderHeader] ADD CONSTRAINT [PK_SalesOrderHeader_SalesOrderID] PRIMARY KEY NONCLUSTERED 
(
    [SalesOrderID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_ LOCKS = ON) ON [PRIMARY]



2.2.3. 元のテーブルからすべてのインデックスを削除する

ALTER TABLE [Sales]. [SalesOrderHeader] DROP CONSTRAINT [PK_SalesOrderHeader_SalesOrderID]



2.2.4. テンポラリテーブルの作成

CREATE TABLE [Sales]. [SalesOrderHeader_Temp](
    [SalesOrderID] [INT] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [RevisionNumber] [TINYINT] NOT NULL,
    [OrderDate] [DATETIME] NOT NULL,
    [OrderDate] [DATETIME] NOT NULL, [DueDate] [DATETIME] NOT NULL,
    [ShipDate] [DATETIME] NULL,
    [Status] [TINYINT] NOT NULL,
    [OnlineOrderFlag] [dbo]. [Flag] NOT NULL,
    [SalesOrderNumber] AS (ISNULL(N'SO'+CONVERT([NVARCHAR](23),[SalesOrderID]),N'*** ERROR ***')),
    [PurchaseOrderNumber] [dbo]. [OrderNumber] NULL,
    [AccountNumber] [dbo]. [AccountNumber] NULL,
    [CustomerID] [INT] NOT NULL,
    [SalesPersonID] [INT] NULL,
    [TerritoryID] [INT] NULL,
    [BillToAddressID] [INT] NOT NULL,
    [ShipToAddressID] [INT] NOT NULL,
    [ShipMethodID] [INT] NOT NULL,
    [CreditCardID] [INT] NULL,
    [CreditCardApprovalCode] [VARCHAR](15) NULL,
    [CurrencyRateID] [INT] NULL,
    [SubTotal] [MONEY] NOT NULL,
    [TaxAmt] [MONEY] NOT NULL, [TaxAmt] [MONEY] NOT NULL, [TaxAmt] [MONEY] NOT NULL,
    [Freight] [MONEY] NOT NULL,
    [TotalDue] AS (ISNULL(([SubTotal]+[TaxAmt])+[Freight],(0))),
    [Comment] [NVARCHAR](128) NULL,
    [rowguid] [UNIQUEIDENTIFIER] ROWGUIDCOL NOT NULL,
    [ModifiedDate] [DATETIME] NOT NULL
)



2.2.5. オリジナルテーブルのデータスペースの種類を変更する

1) 元のテーブルに対して Sales.SalesOrderHeader 右クリックで「デザイン」をクリックします。

2) メニューバー "表示"->"プロパティウィンドウ" をクリックします。

3) データスペースの種類を "FILE GROUP" に変更します。通常のデータスペースの指定は "PRIMARY" がデフォルトです。

2.2.6. 元のテーブルパーティションデータをテンポラリーテーブルに移動する

ALTER TABLE [Sales]. [SalesOrderHeader] SWITCH PARTITION 1 TO [Sales]. [SalesOrderHeader_Temp] PARTITION 1



2.2.7. 元のテーブルのすべてのインデックスを作成する をテンポラリテーブル

ALTER TABLE [Sales]. [SalesOrderHeader_Temp] ADD CONSTRAINT [PK_SalesOrderHeader_SalesOrderID] PRIMARY KEY NONCLUSTERED 
(
    [SalesOrderID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_ LOCKS = ON) ON [PRIMARY]



2.2.8. 元のテーブルを削除する

DROP TABLE Sales.SalesOrderHeader



2.2.9. パーティションスキームとパーティションファンクションの削除

DROP PARTITION SCHEME SalesOrderHeader_OrderDate
DROP PARTITION FUNCTION SalesOrderHeader_OrderDate



2.2.10 テーブル名の変更

EXEC SP_RENAME '[Sales]. [SalesOrderHeader_Temp]','SalesOrderHeader'


この時点でこの記事の SQL Server テーブル・パーティション削除の詳細、さらに関連する SQL Server テーブル・パーティションの削除については、Scripting Houseの過去の記事を検索していただくか、引き続き以下の関連記事をご覧ください。