私は長い間OLAのスクリプトを使用していて、それらが大好きです。
私は非常に大きなデータベースを持っています-20 + TB何百ものパーティションテーブルがあります。
ドロップ(古いパーティションをマージ)して古いデータを削除します。
日付ごとに分割され、毎週の分割は約6か月前にさかのぼります。追いつくことを期待するには、パーティションごとに毎日インデックスのメンテナンスを実行する必要があります(実際には追いつくことはありません)。
現在SQL2017を使用しており、Resumableオプションを使用してパーティションによるオンライン再構築を試みています。
私が見つけたのは、ほぼすべてのテーブルで現在のパーティションを再構築していることです。これは常に断片化されており、大量の挿入が原因で明日再び断片化される可能性があるためです。
私がやりたいのは、このパーティションを除外することです。
これは、現在の日付が属するパーティションです。
つまり、過去のパーティションのみを再構築したいと思います。
これをオプションとして持つことは非常に役に立ちます。
OLAからテーブルを省略し、問題のあるセグメントのインデックスを再作成する別の手順として実行します。
/*https://www.mssqltips.com/sqlservertip/1914/sql-server-database-partitioning-myths-and-truths/ */
-- to return fragmentation information on partitioned indexes
SELECT
object_name(a.object_id) AS object_name,
a.index_id,
b.name,
b.type_desc,
a.partition_number,
a.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') a
JOIN sys.indexes b on a.object_id = b.object_id and a.index_id = b.index_id
order by object_name(a.object_id), a.index_id, b.name, b.type_desc, a.partition_number
--Rebuild only partition 11.
ALTER INDEX IX_alert_events_timestamp
ON dbo.alert_events
REBUILD Partition = 11;
GO