非常に少ない text、ntext、または image 列があるため DBCC SHRINKFILE と SHRINKDATABASE コマンドが動作しない可能性があります。

現象

DBCC SHRINKFILE および DBCC SHRINKDATABASE コマンドはないデータを移動し、 EstimatedPages値が等しい場合、 MinimumSizeコマンドが完了したときに報告されるファイル サイズを小さきます。データの変更のためバイナリ ラージ オブジェクト (BLOB) データの種類 (テキストntext 型イメージ) を割り当てられている多くのエクステントを持つことが含まれるテーブルでクエリ一時的なデータが挿入されます (たとえば、1 つだけコントロールのエクステントが割り当てられている 8 ページの)、DBCC SHRINKFILE と、DBCC SHRINKDATABASE 過剰なEstimatedPagesの数を推定するためのコマンドを、コマンドは、圧縮操作を行わないとします。通常、この現象が発生した場所の場合、データベース全体のバックアップのサイズはデータベースのファイルのサイズよりも最大で 8 倍より小さいデータベース ファイルに対して DBCC SHRINKFILE を実行した後。

解決策

このような状況を修正するときに常にオンラインで影響を受けるテーブルがない場合は、この問題を解決するのには以下の回避策のいずれかを使用できます。
  • 同じデータベースに新しいテーブルにテーブル全体を転送するのにには、SELECT INTO ステートメントを使用します。元のテーブルを削除し、DBCC SHRINKFILE ステートメントを実行します。元のテーブル名に新しいテーブルの名前を変更します。
  • 別のデータベースの新しいテーブルにテーブル全体を転送するのにには、SELECT INTO ステートメントを使用します。元のテーブルを切り捨てるし、DBCC SHRINKFILE ステートメントを実行します。元のテーブルにデータを転送します。
  • ネイティブ モードでテーブルをコピーするのにには、一括コピー プログラムを使用します。テーブルをスクリプト出力とし、既存のテーブルをドロップします。DBCC SHRINKFILE ステートメントを実行します。新しいテーブルを作成し、テーブルにデータをコピーするのには一括コピー プログラムを使用します。
  • データベース全体を新しいデータベースに転送するのにには、データ変換サービス (DTS) を使用します。SQL Server 7.0 のデータ変換サービスには、テキストおよびイメージ データ長が 64 KB よりも適切に転送できません可能性があります。この問題は、データ変換サービスの SQL Server 2000 のバージョンには適用されません。
    詳細については、マイクロソフト サポート技術情報の記事を表示するのには以下の記事番号をクリックします。
    257425の修正: DTS オブジェクトの転送では、64 を超える BLOB のデータは転送されません
    次のクエリを使用して 64 KB を超えるテキストおよびイメージの列を検索できます。
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    テキストおよびイメージ データが 64 KB より大きい場合は、転送データが切り捨てられるし、DTS では、ログ ファイル以外のすべてのエラーが発生しません。Text または image データの 64 KB より大きい値を使っている場合は、text または image データを持つテーブルの 3 番目の箇条書き項目で情報を使用します。次に、DTS を使用して、データベース内の項目の残りの部分の。
データベースをオンラインにする必要があります、または外部ファイル、または別のデータベースにデータを移動するのには、データベースのサイズが大きすぎて、EMPTYFILE オプションを使用して、DBCC SHRINKFILE コマンドを使用できます。この回避策を使用するには、以下の手順を実行します。
  1. Microsoft SQL Server 7.0 Service Pack 3 を実行している場合は、トレース フラグ 1180 および 1197 をオンにします。
  2. 7.00.987、やなど、それ以降の Service Pack 4 を構築する Microsoft SQL Server 7.0 Service Pack 3 を実行している場合は、トレース フラグ 1180 をオンにします。
  3. ドライブの空き領域の問題またはパフォーマンス上の理由のいずれかの複数のファイルは、データベースを展開するが場合、は、合計サイズが次のクエリの結果に匹敵する ALTER DATABASE コマンドを使用してデータベースに 1 つ以上の追加ファイルを作成します。
    select 'size in MB'=ceiling(sum(ei.pg_alloc)/128.000), sfg.groupnamefrom extentinfo ei inner join sysfiles sf on ei.[file_id] = sf.fileid and ei.[file_id] != 1
    inner join sysfilegroups sfg on sf.groupid = sfg.groupid
    group by sfg.groupname
    : 上記のクエリは、この資料の「関連情報」セクションで、クエリによって作成されるテーブルを使用します。さらに、ファイル サイズの合計を別のファイル グループです。

  4. Blob のエクステントに一時的なデータを設定するファイルごとに 2 番目のパラメーターとして EMPTYFILE オプションを使用して、DBCC SHRINKFILE のクエリを実行します。
  5. DBCC SRHINKFILEコマンドの進行状況を追跡するには、この資料の「関連情報」セクションからのextentinfoテーブルと同じスキーマを持つ 1 つまたは複数のテーブルを作成しますします。[挿入] を実行し、EXEC import_extentinfo"クエリ新しいテーブルにデータを入力します。結果を分析するのにには、次のクエリを使用します。
    select [file_id], 'page count'=sum(pg_alloc), 'min page'=min(page_id), 'max page'=max(page_id) from extentinfo group by [file_id]
    さらに、テーブルは、同じ文字のパターンを使用してを起動し、DBCC EXTENTINFO コマンドと時刻の近くに作成された場合、DBCC EXTENTINFO コマンドが実行されたときを追跡するため、次のクエリを使用できます。
    select crdate, [name] from sysobjects where type = 'U' and [name] like 'extent%' order by crdate
  6. DBCC SHRINKFILE クエリが完了すると、データベースから古いファイルを削除するのには、データベースの変更のクエリを実行します。
  7. 追加の空き領域を削除するには手順 3 で作成された新しいファイルに TRUNCATEONLY オプションを指定して DBCC SHRINKFILE のクエリを実行しているを可能性があります。
  8. Microsoft SQL Server 7.0 を実行している場合は、手順 1 または 2 を有効にするトレース フラグをオフにします。

詳細

Sysadmin権限を持つユーザーとしてログインしている場合は、クエリ アナライザーなどの任意のクエリ ツールから次の Transact SQL クエリを実行できます。DBCC SHRINKDATABASE コマンドとコマンドが非常に少ないのためのファイルを圧縮することはできません DBCC SHRINKFILE が BLOB のエクステントを作成するかどうかを決定するのには SQL Server には、Transact SQL クエリを実行します。

: 問題のデータベースの名前に '< データベース名 >' の文字列を更新し、名を単一引用符で囲みます。

use pubsgo
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
begin
create table extentinfo
(
[file_id] smallint,
page_id int,
pg_alloc int,
ext_size tinyint,
obj_id int,
index_id tinyint,
pfs_bytes varbinary(10)
)
end
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
begin
create table extentinfo
(
[file_id] smallint,
page_id int,
pg_alloc int,
ext_size tinyint,
obj_id int,
index_id tinyint,
pfs_bytes varbinary(10),
avg_used tinyint
)
end
go
create procedure import_extentinfo as
dbcc extentinfo('<database name>')
go
insert extentinfo exec import_extentinfo
go

select [file_id],obj_id, index_id, ext_size, 'actual extent count'=count(*), 'actual page count'=sum(pg_alloc),
'possible extent count'=ceiling(sum(pg_alloc)*1.0/ext_size),
'possible extents / actual extents' = (ceiling(sum(pg_alloc)*1.00/ext_size)*100.00) / count(*)
from extentinfo where ext_size != 1 and index_id = 255
group by [file_id],obj_id, index_id, ext_size
having count(*)-ceiling(sum(pg_alloc)*1.0/ext_size) > 0
order by obj_id, index_id, [file_id]
Index_id 255 の値がある、最後のクエリからの結果の行を表示する場合と可能なエクステント/実際エクステント列 75 未満の場合、このデータベースの BLOB のエクステントを一時的な設定があるが、この資料の「解決方法」セクションで説明した方法によってサイズに削減できます。

: このクエリは、DBCC EXTENTINFO コマンドの機能に依存しています。機能を変更することがありますか、Microsoft SQL Server の将来のバージョンからも削除するためにこのような状況以外の DBCC EXTENTINFO コマンドを使用しません。

関連情報

詳細については、マイクロソフト サポート技術情報の記事を表示するのには、以下の記事番号をクリックします。
272220の修正: テキスト/イメージ データの記憶域が正しく解放されません
308627の修正: DBCC SHRINKDATABASE または DBCC SHRINKFILE は、Text または Image データを含むデータベースを展開可能性があります
プロパティ

文書番号:324432 - 最終更新日: 2017/02/01 - リビジョン: 1

フィードバック