Sie sollten immer Konflikte berücksichtigen, bevor Sie eine TempDb-Datei hinzufügen. Das Hinzufügen von 7 zusätzlichen TempDb-Dateien wird nicht wirklich helfen.
Nein, sollte es nicht. Aber sind Sie sicher, dass Sie es nicht mit großen Datenmengen zu tun haben oder keinen anderen Prozess auf SQL ausführen? Cursor, Temp-Tabellen und sogar Tabellenvariablen verwenden TempDb ausgiebig. Überprüfen Sie, welches Objekt mehr TempDb-Speicherplatz verbraucht:
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
Wenn Ihre Benutzer- und internen Objekte also mehr sind, bedeutet dies eindeutig, dass Sie aufgrund von Cursorn und der internen Verwendung von SQL Server wenig TempDb-Speicherplatz haben (z. B.:Zwischentabellen, Hash-Joins, Hash-Aggregation usw.)
Sie können den folgenden Code verwenden, um die Anzahl aller Tabellen in allen Datenbanken zu erhalten
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
Ich habe einen Artikel über TempDb geschrieben Empfehlung ; Ich würde Ihnen empfehlen, dies zu lesen, um Objekte zu verstehen, die TempDb beeinflussen können, und wie Sie häufige Probleme damit lösen können. Idealerweise sollte Ihre TempDb-Gesamtgröße basierend auf Beobachtungen berechnet werden, die in Ihrem Fall> 24 GB sind.
** Bearbeiten 1**
Wenn Sie sich bezüglich der Statistikaktualisierung nicht sicher sind, verwenden Sie die folgende Abfrage, um die Anzahl aller Tabellen zu erhalten. Hinweis:Ersetzen Sie Datenbanken, für die Sie keine Statistiken wünschen
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
Ebenso können Sie in allen Tabellen für alle Datenbanken mit der folgenden Abfrage unterscheiden
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