Před přidáním souboru TempDb byste měli vždy zvážit spor. Přidání 7 dalších souborů TempDb opravdu nepomůže.
Ne, nemělo by. Jste si ale jisti, že nepracujete s velkým množstvím dat nebo vám na SQL neběží jiný proces? Kurzory, Temp tabulky a dokonce i proměnné tabulky používají TempDb značně. Zkontrolujte, který objekt spotřebovává více místa 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
Pokud je tedy vašich uživatelských a interních objektů více, pak to jasně znamená, že máte málo místa TempDb kvůli kurzorům a internímu použití SQL Serveru (např.:přechodné tabulky, spojení hash, agregace hash atd.)
Níže uvedený kód můžete použít k získání počtu všech tabulek ve všech databázích
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
Napsal jsem článek na TempDb doporučení ; Navrhoval bych, abyste si to přečetli, abyste pochopili objekty, které mohou ovlivnit TempDb, a jak řešit jejich běžné problémy. V ideálním případě by se vaše celková velikost TempDb měla vypočítat na základě pozorování, které je ve vašem případě> 24 GB.
** Upravit 1**
Pokud si nejste jisti aktualizací statistik, použijte níže uvedený dotaz k získání počtu všech tabulek Poznámka:Nahradit databáze, pro které statistiky nechcete
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
podobně můžete rozlišovat ve všech tabulkách pro všechny databáze pomocí níže uvedeného dotazu
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