web-dev-qa-db-ja.com

SQL Server 2012で重いSQLクエリを実行すると、システムディスクの領域が不足する

SQL Server 2012は初めてですが、誰かが手伝ってくれるとありがたいです。巨大なデータベースのコピーをSQL Server 2012に復元し、それに対していくつかの簡単なクエリを実行しようとしました。

136898115行のデータベーステーブルに対してSELECTクエリを実行しようとしています。このSELECTクエリには、単純なWHERE句しかありません。このクエリを実行するたびに、システムディスク(Windowsがインストールされているパーティション-C:\)の領域が不足しているため(このパーティションには6 GBの空き領域しかない)、失敗します。理由がわかりません。 tempdbを、14テラバイトを超える空き領域がある別のドライブに定義しました。もちろん、私のデータベースも別のドライブにあります。

システムパーティションの容量が不足する原因は何ですか?それはページファイルですか?

14
royv

SSMSクエリの結果は、デフォルトでC:ドライブにキャッシュされます。ツール\オプションに移動します。添付資料参照。これをより多くのストレージを持つ別のボリュームに変更すれば、大丈夫です。

enter image description here

12
Eric Higgins

さて、私はそれを理解しました: Eric そして私はどちらも正しかった!

  • ダイアログのパスは、私が言ったように、クエリ結果を保存するためのデフォルトのパスにすぎません。
  • クエリ結果areはディスクにキャッシュされますが(私は間違っていました)、ローカルプロファイルtempフォルダー(C:\Users\<UserName>\AppData\Local\Temp私の場合はここ)。私がチェックしたところ、このキャッシュをオフにする明白な方法がないようです。

したがって、要点は次のとおりです。

  • SQLボックスで直接SSMSを実行しない
  • しないでくださいSELECT *結果セットがプロファイルフォルダに収まらない限り、SSMSの巨大なテーブルから
  • SQL Serverの最大メモリ設定が正しく構成されていることを確認します(ページファイルの増加に関してこの問題の一因となっている場合とされていない場合があります)。
11
Jon Seigel

私はちょうど同じ問題を経験しました。上記の答えを読んだ後、私は以下を見つけました。

ツール|オプションは答えではありません。私のクエリはY:ドライブに設定されていましたが、クエリが実行され、C:ドライブの領域が2.9GBから5.04MBに急降下するのを見ました(クエリを終了する前)。

ジョンが言ったとおり、結果はおそらくすべての行が返されて非常に大きく、返されるすべての行に大きなXMLチャンクが含まれているため、Tempディレクトリに結果をキャッシュしていると思いましたが、どのように変更するかはわかりませんでした。

一時ファイルが書き込まれる場所を変更するために行ったのは、環境変数を開き、ユーザー変数TEMPおよびTMP(どちらもC:\ Tempに設定されている)を編集してZ:\ Tempに書き込むことでした。

この変更後、クエリがZ:\ Tempディレクトリに非常に大きなファイルを作成するのを確認できました。

7
Nick Ryan