web-dev-qa-db-ja.com

インデックス再構築ジョブのスケジュール

私はMS-SQL 2014 SP1を使用しています-2つのノードのAlwaysOn AG(1つのプライマリと読み取り専用のセカンダリ)で、合計サイズが20〜30GBの約10のデータベースがあります。インデックスの再構築と統計情報の収集のスケジュールについて質問があります。

メンテナンスプランを通じて、毎週スケジュールする予定です。通常、プライマリにまったく負荷がかからない日曜日の夜に。

ジョブはプライマリまたはレプリカのどちらで実行する必要がありますか?セカンダリでのみ実行すると、どのようなメリットがありますか?またはその逆? (意味は両方のノードで実行する必要があります)

メンテナンスプランを使用してSP1とインデックスの再構築を使用すると、破損が発生する可能性がありますか? ここで述べたように

2
tesla747

smartメンテナンスタスクではなくインデックスメンテナンススクリプト を使用する必要があります。

ジョブはプライマリまたはレプリカのどちらで実行する必要がありますか?

はい。セカンダリレプリカに複製されるためです。

セカンダリでのみ実行すると、どのようなメリットがありますか?

セカンダリレプリカでは実行できません。

インデックスのメンテナンスは、RTOおよびRPOに影響を与える多くのトランザクションログアクティビティを生成します。また、セカンダリレプリカのREDOバックログが増加します。

以下に従う必要があります AlwaysOn可用性グループによるインデックスメンテナンスの推奨事項

  • 静かな時間を見つけるか、計画されたメンテナンス時にインデックスのメンテナンスを実行します。
  • 可能であれば、同期モードから非同期モードに切り替えます。インデックスのメンテナンスが完了したら、元の状態に戻します。
  • ログファイルが制御不能にならないように、頻繁に ログバックアップ を実行します。
  • SQLサーバー2014を使用しているため、WAIT_AT_LOW_PRIORITYMAX_DURATION、およびABORT_AFTER_WAITを使用する必要があります
  • オンラインインデックスの再構築を使用している場合は、 次にMAXDOP = 1を使用

また、 パーティション化されたテーブルは、作成/変更インデックスのランタイムMAX DOPを制限する可能性があります にも注意してください。

メンテナンスプランを介してSP1とインデックスの再構築を使用すると、破損が発生する可能性がありますか?

SP1( 12.0.2370 or greater )を使用しているので、大丈夫です。

10
Kin Shah

断片化されたインデックスを再構築する別の方法があると思います。spを作成して、SQL Serverエージェントまたはタスクスケジューラを介してスケジュールできます。以下のクエリは、すべてのインデックスを再構築するのではなく、必要なインデックスのみを再構築または再編成します。一般的な推奨事項として、30%を超えるフラグメント率を取得するインデックスを再構築し、フラグメント率が10%から30%のインデックスを再編成する必要があります。

詳細を見る クリックヘア

以下のスクリプトは、インデックスを1つずつ再構築するので、本番データベースでは大規模な操作にはなりません。

---インデックスの再構築/再編成
 CREATE TABLE #fragment_tbl 
(
 DatabaseName SYSNAME 
、SchemaName SYSNAME 
、TableName SYSNAME 
 、IndexName SYSNAME 
、[Fragmentation%] FLOAT 
)
 INSERT INTO #fragment_tbl 
 SELECT 
 DB_NAME(DB_ID())AS DatabaseName 
、ss.name AS SchemaName 
、OBJECT_NAME(s.object_id)AS TableName 
、i.name AS IndexName 
、s.avg_fragmentation_in_percent AS [Fragmentation%] 
 FROM sys.dm_db_index_physical_stats(db_id()、NULL、NULL、NULL、 'SAMPLED')s 
 INNER JOIN sys.indexes i ON s。[object_id] = i。[object_id] 
 AND s.index_id = i.index_id 
 INNER JOIN sys.objects o ON s.object_id = o.object_id 
 INNER JOIN sys.schemas ss ON ss。[schema_id] = o。[schema_id ] 
 WHERE s.database_id = DB_ID()
 AND i.index_id!= 0 
 AND s.record_count> 0 
 AND o.is_ms_shipped = 0 
 DECLARE @RebuildSQL NVARCHAR(MAX)
 SET @RebuildSQL = '' 
 S ELECT 
 @RebuildSQL = @RebuildSQL + 
 CASE 
 WHEN [Fragmentation%]> 30 
 THEN CHAR(10)+ 'ALTER INDEX' + QUOTENAME(IndexName) + 'ON' 
 + QUOTENAME(SchemaName)+ '。' 
 + QUOTENAME(TableName)+ 'REBUILD;' 
 WHEN [Fragmentation%]> 10 
 THEN CHAR(10)+ 'ALTER INDEX' + QUOTENAME(IndexName)+ 'ON' 
 + QUOTENAME(SchemaName)+ '。' 
 + QUOTENAME(TableName)+ 'REORGANIZE;' 
 END 
 FROM #fragment_tbl 
 WHERE [Fragmentation%]> 10 
 DECLARE @StartOffset INT 
 DECLARE @Length INT 
 SET @StartOffset = 0 
 SET @Length = 4000 
 WHILE(@StartOffset 
1
Kishor Kumar