Siempre debe considerar la contención antes de agregar el archivo TempDb. Agregar 7 archivos TempDb adicionales realmente no ayudará.
No, no debería. Pero, ¿está seguro de que no está tratando con una gran cantidad de datos o no tiene otro proceso ejecutándose en SQL? Los cursores, las tablas temporales e incluso las variables de tabla usan TempDb de forma extensiva. Compruebe qué objeto está consumiendo más espacio 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
Por lo tanto, si su usuario y los objetos internos son más, significa claramente que tiene poco espacio en TempDb debido a los cursores y al uso interno de SQL Server (por ejemplo, tablas intermedias, uniones hash, agregación hash, etc.)
Puede usar el siguiente código para obtener el recuento de todas las tablas en todas las bases de datos
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
He escrito un artículo sobre TempDb recomendación ; Le sugiero que lea eso para comprender los objetos que pueden afectar a TempDb y cómo resolver problemas comunes. Idealmente, su tamaño total de TempDb debe calcularse en función de la observación que, en su caso,> 24 GB.
** Editar 1**
Si no está seguro acerca de la actualización de las estadísticas, use la siguiente consulta para obtener el recuento de todas las tablas. Nota:Reemplace las bases de datos para las que no desea estadísticas
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
De manera similar, puede diferenciarse en todas las tablas para todas las bases de datos con la siguiente consulta
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