Du bör alltid överväga argument innan du lägger till TempDb-fil. Att lägga till ytterligare 7 TempDb-filer hjälper inte riktigt.
Nej, det borde det inte. Men är du säker på att du inte har att göra med stora mängder data eller att du inte har någon annan process som körs på SQL? Markörer, Temp-tabeller och även tabellvariabler använder TempDb i stor utsträckning. Kontrollera vilket objekt som förbrukar mer TempDb-utrymme:
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
Så om dina användar- och interna objekt är fler så betyder det tydligt att du har lågt TempDb-utrymme på grund av markörer och intern användning av SQL Server (Ex:mellanliggande tabeller, Hash-kopplingar, Hash-aggregation etc)
Du kan använda nedanstående kod för att få räkningen av alla tabeller i alla databaser
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
Jag har skrivit en artikel om TempDb rekommendation ; Jag skulle föreslå att du läser det för att förstå objekt som kan påverka TempDb och hur man löser vanliga problem med det. Helst bör din totala TempDb-storlek beräknas baserat på observationer som i ditt fall är> 24 GB.
** Redigera 1**
Om du är osäker på statistikuppdatering, använd nedanstående fråga för att få räkning av alla tabellerObs:Ersätt databaser som du inte vill ha statistik för
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
på samma sätt kan du ta distinkt i alla tabeller för alla databaser med nedanstående fråga
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