sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)のパーティションのスイッチイン

    SQL Serverでは、パーティションテーブルの内外でパーティションを切り替えることができます。

    これは、ALTER TABLEを使用して行うことができます 声明。基本的には次のようになります:

    ALTER TABLE OldTable
    SWITCH TO NewTable PARTITION x

    これにより、OldTableのパーティションが切り替わります。 パーティションxNewTableの (ここでx はパーティション番号です)。

    スイッチインを開始する前に、2つのテーブルを設定しましょう。 1つ(OrdersOldと呼ばれます )には、他のテーブル(OrdersNewと呼ばれる)に「スイッチイン」するデータが含まれます )。

    OrdersNewを分割します 4つのパーティションに。

    -- Create filegroups
    ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersNewFg1dat,  
        FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersNewFg1;
    GO
    
    ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersNewFg2dat,  
        FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersNewFg2;
    GO
    ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersNewFg3dat,  
        FILENAME = '/var/opt/mssql/data/OrdersNewFg3dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersNewFg3;
    GO
    ALTER DATABASE Test ADD FILEGROUP OrdersNewFg4;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersNewFg4dat,  
        FILENAME = '/var/opt/mssql/data/OrdersNewFg4dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersNewFg4;
    GO
    
    -- Create a partition function that will result in four partitions  
    CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
        AS RANGE RIGHT FOR VALUES (
            '20200201', 
            '20200301',
            '20200401'
        );
    GO
    
    -- Create a partition scheme that maps the partitions to the filegroups
    CREATE PARTITION SCHEME OrdersNewPartitionScheme
        AS PARTITION OrdersNewPartitionFunction  
        TO (
            OrdersNewFg1,
            OrdersNewFg2,
            OrdersNewFg3,
            OrdersNewFg4
            );  
    GO
    
    -- Create a table that contains the data that we will be switching in.  
    -- Note that the filegroup matches the filegroup of the partition that we will switch in to.
    -- Include CHECK constraint to restrict data to the range specified in the switch-in partition
    CREATE TABLE OrdersOld (
        OrderDate date NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL,
        CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
        CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate, OrderId)
        )
        ON OrdersNewFg3;
    GO
    
    -- Insert data into the OrdersOld table. This is the data we will be switching in to the OrdersNew table.
    INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
        ('20200302', 'Cat food'),
        ('20200315', 'Water bowl'),
        ('20200318', 'Saddle for camel'),
        ('20200321', 'Dog biscuits'),
        ('20200328', 'Bigfoot shoes');
    GO
    
    -- Create a partitioned table called OrdersNew that uses the OrderDate column as the partitioning column
    CREATE TABLE OrdersNew (
        OrderDate date NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL,
        CONSTRAINT PKOrdersNew PRIMARY KEY CLUSTERED(OrderDate, OrderId)
        )  
        ON OrdersNewPartitionScheme (OrderDate);  
    GO
    
    -- Check how many rows are in each table
    SELECT COUNT(*) AS OrdersOld 
    FROM OrdersOld;
    
    SELECT COUNT(*) AS OrdersNew
    FROM OrdersNew;

    結果:

    +-------------+
    | OrdersOld   |
    |-------------|
    | 5           |
    +-------------+
    
    +-------------+
    | OrdersNew   |
    |-------------|
    | 0           |
    +-------------+

    したがって、現在のところ、OrdersOld 5行とOrdersNewが含まれています 空です。

    データを切り替える時間です。

    ALTER TABLE OrdersOld
    SWITCH TO OrdersNew PARTITION 3;

    結果:

    Commands completed successfully.

    これで、データは宛先テーブルのパーティション3に正常に切り替えられました。

    両方のテーブルをもう一度確認しましょう。

    SELECT COUNT(*) AS OrdersOld 
    FROM OrdersOld;
    
    SELECT COUNT(*) AS OrdersNew
    FROM OrdersNew;

    結果:

    +-------------+
    | OrdersOld   |
    |-------------|
    | 0           |
    +-------------+
    
    +-------------+
    | OrdersNew   |
    |-------------|
    | 5           |
    +-------------+

    今回はOrdersOld は空で、OrdersNew 5行含まれています。

    次のクエリを実行して、データが配置されている実際のパーティションを確認することもできます。

    SELECT 
        p.partition_number AS [Partition], 
        fg.name AS [Filegroup], 
        p.Rows
    FROM sys.partitions p
        INNER JOIN sys.allocation_units au
        ON au.container_id = p.hobt_id
        INNER JOIN sys.filegroups fg
        ON fg.data_space_id = au.data_space_id
    WHERE p.object_id = OBJECT_ID('OrdersNew')
    ORDER BY [Partition];

    結果:

    +-------------+--------------+--------+
    | Partition   | Filegroup    | Rows   |
    |-------------+--------------+--------|
    | 1           | OrdersNewFg1 | 0      |
    | 2           | OrdersNewFg2 | 0      |
    | 3           | OrdersNewFg3 | 5      |
    | 4           | OrdersNewFg4 | 0      |
    +-------------+--------------+--------+

    予想どおり、5行すべてがOrdersNewFg3のパーティション3に割り当てられます。 ファイルグループ。

    一般的なエラー

    エラー4982

    上記の例では、CHECKを作成したことがわかります。 OrdersOldを作成するときの制約 テーブル。

    エラーメッセージ4982(ALTER TABLE SWITCH statement failed...)が表示された場合 )、CHECKを作成しなかった可能性があります ソーステーブルの制約。

    または、CHECKを作成した可能性があります 制約がありますが、スイッチインパーティションの範囲間の値は強制されません。

    スイッチイン値が実際にパーティションで定義された範囲内にあることを確認する必要があります。SQLServerはCHECKを検索します。 これを検証するソーステーブルの制約。

    エラー4939

    もう1つの一般的なものは、エラー4939(ALTER TABLE SWITCH statement failed... )。

    このエラーが発生した場合は、ソーステーブルとは異なるファイルグループを使用するパーティションに切り替えようとしている可能性があります。

    パーティションを切り替えるための要件の1つは、ソーステーブルまたはパーティションとターゲットテーブルまたはパーティションの両方が同じファイルグループに配置されている必要があることです。

    このエラーを修正するには、ソーステーブルが宛先パーティションと同じファイルグループを使用していることを確認してください。

    スイッチアウト

    パーティションをスイッチアウトする方法については、SQLServerでのパーティションのスイッチアウトを参照してください。


    1. mysqlトランザクション-例外があればロールバックします

    2. Visual StudioでSSISロードを実行しているときにODBC接続が失敗するのに、パッケージ実行ユーティリティを使用して同じパッケージを実行している場合は失敗するのはなぜですか

    3. mysqliまたは死ぬ、それは死ぬ必要がありますか?

    4. データベーステーブルにいくつかのレコードがあるかどうかを確認する最速の方法は?