Dovresti sempre considerare la contesa prima di aggiungere il file TempDb. L'aggiunta di 7 file TempDb aggiuntivi non aiuterà davvero.
No, non dovrebbe. Ma sei sicuro di non avere a che fare con una grande quantità di dati o di non avere altri processi in esecuzione su SQL? I cursori, le tabelle temporanee e persino le variabili di tabella utilizzano ampiamente TempDb. Controlla quale oggetto sta consumando più spazio 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
Quindi, se il tuo utente e gli oggetti interni sono più, significa chiaramente che hai uno spazio TempDb basso a causa dei cursori e dell'utilizzo interno di SQL Server (es:tabelle intermedie, hash join, aggregazione hash, ecc.)
Puoi utilizzare il codice seguente per ottenere il conteggio di tutte le tabelle in tutti i database
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
Ho scritto un articolo su TempDb raccomandazione ; Ti suggerirei di leggerlo per capire gli oggetti che possono influenzare TempDb e come risolverne i problemi comuni. Idealmente, la dimensione totale di TempDb dovrebbe essere calcolata in base all'osservazione che nel tuo caso è> 24 GB.
** Modifica 1**
Se non sei sicuro dell'aggiornamento delle statistiche, utilizza la query seguente per ottenere il conteggio di tutte le tabelle Nota:sostituisci i database per i quali non desideri statistiche
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
allo stesso modo puoi distinguere in tutte le tabelle per tutti i database con la query sottostante
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