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

SQL Server(T-SQL)で2つのパーティションを1つにマージする

    SQL Serverでは、ALTER PARTITION FUNCTIONを使用できます。 2つのパーティションを1つのパーティションにマージします。

    これを行うには、MERGE RANGEを使用します ドロップするパーティションの境界値を提供しながら、引数。

    この操作により、パーティションが削除され、パーティションに存在するすべての値が残りのパーティションにマージされます。

    4つになりたいパーティションが5つあると想像してください。

    現在のパーティション

    MoviesPartitionFunctionというパーティション関数があります 4つの境界値があります。

    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   |
    +---------------+---------+

    これは、5つのパーティションがあることを意味します。

    この例では、境界範囲500を削除します。

    また、これらのパーティションのいくつかにデータが分散されたテーブルがすでにあると想像してください。

    現在、行がパーティション全体にどのように分散されているかを示します。

    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           |
    +--------------------+-------------+

    Microsoftは、データを含むパーティションをマージ(または分割)しないように実際にアドバイスしていることを指摘しておく必要があります。ただし、この例では、風に注意を払い、データを含む2つのパーティションをマージします。

    パーティションをマージする

    OK、パーティションをマージしましょう。

    ALTER PARTITION FUNCTION MoviesPartitionFunction()  
    MERGE 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             | 10000   |
    +---------------+---------+

    予想どおり、境界範囲500が削除され、境界範囲は3つだけになりました。

    データがパーティション間でどのように分散されるかを見てみましょう。

    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           |
    +--------------------+-------------+

    予想どおり、パーティション3と4のデータは1つのパーティション(パーティション3)にマージされました。

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

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

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

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

    データを含むパーティションのマージ

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

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


    1. VisualStudio2012のmySQLデータソース

    2. SQL Server 2016:データベースを復元する

    3. MySQLで数値テーブルを作成する

    4. Oracle MySQL、Percona Server、MariaDBの比較