web-dev-qa-db-ja.com

SELECTのエラー-プライマリファイルグループがいっぱいです

SQL Server 2008 R2データベースビューは、いくつかのトランザクションテーブルを結合します。クエリは数か月にわたって遅くなり、開発チームはクエリを再作成することを計画しています。結果をフラットファイルにETLしてDBから削除する必要があります。 (5Mレコードの)ビューをクエリしようとすると、このエラーが表示されました。

メッセージ1105、レベル17、状態2、行1
'PRIMARY'ファイルグループがいっぱいのため、データベース 'tempdb'のオブジェクト 'dbo.SORT一時実行ストレージ:140744470495232'に領域を割り当てることができませんでした不要なファイルを削除したり、ファイルグループ内のオブジェクトを削除したり、ファイルグループにファイルを追加したり、ファイルグループ内の既存のファイルに対して自動拡張をオンに設定したりして、ディスク領域を作成します。

設定する必要がある推奨ファイル拡張はどのくらいですか、このエラーはどのように管理または解決されますか?前もって感謝します。

5
paulvillaruel23

最も迅速な修正は、SQL Serverを再起動することです。Tempdbは、デフォルトのサイズと空のファイルで再作成されます。

しかし、それが本番サーバーの場合、必要なときに実際に再起動することはできません。実際の修正は、別のドライブに新しいファイルを追加してクエリを実行することです。

例は次のようになります(開始サイズが1 MBの新しいファイル、100 MBの増加、500 MBの制限)。

USE [master]
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'newtempfile', FILENAME = N'e:\newtempfile.ndf' , SIZE = 100MB, MAXSIZE = 500MB , FILEGROWTH = 100MB )
GO

そして、時間があれば、Tempdbの使用状況を確認してください。ただし、TempDB用のスペースが引き続き必要になる可能性があるため、正常なシステムにとって非常に重要であるため、このためのスペースを計画し、このdbに十分なスペースを割り当てることをお勧めします(RAM部分)。

PS1:選択ステートメントのどこにもデカルト積がないかどうかを確認します。その数は少し高いようです。

PS2:TempDBドライブに十分な空き容量がある場合は、ファイルが制限に達していないか、自動拡張が無効になっているかどうかを確認してください。はいの場合は、自動拡張を有効にします(パーセントではなく、特定のサイズで快適に感じる)。

PS3:優れたソリューションは、そのETLプロセスをより小さなトランザクションに分割することです。一度に1ビルのレコードを削除する代わりに、1000ミルずつ削除するか、プロセスの長さとファイルのサイズが安全になるまでバッチサイズを試してください。結果はより速く得られ、スペースが大幅に増加することはありません。

5
Marian

このエラーは、tempdbが存在するハードドライブがいっぱいであることを示している可能性が高いです。最も簡単な解決策は、新しいドライブを接続し、そこにtempdbを移動することです。

まず、tempdbのコンテキストで次のクエリを実行して、tempdbを構成するファイルの名前を確認します。

EXEC sp_helpfile
GO

上記のスクリプトのファイル名を使用して、次のスクリプトを変更します。

USE master
GO
ALTER DATABASE TempDB MODIFY FILE
  (NAME = tempdev, FILENAME = 'e\:<tempdb datafile>.mdf')
GO
ALTER DATABASE TempDB MODIFY FILE
  (NAME = templog, FILENAME = 'e:\<tempdb log>.ldf')
GO

明らかに、E:\を新しいドライブ文字に置き換えます。

完了したら、SQL Serverを再起動してtempdbを実際に移動し、問題が解決したかどうかを確認します。

3
SchmitzIT