12

すべての SQL サーバー バージョンでインデックスが自動的に再構築されますか、それとも既定の再構築基準がありますか? 統計が自動的に再構築されることは理解していますが、インデックスも同様に再構築されるかどうかはわかりません。

4

5 に答える 5

9

インデックスの再構築は、Microsoft SQL Server のどのバージョンでも自動的にサポートされていません。これは、インデックスの再構築は非常にコストのかかる操作になる可能性があるため、慎重なスケジュールと計画が必要になるためです。

多くの環境では、これを処理するために特別なスクリプトが作成されます。たとえば、次のようになります。

http://weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx

多くの場合、SQL は自動的に統計を更新できますが、これらをより注意深く管理することでパフォーマンスが向上することに注意してください。

于 2009-02-24T12:42:38.817 に答える
8

人々がここで述べたように、インデックスは自動的に再構築されません。インデックスは時間の経過とともに断片化するため、これは SQL Server では非常に大きな問題です。インデックスが 95% 以上断片化されており、クエリのパフォーマンスに悪影響を及ぼしている可能性があります。

既存のインデックスの断片化をチェックする簡単なクエリを次に示します。

DECLARE @DBNAME VARCHAR(130);
SET @DBNAME = 'MYDBNAME';

DECLARE @DBID INT;
SET @DBID = DB_ID(@DBNAME);

SELECT
OBJECT_ID AS objectID
, index_id AS indexID
, avg_fragmentation_in_percent AS fragmentation
, page_count 
INTO #indexDefragList
FROM
sys.dm_db_index_physical_stats 
(@DBID, NULL, NULL , NULL, N'Limited')
WHERE
index_id > 0
OPTION (MaxDop 1);

SELECT
i.[name] as indexname,
d.fragmentation,
d.page_count
FROM
#indexDefragList d
INNER JOIN sys.indexes i
ON d.objectid = i.object_id
ORDER BY 
d.fragmentation DESC

DROP TABLE #indexDefragList

これにより、現在の DB 内のすべてのインデックスのリストが断片化 % で返されます。

それらを自動的に再構築または再編成するスクリプトを簡単に作成できます。これについては、SQLFool からの素晴らしい記事があり、完全な既製のスクリプトが含まれています。

于 2009-02-24T14:55:58.233 に答える
1

クリスが言ったことを拡張するには:

統計に関しては、インデックスでカバーされていない列の統計は、すべてのインデックスを再構築しても更新されません。これらは SQL Server によって定期的に更新される場合がありますが、UPDATE STATISTICS ステートメントを使用して自分で更新する必要がある場合があります。

SQL Server 2005 は、列変更カウンター (colmodctrs) の変更に基づいて統計を自動的に更新するかどうかを決定します。

次の場合、統計オブジェクトは古くなっていると見なされます。

1.テーブル サイズが 0 行から >0 行になりました。

2. 統計が収集されたときのテーブルの行数が 500 以下であり、その後、統計オブジェクトの先頭列の colmodctr が 500 を超えて変更されました。

3. 統計が収集されたときにテーブルに 500 を超える行があり、統計オブジェクトの先頭の列の colmodctr が、統計が収集されたときにテーブル内の行数の 500 + 20% を超えて変更されました。

使用統計については、次のリファレンスを参照してください。

http://blogs.technet.com/rob/archive/2008/05/16/sql-server-statistics.aspx

これがお役に立てば幸いですが、さらに質問をお寄せください。

乾杯、ジョン

于 2009-02-24T16:13:53.367 に答える
1

@Chris が指摘したように、インデックスはどの SQL Server バージョンでも自動的に再構築されません。専任の DBA ロールのないサイトでは、適切なインデックス メンテナンスが行われていないことが多く、データベースが単に開発から運用環境に (トランザクション ログのメンテナンスと共に) 移行された場合もよくあります。

SQL Server 2005+ には、オンラインでのインデックスの再編成とオフラインでの完全な再構築を行う機能があります。

于 2009-02-24T12:48:31.393 に答える
0

それは自分でスケジュールし、手配する必要があります。

整理するときは、テーブルのサイズとメンテナンス ウィンドウによって異なります。

また、インデックスの再構築時に統計が自動的に再構築されますが、個別にスケジュールすることもできます。

簡単に修正するには、メンテナンス ウィンドウが長く、大きすぎない (最大数 100 GB) と仮定して、次のようにスケジュールします。

EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)'

編集:> SQL 2005 this SQLのみ

于 2009-02-24T12:46:37.467 に答える