3

SQL Server 2005 に、約 3.5 GB の領域を使用する大きなテーブルがあります (sp_spaceused によると)。1,000 万件のレコードといくつかのインデックスがあります。

そこから一連の列を削除しただけで、レコード長が半分になりましたが、驚いたことに、それを行うのに時間がかかりませんでした。明らかに、sp_spaceused は引き続き同じ占有スペースを報告していました。SQL サーバーは、列を削除したときに、列を「削除済み」としてマークする以外には何もしていませんでした。

そこで、すべてのデータをこのテーブルから別の新しいテーブルに移動し、それを切り捨て、すべてのデータを元に戻して、すべて再構築できるようにしました。

現在、データは 2.8 GB を占めており、これは以前よりも少なくなっていますが、より大きな低下を予想していました。

このテーブルにはもともとこれらの列があったという事実が、まだそこに何かを残している可能性はありますか?

切り捨てでは不十分でしたか?ドロップして、小さい列セットで再度作成する必要がありますか?

それとも、データは本当に 2.8 GB を取っていますか?

ありがとう!

4

2 に答える 2

4

クラスター化されたインデックスを再構築する必要があります (クラスター化されたインデックスがあると仮定します - デフォルトでは、主キーはクラスター化されたキーです)。

ALTER INDEX (your clustered index) ON TABLE (your table) REBUILD

データは実際にはクラスター化インデックスのリーフ レベルです。一度再構築すると、データは "圧縮" され、行ははるかに少ないデータ ページに格納されるため、データベースのサイズも縮小されます。

それがまったく役に立たない場合は、データベースで DBCC SHRINKDATABASE を実行して、実際にスペースを再利用する必要がある場合もあります。これらの 2 つの手順を一緒に行うと、実際にはより小さなデータベース ファイルが得られるはずです。

マルク

于 2009-06-05T20:52:29.600 に答える
2

「より大きな下落が予想される」ということをどのように計算しましたか? データは 8K ページで提供されることに注意してください。つまり、個々の行が小さくても、それらを格納するのに必要なページが少なくて済むとは限りません。たとえば (極端な例)、行がそれぞれ 7.5K だった場合、1 ページあたり 1 行しか収まりません。いくつかの列を削除すると、行は 5K になりますが、それでも 1 ページあたり 1 行です。

于 2009-06-05T20:08:57.363 に答える