TempDb ファイルを追加する前に、常に競合を考慮する必要があります。 7 つの TempDb ファイルを追加しても、実際には役に立ちません。
いいえ、そうすべきではありません。しかし、大量のデータを扱っていない、または SQL で他のプロセスを実行していないという確信はありますか?カーソル、Temp テーブル、さらにはテーブル変数でさえ、TempDb を広範囲に使用します。どのオブジェクトがより多くの TempDb スペースを消費しているかを確認します:
SELECT
SUM (user_object_reserved_page_count)*8 as usr_obj_kb,
SUM (internal_object_reserved_page_count)*8 as internal_obj_kb,
SUM (version_store_reserved_page_count)*8 as version_store_kb,
SUM (unallocated_extent_page_count)*8 as freespace_kb,
SUM (mixed_extent_page_count)*8 as mixedextent_kb
FROM sys.dm_db_file_space_usage
したがって、ユーザー オブジェクトと内部オブジェクトがそれ以上の場合は、カーソルと SQL Server の内部使用 (例:中間テーブル、ハッシュ結合、ハッシュ集計など) のために、TempDb 領域が不足していることを明確に意味します。
以下のコードを使用して、すべてのデータベースのすべてのテーブルの数を取得できます
DECLARE @Stats TABLE (DBNAME VARCHAR(40), NAME varchar(200), Rows INT)
INSERT INTO @Stats
EXECUTE sp_MSForEachDB
'USE ?; SELECT DB_NAME()AS DBName,
sysobjects.Name
, sysindexes.Rows
FROM
sysobjects
INNER JOIN sysindexes
ON sysobjects.id = sysindexes.id
WHERE
type = ''U''
AND sysindexes.IndId < 2'
SELECT * FROM @Stats
TempDb に関する記事を書きました。おすすめ ;これを読んで、TempDb に影響を与える可能性のあるオブジェクトと、その一般的な問題を解決する方法を理解することをお勧めします。理想的には、TempDb の合計サイズは観察に基づいて計算する必要があります。この場合、24 GB を超えます。
** 編集 1**
統計の更新が不明な場合は、以下のクエリを使用してすべてのテーブルの数を取得してください注:統計が不要なデータベースを置き換えてください
DECLARE @ServerStats TABLE (DatabaseName varchar(200), TableName varchar(200), RowsCount INT)
INSERT INTO @ServerStats
exec sp_msforeachdb @command1='
use #;
if ''#'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'',''ReportServer'')
begin
print ''#''
exec sp_MSforeachtable @command1=''
SELECT ''''#'''' AS DATABASENAME, ''''?'''' AS TABLENAME, COUNT(*) FROM ? ;
''
end
', @replacechar = '#'
SELECT * FROM @ServerStats
同様に、以下のクエリを使用して、すべてのデータベースのすべてのテーブルで個別を取ることができます
DECLARE @ServerStatsDistinct TABLE (DatabaseName varchar(200), TableName varchar(200), RowsCount INT)
INSERT INTO @ServerStatsDistinct
exec sp_msforeachdb @command1='
use #;
if ''#'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'',''ReportServer'')
begin
print ''#''
exec sp_MSforeachtable @command1=''
SELECT ''''#'''' AS DATABASENAME, ''''?'''' AS TABLENAME, COUNT(*) FROM (
SELECT DISTINCT *
FROM ?
) a ;
''
end
', @replacechar = '#'
SELECT * FROM @ServerStatsDistinct