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

SQL Server(T-SQL)でパーティションを2つに分割する

    SQL Serverにパーティション化されたテーブルまたはインデックスがあり、さらにパーティションが必要な場合は、ALTER PARTITION FUNCTIONを使用してパーティション関数にパーティションを追加できます。 SPLIT RANGEを含むステートメント 引数。

    これを行うときは、既存のパーティションを2つに分割します。

    これがデモンストレーションの例です。まず、現在の設定を見てみましょう。

    現在の設定

    すでに4つのパーティションがあり、5つ目を追加したいと思います。

    したがって、次のようなパーティション関数をすでに作成しています:

    CREATE PARTITION FUNCTION MoviesPartitionFunction (int)  
        AS RANGE LEFT FOR VALUES (-1, 100, 10000);

    このコードにより、次のように値を格納するパーティションが作成されます。

    パーティション
    1 <=– 1
    2 > – 1 AND <=100
    3 > 100 AND <=10000
    4 > 10000

    この例では、500という新しい境界値を追加します。

    したがって、次のように表示する必要があります:

    パーティション
    1 <=– 1
    2 > – 1 AND <=100
    3 > 100 AND <=500
    4 > 500 AND <=10000
    5 > 10000

    また、この例の目的のために、上記のパーティション関数を使用してパーティション化されたテーブルがあり、現在、4000行をわずかに超えるデータが含まれていると想像してください。

    行がパーティション全体にどのように分散されているかを簡単に見てみましょう。

    SELECT 
        partition_number,
        row_count
    FROM sys.dm_db_partition_stats
    WHERE object_id = OBJECT_ID('dbo.Movies');

    結果:

    +--------------------+-------------+
    | partition_number   | row_count   |
    |--------------------+-------------|
    | 1                  | 0           |
    | 2                  | 100         |
    | 3                  | 3979        |
    | 4                  | 0           |
    +--------------------+-------------+

    そこで、境界値が500の新しいパーティションを追加します。

    この場合、パーティションを境界値100と10000の間で分割します。

    マイクロソフトは、データが入力されたパーティションを分割しないことを推奨していることを述べておく必要があります。ですから、それは覚えておくべきことです。

    ただし、この例では、データを含むパーティションを分割します。

    パーティションを分割する

    ここで、パーティションを分割します。

    ALTER PARTITION FUNCTIONを使用します パーティションを分割するステートメント。

    ただし、パーティションを分割すると、1つから2つのパーティションが作成されるため、新しいパーティションのファイルグループがあることを確認する必要があります。また、パーティションを分割するときに、パーティションスキームが使用するファイルグループを認識していることを確認する必要があります。

    既存のファイルグループを使用することも、新しいファイルグループを作成することもできます。

    新しいものを作成しましょう。

    上記のすべてを実行するために使用できるコードは次のとおりです。

    ALTER DATABASE Test ADD FILEGROUP MoviesFg5;
    
    ALTER DATABASE Test   
    ADD FILE   
    (  
        NAME = MoviesFg5dat,  
        FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',  
        SIZE = 5MB,  
        MAXSIZE = 100MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP MoviesFg5;
    
    ALTER PARTITION SCHEME MoviesPartitionScheme  
    NEXT USED MoviesFg5;
    
    ALTER PARTITION FUNCTION MoviesPartitionFunction()
    SPLIT RANGE (500);

    結果:

    Commands completed successfully.

    パーティションの分割に成功しました。

    分割を確認する

    これで、新しい境界値を反映するようにパーティション関数が変更されたことを確認できます。

    SELECT 
        prv.boundary_id,
        prv.[value]
    FROM sys.partition_range_values prv
    INNER JOIN sys.partition_functions pf
    ON prv.function_id = pf.function_id
    WHERE pf.name = 'MoviesPartitionFunction';

    結果:

    +---------------+---------+
    | boundary_id   | value   |
    |---------------+---------|
    | 1             | -1      |
    | 2             | 100     |
    | 3             | 500     |
    | 4             | 10000   |
    +---------------+---------+

    これで、新しい境界値が正常に追加されたことがわかります。

    そして、これがデータがパーティション間でどのように分散されるかを示しています。

    SELECT 
        partition_number,
        row_count
    FROM sys.dm_db_partition_stats
    WHERE object_id = OBJECT_ID('dbo.Movies');

    結果:

    +--------------------+-------------+
    | partition_number   | row_count   |
    |--------------------+-------------|
    | 1                  | 0           |
    | 2                  | 100         |
    | 3                  | 400         |
    | 4                  | 3579        |
    | 5                  | 0           |
    +--------------------+-------------+

    これで、5つのパーティションができました。

    パーティションが空なのはなぜですか?

    両端に空のパーティションがある理由がわからない場合は、これは特にパーティションの分割とマージを容易にするために行われます。

    両端でパーティションを空にしておくと、パーティションを分割またはマージするときに発生する可能性のある予期しないデータ移動を防ぐことができます。

    この方法は、まさにこの理由から、Microsoftによっても推奨されています。

    データを含むパーティションの分割

    前述のように、Microsoftは、すでにデータが含まれているパーティションを分割しないことをお勧めします。

    移入されたパーティションの分割またはマージは非効率的である可能性があります。分割またはマージによりログが4倍も生成され、深刻なロックが発生する可能性があるため、非効率になる可能性があります。


    1. MySQLとMariaDBのいくつかの機能の使用方法を学ぶ–パート2

    2. SQLServerレプリケーションのトラブルシューティング

    3. SQL Serverでカスケード削除を使用するにはどうすればよいですか?

    4. PostgreSQLにトリガーが存在するかどうかを確認するにはどうすればよいですか?