私はMS-SQL 2014 SP1を使用しています-2つのノードのAlwaysOn AG(1つのプライマリと読み取り専用のセカンダリ)で、合計サイズが20〜30GBの約10のデータベースがあります。インデックスの再構築と統計情報の収集のスケジュールについて質問があります。
メンテナンスプランを通じて、毎週スケジュールする予定です。通常、プライマリにまったく負荷がかからない日曜日の夜に。
ジョブはプライマリまたはレプリカのどちらで実行する必要がありますか?セカンダリでのみ実行すると、どのようなメリットがありますか?またはその逆? (意味は両方のノードで実行する必要があります)
メンテナンスプランを使用してSP1とインデックスの再構築を使用すると、破損が発生する可能性がありますか? ここで述べたように
smartメンテナンスタスクではなくインデックスメンテナンススクリプト を使用する必要があります。
ジョブはプライマリまたはレプリカのどちらで実行する必要がありますか?
はい。セカンダリレプリカに複製されるためです。
セカンダリでのみ実行すると、どのようなメリットがありますか?
セカンダリレプリカでは実行できません。
インデックスのメンテナンスは、RTOおよびRPOに影響を与える多くのトランザクションログアクティビティを生成します。また、セカンダリレプリカのREDOバックログが増加します。
以下に従う必要があります AlwaysOn可用性グループによるインデックスメンテナンスの推奨事項 :
WAIT_AT_LOW_PRIORITY
、MAX_DURATION
、およびABORT_AFTER_WAIT
を使用する必要がありますまた、 パーティション化されたテーブルは、作成/変更インデックスのランタイムMAX DOPを制限する可能性があります にも注意してください。
メンテナンスプランを介してSP1とインデックスの再構築を使用すると、破損が発生する可能性がありますか?
SP1( 12.0.2370 or greater
)を使用しているので、大丈夫です。
断片化されたインデックスを再構築する別の方法があると思います。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