サイズが1500 GB、行数が363,957,740のテーブルでページ圧縮を有効にするには、可能な限り最良の方法を考え出す必要があります。データベースのサイズ自体は1.71 TB=であり、アーカイブデータを保持します。
私が正しく理解している場合は、ページの圧縮を有効にしてテーブルのコピーを作成し、スペースを解放できるように、ディスク領域(おそらく安全のために同じ量)が必要です。これはFULL
復旧モデルに含まれているため、頻繁にログに記録されます。
私はキャパシティプランニングリソースと話をしましたが、このメンテナンスのために一時的に必要な追加のスペースを提供し、このアクティビティが完了したらスペースを取り戻すことに同意しました。これを言って、あなたは最善のアプローチがそうであると思いますか:
SIMPLE
に変更しますFULL
に変更しますまた、ページ圧縮を有効にする代わりに。ステップ3の後で、最大のテーブルを切り捨て、ページ圧縮を有効にしてから、
_SELECT * INTO ReplicaDB.dbo.ReplicaTbl
_
これにより、既存のインデックスでページ圧縮が有効になりますか?
上記の手順をテストするためのテスト環境がありません。または、より良いアプローチが利用できる場合は、お知らせください。
目標は、現在の増加時に必要な将来のディスク容量を最小限に抑えることです。私たちはERPソフトウェア会社であり、Enterprise Editionのライセンスを取得しています。このテーブルは、いくつかのチェックが実行され、すべてのデータがこのテーブルに存在する場合のアーカイブ用です。2つのインデックス(1 CI、 1 NON-CI)。どの列もVARCHAR (MAX)
ではなく、NVARCHAR
、int
またはdate
タイプのいずれかです。
ページ圧縮は、テーブルまたはインデックスレベルで有効になります。ページ圧縮インデックスのある非圧縮テーブル、または非圧縮インデックスのある圧縮テーブルを使用できます。インデックスをページ圧縮する場合は、個別に行う必要があります。
この移動の最も重要な考慮事項は、割り当てられた一時スペースをすべて返せるようにすることだという印象を受けます。 SELECT INTO
は、実行しようとしていることに対して適切なオプションではありません。テーブルは非圧縮で、クラスター化インデックスなしで構築されます。 REBUILD
を必要とするビルドでは、データファイルが大きくなり、まさに回避したいものになります。
ここに私がそれをすることを考える方法があります:
TABLOCK
ヒントを使用して、古いデータベースのすべての行をターゲットテーブルに挿入します。この操作には時間がかかる場合がありますが、最小限のログに記録する必要があり、並べ替えは必要ありません。あなたの計画はこれを除いてよく聞こえます:
また、ページ圧縮を有効にする代わりに。ステップ3の後で、最大のテーブルをトランケートし、ページ圧縮を有効にしてから、SELECT * INTO ReplicaDB.dbo.ReplicaTbl?
テーブルを切り捨ててページ圧縮を有効にする場合は、SELECT INTO
ではなくINSERT
を実行する必要があります。この時点では、TABLOCK
を使用して、行圧縮のみではなくページ圧縮を取得する必要があります。
これに加えて、圧縮による再構築は、圧縮されたテーブルへの挿入よりもはるかに高速です。大きなテーブルでは3〜5倍の違いがあります。
こちらをご覧ください: データ読み込みパフォーマンスガイド 、セクションデータ圧縮と一括読み込み:
データが圧縮されたテーブルまたはパーティションに一括で読み込まれる場合、通常、ページレベルと行レベルの両方の圧縮が一括読み込み時に行われます。ただし、例外に注意する必要があります。ページ圧縮ヒープに一括読み込みする場合は、TABLOCKヒントを使用してページ圧縮を行う必要があります。 TABLOCKヒントが使用されない場合、行レベルの圧縮のみがヒープで行われます。バルクターゲットでページ圧縮を使用すると、一般的に、特にI/OシステムがCPUを飽和させるのに十分な速度を提供できる場合は、バルクロード速度が低下します。
テーブルがパーティション化されているのでしょうか(そのような大きなテーブルをパーティション化することは理にかなっています)。
主な関心領域の場合は、各パーティションを個別に圧縮できます。平均で500のパーティションがある場合、それはちょうど30-50GBになります。パーティションのサブセットで圧縮を変更できるため、別の時点で圧縮を実行できるというアプローチのもう1つの利点。
ALTER INDEX <IX_Table_ClusteredIndex>
ON <Table> REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = PAGE);
ここにあなたを生成するクエリがありますINDEX REBUILD
すべてのパーティション:
SELECT ' ALTER INDEX ['+ i.name + '] ON [' + s.name + '].[' + o.name +
'] REBUILD PARTITION = ' + CONVERT(VARCHAR(MAX), p.partition_number) +
' WITH (DATA_COMPRESSION = PAGE, ONLINE = ON); '
FROM sys.partitions p
INNER JOIN sys.objects o
ON p.object_id = o.object_id
INNER JOIN sys.schemas s
ON o.schema_id = s.schema_id
INNER JOIN sys.indexes i
ON p.index_id = i.index_id
AND p.object_id = i.object_id
WHERE o.name = 'LargeTable'
ORDER BY p.partition_number
INDEX REBUILD
は 最小ログ記録操作 にすることができます。また、Enterpriseエディションを使用しているため、ONLINE = ON
。