web-dev-qa-db-ja.com

インデックスを再構築せずに、特定のテーブルでフィルファクターを変更できますか?

私は運が悪かったので掘り起こしてきました。

SQL Server 2008:テーブル全体を再構築せずに、特定のクラスター化インデックス/テーブルのFILL FACTORを調整することは可能ですか?

たとえば、レコードが4億個ある場合、Fill Factorを調整し、SQL Serverで、その制限を超えていないすべてのページ(および新しい分割)で新しいFILLFACTORを使用し、次に、インデックスのメンテナンス中に制限を超えましたか?

次のインデックスのメンテナンス中にインデックスを構築するためのFILL FACTORを事前に定義することは可能ですか?

5
Dave Goldsmith

これはFILLFACTORの動作方法ではありません。 CREATEまたはREBUILD操作中に書き込まれたページにのみ適用されます。ページは、作成または分割されたときに常に可能な限り埋められます。

CREATE INDEX のMSDNドキュメントに従って:

FILLFACTOR設定は、インデックスが作成または再構築されるときにのみ適用されます。

したがって、FILLFACTORの最中にREBUILDを変更した場合でも(クラスター化インデックスが既に存在するため)、既存のページだけがその値を使用します。新しいページが作成され、既存のページが分割されると、FILLFACTORが_100_に設定されているかのように埋められます。

または、別の言い方をすると、_100_以下のFILLFACTORを使用するために新しいページと分割ページを取得することはないため、ここでは再構築操作は問題ではありません。

また、いいえ、FILLFACTORへの変更を「事前定義」して、次にREBUILDが存在するときに有効になるようにすることはできません。 WITH操作のREBUILD句でのみ指定できます。ただし、再構築中に新しい値を適用すると、その新しい値は_sys.indexes_に保存され、WITH (FILLFACTOR = x)を指定して誰かが再度変更しない限り、以降の再構築で再び使用されます。

または、もう一度別の言い方をすると:

  1. FILLFACTORの値は、実際にREBUILDを実行するときにのみ変更できます(DROPおよびre -CREATEを「変更」にします)。
  2. FILLFACTOR値は、_CREATE INDEX_および_ALTER INDEX ... REBUILD_(および技術的には_DBCC DBREINDEX_によって使用されますonly) 、しかしそれは以前から使用されるべきではない SQL Server 2005で非推奨 ); FILLFACTORnotとして使用されます。行が挿入または更新されると、最初にこのオプションを使用する目的に反するためです。

    FILLFACTORは、既存のデータページにスペースを予約し、スペースを使用できるようにします(したがって、ページ分割が発生する可能性を減らします); FILLFACTORの値を超えてページがいっぱいになることを許可しないと、そのスペースが無意味に永久に予約され、データページのサイズが効果的に減少し、ページ分割が発生する可能性が実際には増加しますが、減少しません。

    ページ分割操作では、常に約50%が新しいページに移動します。

5
Solomon Rutzky

いいえ、できません。 FILLFACTORは、REBUILDまたはCREATE/DROPでのみ使用できるオプションです。参照 - ALTER INDEX (Transact-SQL

<rebuild_index_option > ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor 
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | ONLINE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE } 
     [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
     [ , ...n ] ) ]
}
<range> ::= 
<partition_number_expression> TO <partition_number_expression>
}
1
SqlWorldWide

次のインデックスのメンテナンス中にインデックスを構築するためのFILL FACTORを事前に定義することは可能ですか?

これはMS SQL Server 2017で可能になります。SQLServer 2017には、インデックスの再構築を開始および停止する機能が搭載されているはずです。これにより、新しく指定されたフィルファクターで再構築コマンドを実行する機能も作成されますが、再構築し、次にスケジュールされたインデックスメンテナンスで新しいFILL FACTORを使用します。

0
Dave Goldsmith