- 03/19/2020
- 21 minutes to read
-
- p
- j
- M
- M
- d
-
+11
Applies to: SQL Server(すべてのサポートされているバージョン)Azure SQLデータベースAzure SQLマネージインスタンスAzure Synapse Analyticsパラレルdata warehouse
この記事では、インデックスの最適化がどのように行われるかについて説明し、クエリのパフォーマ インデックスに存在する断片化の量を決定したら、選択したツールでTransact-SQLコマンドを実行するか、SQL Server Management Studioを使用して、インデックスを再編成するか、
インデックスの断片化の概要
インデックスの断片化とは何か、なぜそれを気にする必要があります。
- 断片化は、インデックスのキー値に基づ
- データベースエンジンは、基になるデータに対して挿入、更新、または削除操作が行われるたびに、インデックスを自動的に変更します。 たとえば、テーブルに行を追加すると、行ストアインデックス内の既存のページが分割されて、新しいキー値の挿入のためのスペースが確保される場合があ 時間の経過とともに、これらの変更により、インデックス内の情報がデータベース内に分散(断片化)される可能性があります。 断片化は、キー値に基づく論理的な順序がデータファイル内の物理的な順序と一致しないページがインデックスにある場合に発生します。
- インデックスが大きく断片化されていると、インデックスが指すデータを検索するために追加のI/Oが必要になるため、クエリのパフォーマ I/Oが増えると、特にスキャン操作が関与している場合、アプリケーションの応答が遅くなります。
断片化の量の検出
使用するインデックスの最適化方法を決定するための最初のステップは、断片化の程度を決定するためにインデ 行ストア索引と列ストア索引では、断片化の検出方法が異なります。
注意
大量のデータが削除された後、インデックスまたはヒープの断片化を確認することは特に重要です。 ヒープの場合、頻繁な更新がある場合は、転送レコードの拡散を避けるために断片化を確認する必要がある場合もあります。 ヒープの詳細については、”ヒープ(クラスター化インデックスのないテーブル)”を参照してください。
行ストアインデックスの断片化を検出する
sysを使用します。dm_db_index_physical_statsでは、特定のインデックス、テーブルまたはインデックス付きビューのすべてのインデックス、データベース内のすべてのインデックス、またはすべてのデータベース内のすべてのインデックスの断片化を検出できます。 パーティション索引の場合、sys.dm_db_index_physical_statsは、各パーティションの断片化情報も提供します。
sys.dm_db_index_physical_statsによって返される結果セットには、次の列が含まれます:Tr>
断片化の程度がわかった後、断片化を削除するための最良の方法を決定するために、次の表を使用します。INDEX REORGANIZEまたはINDEX。
avg_fragmentation_in_percent value | Corrective statement |
---|---|
> 5% and < = 30% 1 | ALTER INDEX REORGANIZE |
> 30% 1 | ALTER INDEX REBUILD WITH (ONLINE = ON) 2 |
1 These values provide a rough guideline for determining the point at which you should switch between ALTER INDEX REORGANIZE
ALTER INDEX REBUILD
。 ただし、実際の値は場合によって異なる場合があります。 環境に最適なしきい値を決定するために実験することが重要です。
ヒント
たとえば、特定のインデックスが主にスキャン操作に使用されている場合、断片化を削除すると、これらの操作のパフォーマンスが向上 主にシーク操作に使用されるインデックスでは、パフォーマンス上の利点は顕著ではない場合があります。
同様に、ヒープ(クラスター化インデックスのないテーブル)内の断片化を削除することは、非クラスター化インデックススキャン操作では特に便利ですが、ルックアップ操作ではほとんど効果がありません。
2インデックスの再構築は、オンラインまたはオフラインで実行できます。 インデックスの再編成は、常にオンラインで実行されます。 Reorganizeオプションと同様の可用性を実現するには、索引をオンラインで再構築する必要があります。 詳細については、”オンラインでのインデックス操作とインデックス操作の実行”を参照してください。
断片化が5パーセント未満のインデックスは、断片化のような少量を削除することの利点は、インデックスの再編成または再構築に発生するCPUコ また、小さな行ストア索引を再構築または再編成しても、通常は実際の断片化は減少しません。SQL Server2014(12.x)、SQL Serverデータベースエンジンは、混合エクステントを使用して領域を割り当てます。 したがって、小さなインデックスのページは、混在したエクステントに格納されることがあります。 混合エクステントは最大8つのオブジェクトで共有されるため、小さなインデックスの断片化は、再編成または再構築後に縮小されない可能性があ 行ストア索引の再構築に固有の考慮事項も参照してください。 エクステントの詳細については、”Pages and Extents Architecture Guide”を参照してください。
列ストアインデックスの断片化の検出
sys.dm_db_column_store_row_group_physical_statsを使用すると、インデックス内の削除された行の割合を判断できます。 この情報を使用して、特定の索引、表のすべての索引、データベース内のすべての索引、またはすべてのデータベース内のすべての索引の断片化を計算します。
sys.dm_db_column_store_row_group_physical_statsによって返される結果セットには、次の列が含まれます。
列 | 説明 |
---|---|
列 | 説明 | 行グループに格納されている物理的な行数。 圧縮された行グループの場合、これには削除済みとしてマークされている行が含まれます。 |
deleted_rows | 削除のマークが付いている圧縮された行グループに物理的に格納されている行の数。 デルタストア内にある行グループの場合は0です。 |
返されたこの情報を使用して、次の式を使用してインデックスの断片化を計算します。
100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)
インデックスの断片化の程度がわかった後、次の表を使用して、断片化を削除する最良の方法を決定します。INDEX REORGANIZEまたはINDEX。
computed fragmentation in percent value | Applies to version | Corrective statement |
---|---|---|
> = 20% | SQL Server 2012 (11.x) and SQL Server 2014 (12.x) | ALTER INDEX REBUILD |
> = 20% | Starting with SQL Server 2016 (13.x) | ALTER INDEX REORGANIZE |
Transact-SQLを使用して行ストアインデックスの断片化をチェックする
次の例では、HumanResources.Employee
HumanResources.Employee
HumanResources.Employee
HumanResources.Employee
HumanResources.Employee
HumanResources.Employee
AdventureWorks2016
データベース。
SELECT a.object_id, object_name(a.object_id) AS TableName, a.index_id, name AS IndedxName, avg_fragmentation_in_percentFROM sys.dm_db_index_physical_stats (DB_ID (N'AdventureWorks2016_EXT') , OBJECT_ID(N'HumanResources.Employee') , NULL , NULL , NULL) AS aINNER JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;GO
前のステートメントは、次のような結果セットを返します。p>
object_id TableName index_id IndexName avg_fragmentation_in_percent----------- ------------ ----------- ----------------------------------------------------- ------------------------------1557580587 Employee 1 PK_Employee_BusinessEntityID 01557580587 Employee 2 IX_Employee_OrganizationalNode 01557580587 Employee 3 IX_Employee_OrganizationalLevel_OrganizationalNode 01557580587 Employee 5 AK_Employee_LoginID 66.66666666666671557580587 Employee 6 AK_Employee_NationalIDNumber 501557580587 Employee 7 AK_Employee_rowguid 0(6 row(s) affected)
詳細については、”sys.dm_db_index_physical_stats”を参照してください。
Transact-SQLを使用して列ストアインデックスの断片化をチェックするには
次の例では、AdventureWorksDW2016
dbo.FactResellerSalesXL_CCI
テーブル
SELECT i.object_id, object_name(i.object_id) AS TableName, i.index_id, i.name AS IndexName, 100*(ISNULL(SUM(CSRowGroups.deleted_rows),0))/NULLIF(SUM(CSRowGroups.total_rows),0) AS 'Fragmentation'FROM sys.indexes AS i INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_idWHERE object_name(i.object_id) = 'FactResellerSalesXL_CCI'GROUP BY i.object_id, i.index_id, i.nameORDER BY object_name(i.object_id), i.name;
前のステートメントは、次のような結果セットを返します。
object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)
SQL Server Management Studioを使用してインデックスの断片化を確認する
注
Management Studioを使用してSQL Serverの列ストアインデックスの断片化を計算したり、Azure SQL Databaseのインデックスの断片化を計算したりすることはできません。 前述のTransact-SQLの例を使用します。
- オブジェクトエクスプローラーで、インデックスの断片化をチェックするテーブルが含まれているデータベースを展開します。
- Tablesフォルダを展開します。
- インデックスの断片化をチェックするテーブルを展開します。
- Indexesフォルダを展開します。
- 断片化を確認するインデックスを右クリックし、プロパティを選択します。
- “ページの選択”で、”断片化”を選択します。
断片化ページでは、次の情報を利用できます。
値 | 説明 |
---|---|
ページの膨満感 | インデックスページの平均膨満感をパーセンテージで示します。 100%はインデックスページが完全にいっぱいであることを意味します。 50%は、平均して、各インデックスページが半分いっぱいであることを意味します。 |
断片化の合計 | 論理断片化の割合。 これは、順番に格納されていないインデックス内のページ数を示します。 |
平均行サイズ | リーフレベルの行の平均サイズ。 |
深さ | リーフレベルを含むインデックス内のレベルの数。 |
転送されたレコード | 別のデータ位置への転送ポインタを持つヒープ内のレコードの数。 (この状態は、元の場所に新しい行を格納するのに十分なスペースがない場合に、更新中に発生します。 |
ゴースト行 | 削除済みとしてマークされているがまだ削除されていない行の数。 これらの行は、サーバーがビジー状態でないときに、クリーンアップ-スレッドによって削除されます。 この値には、未処理のスナップショット分離トランザクションのために保持されている行は含まれません。 |
インデックスタイプ | インデックスのタイプ。 使用可能な値は、クラスター化インデックス、非クラスター化インデックス、およびプライマリXMLです。 テーブルは(インデックスなしで)ヒープとして格納することもできますが、このインデックスプロパティページを開くことはできません。 |
リーフレベルの行 | リーフレベルの行の数。 |
行の最大サイズ | リーフレベルの行の最大サイズ。 |
行の最小サイズ | リーフレベルの行の最小サイズ。 |
ページ数 | データページ数の合計。 |
パーティションID | インデックスを含むbツリーのパーティションID。 |
Version ghost rows | 未処理のスナップショット分離トランザクションのために保持されているghostレコードの数。 |
インデックスの再構築または再編成によるインデックスの最適化
次のいずれかの方法を使用して、フラグメ:
- インデックス再編成
- インデックス再構築
注
パーティションスキーム上に構築されたパーティションインデックスの場合、インデックスの完全なパーティションまたは単一のパーティションに対して次のいずれかの方法を使用できます。
インデックスの再編成
インデックスの再編成は、最小限のシステムリソースを使用し、オンライン操作です。 つまり、長期ブロックテーブルロックは保持されず、ALTER INDEX REORGANIZE
トランザクション中に基になるテーブルへのクエリまたは更新を続行できます。
-
行ストアインデックスの場合、データベースエンジンは、リーフノードの論理順序(左から右)に一致するようにリーフレベルのページを物理的に並べ替え また、再編成すると、インデックスの塗りつぶし係数の値に基づいてインデックスページが圧縮されます。 Fill factor設定を表示するには、sysを使用します。インデックス。 構文の例については、”例:Rowstore reorganize”を参照してください。
-
列ストアインデックスを使用する場合、デルタストアは、時間の経過とともにデータを挿入、更新、および削除した後、複数の小さな行グループにな 列ストアインデックスを再編成すると、すべての行グループが列ストアに強制され、行グループが少数の行グループに結合され、より多くの行が追加されます。 また、reorganize操作では、列ストアから削除された行も削除されます。 再編成では、最初にデータを圧縮するために追加のCPUリソースが必要になり、システム全体のパフォーマンスが低下する可能性があります。 ただし、データが圧縮されるとすぐに、クエリのパフォーマンスが向上します。 構文の例については、”例:ColumnStore reorganize”を参照してください。
インデックスを再構築する
インデックスを再構築すると、インデックスが削除されて再作成されます。 インデックスの種類とデータベースエンジンのバージョンに応じて、再構築操作はオンラインまたはオフラインで実行できます。 T-SQL構文については、”alter INDEX REBUILD
-
行ストアインデックスについては、再構築すると断片化が削除され、指定されたまたは既存のfill factor設定に基づいてペー
ALL
が指定されている場合、テーブル上のすべてのインデックスが削除され、単一のトランザクションで再構築されます。 外部キー制約を事前に削除する必要はありません。 エクステントが128以上のインデックスが再構築されると、データベースエンジンは、トランザクションがコミットされるまで、実際のページの割り当て解除 構文の例については、”例:Rowstore reorganize”を参照してください。 -
列ストアインデックスの再構築では、断片化が削除され、すべての行が列ストアに移動され、テーブルから論理的に削除された行を物理的に削除
ヒント
SQL Server2016以降(13.x)、列ストアインデックスの再構築は、通常、
REORGANIZE
がオンライン操作としてバックグラウンドで再構築の本質を実行するため、必要あり構文の例については、”例:列ストアの再構築”を参照してください。
パーミッション
テーブルまたはビューに対するALTER
パーミッションが必要です。 ユーザーは、次のいずれかのロールのメンバーである必要があります。
- db_ddladminデータベースロール1
- db_ownerデータベースロール
- sysadminサーバーロール
1db_ddladminデータベースロール
SQL Server Management Studioを使用した断片化の削除
インデックスを再編成または再構築するには
- オブジェクトエクスプローラーで、インデックスを再
- Tablesフォルダを展開します。
- インデックスを再編成するテーブルを展開します。
- Indexesフォルダを展開します。
- 再編成するインデックスを右クリックし、”再編成”を選択します。
- インデックスの再編成ダイアログボックスで、再編成するインデックスグリッドに正しいインデックスがあることを確認し、OKをクリックします。
- ラージ-オブジェクト(LOB)データを含むすべてのページも圧縮するように指定するには、”ラージ-オブジェクト列データの圧縮”チェック-ボックスをオンにします。
- [OK]をクリックします。
オブジェクトエクスプローラーで表
- 内のすべての索引を再編成するには、索引を再編成する表が含まれるデータベースを展開します。
- Tablesフォルダを展開します。
- インデックスを再編成するテーブルを展開します。
- Indexesフォルダを右クリックし、”すべて再編成”を選択します。
- インデックスの再編成ダイアログボックスで、再編成するインデックスに正しいインデックスがあることを確認します。 再編成するインデックスグリッドからインデックスを削除するには、インデックスを選択し、Deleteキーを押します。
- ラージ-オブジェクト(LOB)データを含むすべてのページも圧縮するように指定するには、”ラージ-オブジェクト列データの圧縮”チェック-ボックスをオンにします。
- [OK]をクリックします。
オブジェクトエクスプローラーでインデックスを再構築するには、インデックスを再編成するテーブルが含まれているデータベースを展開します。
Transact-SQLを使用した断片化の削除
注
Transact-SQLを使用してインデックスを再構築または再編成する例の詳細については、”ALTER INDEX Examples:Columnstore Indexes”および”ALTER INDEX Examples:Rowstore Indexes”次の例では、AdventureWorks2016
HumanResources.Employee
IX_Employee_OrganizationalLevel_OrganizationalNode
インデックスを再編成します。
ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;
次の例では、IndFactResellerSalesXL_CCI
dbo.FactResellerSalesXL_CCI
AdventureWorksDW2016
データベースに再編成します。
-- This command will force all CLOSED and OPEN rowgroups into the columnstore.ALTER INDEX IndFactResellerSalesXL_CCI ON FactResellerSalesXL_CCI REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
テーブル内のすべてのインデックスを再編成するには
次の例では、AdventureWorks2016
HumanResources.Employee
AdventureWorks2016
Employee
テーブル上の単一のインデックスを再構築します。
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;
テーブル内のすべてのインデックスを再構築するには
次の例では、AdventureWorks2016
ALL
キーワードを使用して再構築します。 3つのオプションが指定されます。
ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);
詳細については、”ALTER INDEX(Transact-SQL)”を参照してください。
自動インデックスと統計管理
Adaptive Index Defragなどのソリューションを活用して、一つ以上のデータベースのインデックスの最適化と統計の更新を自動 この手順では、断片化レベルやその他のパラメータに応じてインデックスを再構築または再編成するかどうかを自動的に選択し、線形しきい値で統計を更新します。
行ストアインデックスの再構築に固有の考慮事項
クラスター化インデックスを再構築すると、非クラスター化インデックスレコードに含
次のシナリオでは、テーブル上のすべての行ストア非クラスター化インデックスが自動的に再構築されます:
- テーブルにクラスター化インデックスを作成する
- テーブルがヒープとして格納されるクラスター化インデックスを削除する
- 列を含めるか除外するクラスタリングキーを変更する
次のシナリオでは、すべての行ストア非クラスター化インデックスをテーブルに自動的に再構築する必要はありません。:
- 一意のクラスター化インデックスの再構築
- 非一意のクラスター化インデックスの再構築
- パーティション化スキームをクラスター化インデックスに適用したり、クラスター化インデックスを別のファイルグループに移動したりするなど、インデックススキーマの変更
重要
インデックスが配置されているファイルグループがオフラインであるか、読み取り専用に設定されている場合、インデックスを再編成または再構築することはできません。 キーワードALLが指定されていて、1つ以上のインデックスがオフラインまたは読み取り専用のファイルグループにある場合、ステートメントは失敗します。
インデックスの再構築が行われている間、物理メディアにはインデックスのコピーを2つ格納するのに十分な領域が必要です。 再構築が完了すると、データベースエンジンは元のインデックスを削除します。
ALL
ALTER INDEX
ステートメントで指定されている場合、リレーショナルインデックス、クラスター化および非クラスター化の両方、およ
列ストアインデックスの再構築に固有の考慮事項
列ストアインデックスを再構築すると、データベースエンジンは、デルタストアを含む元の列ストアインデックスからすべてのデータを読み取ります。 データを新しいrowgroupsに結合し、rowgroupsをcolumnstoreに圧縮します。 データベースエンジンは、テーブルから論理的に削除された行を物理的に削除することによって、列ストアを最適化します。 削除されたバイトは、ディスク上で再利用されます。
注
Management Studioを使用して列ストアインデックスを再編成すると、圧縮された行グループが結合されますが、すべての行グループが列ストアに圧縮される 閉じたrowgroupsは圧縮されますが、開いているrowgroupsは圧縮されません。columnstore.To すべての行グループを強制的に圧縮するには、次のTransact-SQLの例を使用します。
注意
SQL Server2019以降(15.x)の場合、tuple-moverは、内部しきい値によって決定されるように、しばらくの間存在していた小さな開いているデルタ行グループを自動的に圧縮するバックグラウ これにより、時間の経過とともに列ストアインデックスの品質が向上します。
columnstoreの用語と概念の詳細については、”Columnstoreインデックス:概要”を参照してください。
テーブル全体ではなくパーティションを再構築する
- インデックスが大きい場合、テーブル全体の再構築には時間がかかり、再構築中にイン 通常、最後に使用したパーティションを再構築するだけで済みます。
- パーティションテーブルの場合、断片化は最近変更されたパーティションのみで発生する可能性があるため、列ストアインデックス全体を再構築する必 ファクトテーブルとラージディメンションテーブルは、通常、テーブルのチャンクに対してバックアップ操作と管理操作を実行するためにパーティション分割されます。
重いDML操作の後にパーティションを再構築する
パーティションを再構築すると、パーティションが最適化され、ディスク記憶域が削減されます。 再構築すると、削除対象としてマークされた列ストアからすべての行が削除され、すべての行グループがデルタストアから列ストアに移動されます。 デルタストアには、100万行未満の複数の行グループが存在する可能性があります。
データのロード後にパーティションを再構築する
日付のロード後にパーティションを再構築すると、すべてのデータが列ストアに格納されます。 同時実行プロセスごとに100,000行未満の行を同じパーティションに同時にロードすると、パーティションは複数のデルタストアになる可能性があります。 再構築すると、すべてのデルタストア行が列ストアに移動します。
列ストアインデックスの再編成に固有の考慮事項
列ストアインデックスを再編成するとき、データベースエンジンは、閉じられた各デルタ行 SQL Server2016以降(13.X)およびAzure SQL Databaseで、REORGANIZE
コマンドは、次の追加の最適化をオンラインで実行します。
-
行の10%以上が論理的に削除された場合、行グループか 削除されたバイトは、物理メディア上で再利用されます。 たとえば、100万行の圧縮された行グループに100K行が削除されている場合、SQL Serverは削除された行を削除し、900k行の行グループを再圧縮します。 削除された行を削除することで、ストレージに保存されます。
-
は、1つ以上の圧縮された行グループを結合して、行グループごとに最大1,048,576行まで行を増加させます。 たとえば、102,400行のバッチを5つ一括インポートすると、5つの圧縮された行グループが得られます。 REORGANIZEを実行すると、これらの行グループは、サイズ512,000行の1つの圧縮された行グループにマージされます。 これは、辞書のサイズやメモリの制限がないことを前提としています。
-
10%以上の行が論理的に削除された行グループの場合、データベースエンジンはこの行グループを1つ以上の行グループと結合しようとします。 たとえば、rowgroup1は500,000行で圧縮され、rowgroup21は最大1,048,576行で圧縮されます。 Rowgroup21には、削除された行の60%が409,830行残っています。 データベースエンジンでは、これらの2つの行グループを結合して、909,830行の新しい行グループを圧縮することが推奨されます。
データのロードを実行した後、デルタストアに複数の小さな行グループを含めることができます。 ALTER INDEX REORGANIZE
を使用して、すべての行グループを列ストアに強制し、行グループをより少ない行グループに結合し、より多くの行を含む。 Reorganize操作では、列ストアから削除された行も削除されます。
制限と制限
128を超えるエクステントを持つ行ストアインデックスは、論理フェーズと物理フェーズの二つの別々のフェーズで再構築されます。 論理フェーズでは、インデックスで使用されている既存の割り当て単位が割り当て解除のためにマークされ、データ行がコピーされてソートされた後、再構築されたインデックスを格納するために作成された新しい割り当て単位に移動されます。 物理フェーズでは、以前に割り当て解除のためにマークされた配分単位は、バックグラウンドで発生する短いトランザクションで物理的に削除され、多 エクステントの詳細については、”Pages and Extents Architecture Guide”を参照してください。
ALTER INDEX REORGANIZE
Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.
警告
1,000を超えるパーテ このようにすると、これらの操作中にパフォーマンスが低下したり、メモリ消費が過剰になる可能性があります。 パーティションの数が1,000を超える場合は、整列されたインデックスのみを使用することをお勧めします。
インデックスが配置されているファイルグループがオフラインであるか、読み取り専用に設定されている場合、インデックスを再編成または再構築することはできません。 キーワードALL
を指定し、1つ以上のインデックスがオフラインまたは読み取り専用のファイルグループにある場合、ステートメントは失敗します。
統計:
-
インデックスが作成または再構築されると、テーブル内のすべての行をスキャンすることによって統計が作成または更新されます。 ただし、SQL Server2012以降(11.x)では、パーティション索引が作成または再構築されたときに、表内のすべての行をスキャンしても、統計は作成または更新されません。 代わりに、クエリオプティマイザでは、既定のサンプリングアルゴリズムを使用してこれらの統計情報を生成します。 テーブル内のすべての行をスキャンしてパーティション索引の統計を取得するには、CREATE STATISTICSまたはUPDATE STATISTICSを
FULLSCAN
句で使用します。 -
インデックスが再編成されると、統計は更新されません。
ALLOW_PAGE_LOCKS
がOFFに設定されている場合、インデックスを再編成することはできません。SQL Server2017まで(14。x)、クラスター化列ストアインデックスの再構築はオフライン操作です。 データベースエンジンは、再構築の実行中に、テーブルまたはパーティションに対する排他ロックを取得する必要があります。
NOLOCK
、Read-committed Snapshot Isolation(RCSI)、またはSnapshot Isolationを使用している場合でも、データはオフラインであり、再構築中は使用できません。SQL Server2019以降(15.x)、クラスター化された列ストアインデックスは、ONLINE = ON
オプションを使用して再構築できます。順序付けられたクラスター化列ストアインデックスを持つAzure Synapse Analytics(以前のAzure Synapse Analytics)テーブルの場合、ALTER INDEX REBUILD
はTempDBを使用してデータを再ソートします。 再構築操作中にTempDBを監視します。 さらにTempDB領域が必要な場合は、データウェアハウスをスケールアップします。 インデックスの再構築が完了したら、スケールダウンします。順序付けられたクラスター化された列ストアインデックスを持つAzure Synapse Analytics(以前のAzure Synapse Analytics)テーブルの場合、
ALTER INDEX REORGANIZE
ALTER INDEX REBUILD
。インデックスの再構築を使用したハードウェア障害からの回復
以前のバージョンのSQL Serverでは、ハードウェア障害による不整合を修正するために、行ストアの非クラスター化インデックスを再構築することがありました。SQL Server2008以降では、非クラスター化インデックスをオフラインで再構築することで、インデックスとクラスター化インデックスの間のこのような不整合 ただし、オンライン再構築メカニズムでは、既存の非クラスター化インデックスを再構築の基礎として使用し、矛盾を維持するため、インデックスをオン インデックスをオフラインで再構築すると、クラスター化インデックス(またはヒープ)のスキャンが強制されるため、矛盾が解消されることがあります。 クラスター化インデックスからの再構築を確実にするには、非クラスター化インデックスを削除して再作成します。 以前のバージョンと同様に、影響を受けるデータをバックアップから復元して不整合から回復することをお勧めしますが、非クラスター化されたインデ 詳細については、”DBCC CHECKDB(Transact-SQL)”を参照してください。
関連項目
- SQL Serverインデックスアーキテクチャおよびデザインガイド
- インデックス操作をオンラインで実行する
- ALTER INDEX(Transact-SQL)
- Adaptive Index Defrag
- CREATE STATISTICS(Transact-SQL)
- UPDATE STATISTICS(Transact-SQL)
- columnstoreインデックスクエリパフォーマンス
- リアルタイム運用分析のためのColumnstoreの使用を開始する
- データウェアハウス用の列ストアインデックス
- 列ストアインデックスと行グループ用のマージポリシー