U moet altijd rekening houden met twist voordat u een TempDb-bestand toevoegt. 7 extra TempDb-bestanden toevoegen zal niet echt helpen.
Nee, dat mag niet. Maar weet je zeker dat je niet te maken hebt met grote hoeveelheden gegevens of dat er geen ander proces op SQL draait? Cursors, Temp-tabellen en zelfs tabelvariabelen maken veelvuldig gebruik van TempDb. Controleer welk object meer TempDb-ruimte in beslag neemt:
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
Dus als uw gebruiker en interne objecten meer zijn, betekent dit duidelijk dat u weinig TempDb-ruimte heeft vanwege cursors en intern gebruik van SQL Server (bijv. tussenliggende tabellen, hash-joins, hash-aggregatie enz.)
U kunt onderstaande code gebruiken om het aantal tabellen in alle databases te krijgen
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
Ik heb een artikel geschreven over TempDb aanbeveling ; Ik zou je aanraden om dat te lezen om objecten te begrijpen die TempDb kunnen beïnvloeden en hoe je veelvoorkomende problemen ermee kunt oplossen. Idealiter zou uw totale TempDb-grootte moeten worden berekend op basis van observatie, die in uw geval> 24 GB is.
** Bewerk 1**
Als u niet zeker bent van het bijwerken van statistieken, gebruik dan onderstaande query om het aantal tabellen te krijgen Opmerking:Vervang databases waarvoor u geen statistieken wilt
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
op dezelfde manier kunt u onderscheid maken in alle tabellen voor alle databases met onderstaande query
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