1

Windows Server 2008 で SQL Server 2008 を使用しています。temp DB mdf と temp ldf は非常に大きく (約 13G)、他のすべての実際のアプリケーション データベース ファイル (mdf+ldf) とほぼ同じサイズです。

私の質問、

  1. どの一時 DB が使用されますか?
  2. temp DB がこれほど大きいのは正常な状況ですか? そうでない場合、システムのパフォーマンスと信頼性に影響を与えずに一時 DB をクリーンアップする方法はありますか?

前もって感謝します、ジョージ

4

2 に答える 2

2

tempdb mdf/ldf ファイルは、shrinkfile、shrinkdatabase DBCC コマンドを使用して圧縮できます。

use tempdb
go

dbcc shrinkfile (tempdev, 'target size in MB')
go

dbcc shrinkfile (templog, 'target size in MB')
go

効率的な方法でコードを記述すると、tempdb の増大を回避できます。コードで「カーソル」を使用しないでください。これは、パフォーマンスの主要なキラーであり、カーソルのデータセットが大きいほど、tempdb のサイズが大きくなります。必要でない場合は、一時テーブルの使用を避けてください。#temptable、##temptable が必要ない場合にスコープ全体で使用すると、再びパフォーマンスの問題が発生します。

SQL 2005/2008 には、一時テーブルのデータをクエリできる CTE があり、スコープはその 1 行後です。

;With CTETable as
(
  SELECT <Columnlist> FROM <TableName> {Joins} WHERE <Condition> GROUP BY <Column List> ORDER BY <COlumn> ASC
)

SELECT ColumnList from CTETABLE
....
Statements

その CTEtable のスコープは、「CTETABLE からの SELECT ColumnList」行の後に期限切れになります。このようにするとより効果的です。効果的なクエリを作成することも役立ちます。

于 2010-06-26T07:22:08.653 に答える
1

1:TempDbはソートなどに使用されます。一時的なものです。DISTINCTステートメントを不必要に使用している愚かな開発者はそれを部分的に打っています。プラス一時テーブル。

2:いいえ。まれなケースですが、これはまれなエッジケースです。Tempdbのクリーンアップ....サーバーを再起動します。Tempdbは、起動するたびに完全に再生成されます。次に、tempdbに向かうクエリの検索を開始します。これには手作業が必要になります。不必要に使用されているDISTINCT句を確認してください。

于 2010-06-26T06:25:24.647 に答える