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

SQL Server(T-SQL)で複数のパーティションを単一のファイルグループにマップする方法

    SQL Serverでのパーティションテーブルの作成に精通している場合は、パーティションごとに個別のファイルグループを作成することに慣れているかもしれません。これには利点があり、ほとんどのシナリオで選択する方法である可能性があります。

    ただし、複数のパーティションを単一のファイルグループにマッピングするオプションもあります。

    この記事では、複数のパーティションを1つのファイルグループにマッピングする2つの例を紹介します。

    • 例1はすべてをマップします 単一のファイルグループへのパーティション。
    • 例2は、一部のパーティションを1つのファイルグループにマップし、一部を別のファイルグループにマップします。

    例1-すべてのパーティションを単一のファイルグループにマップする

    すべてのパーティションを単一のファイルグループにマップするには、ALL引数を使用します。これは、すべてのパーティションが指定されたファイルグループにマップされるか、[PRIMARY]の場合はプライマリファイルグループにマップされることを指定します。 が指定されています。

    ALLの場合は注意してください が指定されている場合、指定できるファイルグループは1つだけです。

    -- Create one filegroup
    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
    
    -- Create a partition function that will result in twelve partitions  
    CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
        AS RANGE RIGHT FOR VALUES (
            '20200201', 
            '20200301',
            '20200401', 
            '20200501',
            '20200601',
            '20200701',
            '20200801',
            '20200901',
            '20201001',
            '20201101',
            '20201201'
        );
    GO
    
    -- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
    CREATE PARTITION SCHEME OrdersNewPartitionScheme
        AS PARTITION OrdersNewPartitionFunction  
        ALL TO (OrdersNewFg1);  
    GO
    
    -- Create a partitioned table
    CREATE TABLE OrdersNew (
        OrderDate date NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL
        )  
        ON OrdersNewPartitionScheme (OrderDate);  
    GO

    ここで、私は次のことを行いました:

    • ファイルグループと関連ファイルを作成しました
    • パーティション関数を作成しました
    • パーティションスキームを作成しました
    • そのパーティションスキームを使用するテーブルを作成しました

    重要な部分は、CREATE PARTITION SCHEMEの最後の行です。 声明。具体的には、ALL すべてのパーティションを指定されたファイルグループにマップするキーワード。

    それらを複数のファイルグループにマッピングする場合は、ALLを省略します。 、次に、ファイルグループのリストを1つだけではなく、コンマで区切ってください。

    マッピングを確認する

    次のクエリを使用して、各パーティションが同じファイルグループにマップされていることを確認できます。

    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');

    結果:

    +-------------+--------------+--------+
    | Partition   | Filegroup    | Rows   |
    |-------------+--------------+--------|
    | 1           | OrdersNewFg1 | 0      |
    | 2           | OrdersNewFg1 | 0      |
    | 3           | OrdersNewFg1 | 0      |
    | 4           | OrdersNewFg1 | 0      |
    | 5           | OrdersNewFg1 | 0      |
    | 6           | OrdersNewFg1 | 0      |
    | 7           | OrdersNewFg1 | 0      |
    | 8           | OrdersNewFg1 | 0      |
    | 9           | OrdersNewFg1 | 0      |
    | 10          | OrdersNewFg1 | 0      |
    | 11          | OrdersNewFg1 | 0      |
    | 12          | OrdersNewFg1 | 0      |
    +-------------+--------------+--------+

    このクエリは、各パーティションにある行数も示します。データを挿入していないため、すべてゼロです。

    例2–一部のパーティションを単一のファイルグループにマップする

    この例は、12のパーティションを2つの別々のファイルグループにマップすることを除いて、前の例とほとんど同じです。

    この場合、ALLは省略します ALLの場合、指定できるファイルグループは1つだけであるため、引数 が指定されています。

    -- Create two 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
    
    -- Create a partition function that will result in twelve partitions  
    CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
        AS RANGE RIGHT FOR VALUES (
            '20200201', 
            '20200301',
            '20200401', 
            '20200501',
            '20200601',
            '20200701',
            '20200801',
            '20200901',
            '20201001',
            '20201101',
            '20201201'
        );
    GO
    
    -- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
    CREATE PARTITION SCHEME OrdersNewPartitionScheme
        AS PARTITION OrdersNewPartitionFunction  
        TO (
            OrdersNewFg1,
            OrdersNewFg1,
            OrdersNewFg1,
            OrdersNewFg1,
            OrdersNewFg1,
            OrdersNewFg1,
            OrdersNewFg2,
            OrdersNewFg2,
            OrdersNewFg2,
            OrdersNewFg2,
            OrdersNewFg2,
            OrdersNewFg2
            );  
    GO
    
    -- Create a partitioned table
    CREATE TABLE OrdersNew (
        OrderDate date NOT NULL,
        OrderId int IDENTITY NOT NULL,
        OrderDesc varchar(255) NOT NULL
        )  
        ON OrdersNewPartitionScheme (OrderDate);  
    GO

    マッピングを確認する

    パーティションがファイルグループにどのようにマップされるかを見てみましょう。

    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');

    結果:

    +-------------+--------------+--------+
    | Partition   | Filegroup    | Rows   |
    |-------------+--------------+--------|
    | 1           | OrdersNewFg1 | 0      |
    | 2           | OrdersNewFg1 | 0      |
    | 3           | OrdersNewFg1 | 0      |
    | 4           | OrdersNewFg1 | 0      |
    | 5           | OrdersNewFg1 | 0      |
    | 6           | OrdersNewFg1 | 0      |
    | 7           | OrdersNewFg2 | 0      |
    | 8           | OrdersNewFg2 | 0      |
    | 9           | OrdersNewFg2 | 0      |
    | 10          | OrdersNewFg2 | 0      |
    | 11          | OrdersNewFg2 | 0      |
    | 12          | OrdersNewFg2 | 0      |
    +-------------+--------------+--------+

    予想どおり、最初の6つのパーティションは最初のファイルグループにマップされ、残りは2番目のファイルグループにマップされます。


    1. SQL Serverで不明な数の列と集計なしをピボットする方法は?

    2. MySQLの単一引用符、二重引用符、およびバッククォート

    3. java.library.pathにsqljdbc_authがありません

    4. コメントはストアドプロシージャのパフォーマンスを妨げる可能性がありますか?