web-dev-qa-db-ja.com

SQL Server 2012はデータベース領域を拡大します

SQL Server 2012でデータベースインスタンスのデータベースサイズを拡大しようとしました。データベースインスタンスの下に新しい.MDFファイルを手動で追加しました

enter image description here

データベースの縮小ダイアログで再起動すると、使用可能なスペースが表示されます

enter image description here

ファイルの縮小ダイアログで、利用可能な空き容量が追加されます

enter image description here

しかし、次のSQLクエリを実行すると、利用可能なスペースはまだ小さい

select
    name
    , filename
    , convert(decimal(12,2),round(a.size/128.000,2)) as FileSizeMB
    , convert(decimal(12,2),round(fileproperty(a.name,'SpaceUsed')/128.000,2)) as SpaceUsedMB
   , convert(decimal(12,2),round((a.size-fileproperty(a.name,'SpaceUsed'))/128.000,2)) as FreeSpaceMB
from 
    dbo.sysfiles a

データベースにはまだ2つのファイルしか表示されません....

enter image description here

私が間違ったことは何ですか?

[編集]クエリで統計情報のみが正しく表示されない場合は、問題ありません。私の質問は、正しい方法で作成されたデータベースにスペースを追加するプロセス全体ですか、それともプロセスを完了するために何かを追加する必要がありますか?後で編集してごめんね

助けてくれてありがとう

2
Toren

DBCC UPDATEUSAGE(Transact-SQL) を参照:

統計を更新します-sysviewが同期していません。

システムビューが常に正確であるとは限らないようで、sp_spaceusedはこのことで悪名高くなっています。キャッシュの形式は重要ではないが重いプロセスデータ収集機能に適用されます。たとえば、パーティションの測定(先ほど作成したもの)や割り当てなどです。

sp_spaceused(Transact-SQL) を調べると、次のようになります。

updateusageが指定されている場合、SQL Serverデータベースエンジンはデータベースのデータページをスキャンし、sys.allocation_unitsおよびsys.partitionsカタログビュー。各テーブルで使用されるストレージスペースに関するものです。たとえば、インデックスが削除された後、テーブルのスペース情報が最新ではない場合があります。 updateusageは、大きなテーブルまたはデータベースで実行するのに時間がかかる場合があります。 updateusageは、誤った値が返されていると思われる場合、およびプロセスがデータベース内の他のユーザーまたはプロセスに悪影響を及ぼさない場合にのみ使用してください。必要に応じて、DBCC UPDATEUSAGEは個別に実行できます。

実行してみてください:

EXEC sp_spaceused @updateusage = N'TRUE';
1
Alocyte

Kris Gruttemeyer による質問へのコメントから生成されたコミュニティWiki回答

オートグローの増分を増やしてください。これは、1MBずつ増加していることを示しています。これは、ストレージシステムが常に拡張していると確信しているため、ストレージシステムにとって悪夢になる可能性があります。使用量と拡張パターンに基づいてDBに十分な拡張の余地を与えることを計画して、途中で1MBごとにコストのかかるI/O操作を回避する必要があります。

自動拡張を500MBに設定すると、「サーバーの強制終了」とは逆のことが行われ、自動拡張イベントが発生するたびに領域が増えるので役立ちます。 1 MBを使用すると、これまでの500 MBよりもはるかに害が大きくなります。考えてみてください。DBを1MBで拡張しています。すべて。シングル。時間。これは、ストレージシステムとディスクにとって多くの作業です。 DBのサイズを考えると、1〜5 GBの増加から始めます。

これは私が読むことをお勧めする素晴らしい記事、特に最初のセクションです:

できるだけシンプルなモードで操作したい。複数のファイル(tempDB、特定のDBのより高速なドライブなど)を使用する正当な理由がない限り、すべてを1つにまとめます。複数のファイルを用意する理由はたくさんありますが、それらを用意するためにそれらを用意するのは頭痛の種になるだけです。 1つのデータファイルを展開し、それを使って、他に何かを見つけることができるため、管理性の観点から物事がはるかに簡単になります。 :)

DBファイルはコンテナであり、サイジングを積極的に行い、過剰に拡張することなく拡張できる余地を与えたいとします(2T DBファイルの50GBのデータは過剰であり、スペースの無駄になります)。 2T DBファイルがあっても、実際には1GBのデータしかない場合、SQLは、2Tデータファイル全体ではなく、必要な1GBのデータのみを処理する必要があります。

1
Paul White 9

私は誰もが明白なものから飛び跳ねているのを見ます、クエリ結果は2つのファイルしか表示しません、それは3つのファイル、2つの.mdfファイルと.ldfを表示するはずです、ここで起こったことはOPがマスターデータベースまたは別のデータベースコンテキストにあるため、誤った結果が表示されます。

このクエリは、dbo.sysfilesを参照するため、結果を取得する対象のデータベースのコンテキストで実行する必要があります。

put use [database_name]ここで、database_nameは、使用および使用可能なスペースを見つけることに関心のあるデータベースです。

1
entDba