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

SQL Server(T-SQL)でパーティションを切り替える

    SQL Serverでは、パーティションの切り替えにより、テーブルに大量のデータをすばやくロードしたり、テーブルからロードしたりできます。これにより、deleteまたはinsertステートメントを実行する必要がなくなり、大規模なデータセットを操作するときに非常に役立ちます。

    ALTER TABLEを使用できます テーブルの内外にパーティションを切り替えるステートメント。

    テーブルからパーティションを切り替えるには、コードは次のようになります。

    ALTER TABLE Table1
    SWITCH PARTITION x TO Table2

    これにより、パーティションxが切り替わります。 Table1から Table2へ (ここでx はパーティション番号です)。

    セットアップ

    切り替えを開始する前に、基本的な設定を作成します。これは2つのテーブルで構成されます。 1つはパーティション化されたソーステーブルになり、もう1つは宛先テーブルになります。また、パーティションごとに1つずつ、合計4つのファイルグループを作成します。

    -- Create filegroups
    ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg1;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersLatestFg1dat,  
        FILENAME = '/var/opt/mssql/data/OrdersLatestFg1dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersLatestFg1;
    GO
    
    ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg2;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersLatestFg2dat,  
        FILENAME = '/var/opt/mssql/data/OrdersLatestFg2dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersLatestFg2;
    GO
    ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg3;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersLatestFg3dat,  
        FILENAME = '/var/opt/mssql/data/OrdersLatestFg3dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersLatestFg3;
    GO
    ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg4;
    GO
    
    ALTER DATABASE Test ADD FILE (  
        NAME = OrdersLatestFg4dat,  
        FILENAME = '/var/opt/mssql/data/OrdersLatestFg4dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB
        )  
    TO FILEGROUP OrdersLatestFg4;
    GO
    
    -- Create a partition function that will result in four partitions  
    CREATE PARTITION FUNCTION OrdersLatestPartitionFunction (date)  
        AS RANGE RIGHT FOR VALUES (
            '20200201', 
            '20200301',
            '20200401'
        );
    GO
    
    -- Create a partition scheme that maps the partitions to the filegroups
    CREATE PARTITION SCHEME OrdersLatestPartitionScheme
        AS PARTITION OrdersLatestPartitionFunction  
        TO (
            OrdersLatestFg1,
            OrdersLatestFg2,
            OrdersLatestFg3,
            OrdersLatestFg4
            );  
    GO
    
    -- Create a partitioned table called OrdersLatest that uses the OrderDate column as the partitioning column
    CREATE TABLE OrdersLatest (
        OrderDate date NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL,
        CONSTRAINT PKOrdersLatest PRIMARY KEY CLUSTERED(OrderDate, OrderId)
        )  
        ON OrdersLatestPartitionScheme(OrderDate);  
    GO
    
    -- Insert data into the OrdersLatest table. 
    -- This will end up in partition 3, which is the partition we will switch out to the OrdersMarch table.
    INSERT INTO OrdersLatest(OrderDate, OrderDesc) VALUES
        ('20200302', 'Cat food'),
        ('20200315', 'Water bowl'),
        ('20200318', 'Saddle for camel'),
        ('20200321', 'Dog biscuits'),
        ('20200328', 'Bigfoot shoes');
    GO
    
    -- Create a table that contains the data that we will be switching out to.  
    -- Note that the filegroup matches the filegroup of the partition that we will switch out of.
    CREATE TABLE OrdersMarch (
        OrderDate date NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL,
        CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
        )
        ON OrdersLatestFg3;
    GO
    
    -- Check how many rows are in each table
    SELECT COUNT(*) AS OrdersLatest
    FROM OrdersLatest;
    
    SELECT COUNT(*) AS OrdersMarch 
    FROM OrdersMarch;

    結果:

    +----------------+
    | OrdersLatest   |
    |----------------|
    | 5              |
    +----------------+
    
    +---------------+
    | OrdersMarch   |
    |---------------|
    | 0             |
    +---------------+

    したがって、現在のところ、OrdersLatestには5つの行があります パーティション化されたテーブルであるテーブル。

    5行すべてがパーティション3にあるはずです。それを確認しましょう。

    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('OrdersLatest')
    ORDER BY [Partition];

    結果:

    +-------------+-----------------+--------+
    | Partition   | Filegroup       | Rows   |
    |-------------+-----------------+--------|
    | 1           | OrdersLatestFg1 | 0      |
    | 2           | OrdersLatestFg2 | 0      |
    | 3           | OrdersLatestFg3 | 5      |
    | 4           | OrdersLatestFg4 | 0      |
    +-------------+-----------------+--------+

    はい、5つの行すべてがパーティション3にあることがわかります。パーティション3がOrdersLatestFg3にマップされていることもわかります。 ファイルグループ。 「スイッチアウト」を成功させるには、宛先テーブルがこのファイルグループを使用していることを確認する必要があります。幸い、上記のコードはまさにそれを実行します。 ON OrdersLatestFg3を使用しました テーブルをそのファイルグループに作成するように指定するためにテーブルを作成するとき。

    スイッチアウト

    OK、すべてを切り替える準備ができました。やってみましょう。

    ALTER TABLE OrdersLatest
    SWITCH PARTITION 3 TO OrdersMarch;

    結果:

    Commands completed successfully.

    素晴らしい。スイッチアウトは機能しました。

    各テーブルの行数をもう一度確認しましょう。

    SELECT COUNT(*) AS OrdersLatest
    FROM OrdersLatest;
    
    SELECT COUNT(*) AS OrdersMarch 
    FROM OrdersMarch;

    結果:

    +----------------+
    | OrdersLatest   |
    |----------------|
    | 0              |
    +----------------+
    
    +---------------+
    | OrdersMarch   |
    |---------------|
    | 5             |
    +---------------+

    したがって、データがOrdersLatestから移動されたことがわかります。 OrdersMarchへのテーブル テーブル。

    OrdersLatestのパーティション情報を確認しましょう 。

    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('OrdersLatest')
    ORDER BY [Partition];

    結果:

    +-------------+-----------------+--------+
    | Partition   | Filegroup       | Rows   |
    |-------------+-----------------+--------|
    | 1           | OrdersLatestFg1 | 0      |
    | 2           | OrdersLatestFg2 | 0      |
    | 3           | OrdersLatestFg3 | 0      |
    | 4           | OrdersLatestFg4 | 0      |
    +-------------+-----------------+--------+

    予想どおり、OrdersLatestFg3 パーティションは空になりました。これは、切り替えられたためです。

    OrdersMarchのパーティション情報を確認しましょう テーブル。

    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('OrdersMarch')
    ORDER BY [Partition];

    結果:

    +-------------+-----------------+--------+
    | Partition   | Filegroup       | Rows   |
    |-------------+-----------------+--------|
    | 1           | OrdersLatestFg3 | 5      |
    +-------------+-----------------+--------+

    予想どおり、OrdersMarchテーブルには5つの行が含まれています。これらは、OrdersLatest3のパーティション1(唯一のパーティション)に保存されます。 ファイルグループ。

    スイッチイン

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


    1. SQL-階層を保存してナビゲートする方法は?

    2. 異なる日付形式でCSVをMySQLにインポートする

    3. MySQL数学関数(全リスト)

    4. MySQL FLOOR()関数–最も近い整数に切り捨て