2016-10-21 24 views
5

ジョブの下でストアドプロシージャ内で実行される大きなカーソルベースクエリがあります。これは、一日のうちに一束の市場データを計算するためのものです。このような繰り返しはすべて、ディスクからヒストリ・タイム・シリーズをプールし、適切な索引付けを使用してテンポラリ・テーブルに集め、中間結果を含む多数のtrunsformationに結合し、計算出力をディスクに格納します。各ループの終わりに、すべての一時テーブルを削除(ほとんど)または切り捨てて、tempdb内のユーザーオブジェクトのページの割り当てを解除し、次の反復の準備ができる名前空間を取得します。SQL Server:tempdb内の解放された内部オブジェクトのクリーンアップを強制して、開かれたセッション内で予約されたディスク領域を開放します。

私の問題は、DBエンジンがクエリの実行のために作成し、それらをtempdbにダンプするすべての内部オブジェクトです。トランザクションのコミット後に割り当て解除されたディスクスペースを確保します。また、新しい内部オブジェクトの次の束がディスクにスワイプされるたびに、すべてのサイクルで合計されます。

永続的なtempdb grouth、新規および新規の解放された内部オブジェクトに関連する予約済みスペースのすべてを永続化します。 DBエンジンは、procがサイクルを終了したときにセッションが終了した後にのみ、これらの膨大な量のディスクスペースを解放/縮小します。

各ジョブの実行サイクル数を減らすことで問題を解決できます。再起動するだけです。しかし私は完全な根本的な決定を望みます:セッション中にコマンドやトリックが必要なので、割り当てられた内部オブジェクトを完全に消去/消去し、それらのために予約されたtempdbディスクスペースを解放する必要があります。グーグルの時代は助けにはならなかった。フォークス、助けて!

答えて

1

は、我々は正確に同じ問題があります。

  1. 時間のかかる再計算が毎晩実行されますが、
  2. 一時テーブルの多くは、並列 実行が問題を解決するために

を計画して使用するために使用されている、私たちは(別のセッションでは、各実行小さなプロセスにプロセスを分けたが、連鎖してきましたブロッキングの問題を避けるため) - 最初の部分が実行されると、次の部分を起動し、実行された後、次の部分を起動します。

たとえば、計算を連鎖させる方法がある場合は、ループの反復を解除して、さまざまなパラメータでプロシージャの呼び出しを分離できます。異なるセッションで実行され、それぞれが終了するとページが解放されます。

+0

gotqn、それはとてもいいです。私は、あなたのような別のセッションに分割することは、現在のDBエンジンの唯一の方法だと思います。私は、1つのproc内でセッションを再開することを夢見ています。これは、コーディングや連鎖がずっと簡単です。しかし、それも不可能です。ナッツ。誰もが文書化されていない隠された機能や他のハッピークソのハックを解明しなければ、私はあなたの投稿を答えにします – Globe

関連する問題