Zawsze należy rozważyć rywalizację przed dodaniem pliku TempDb. Dodanie 7 dodatkowych plików TempDb tak naprawdę nie pomoże.
Nie, nie powinno. Ale czy jesteś pewien, że nie masz do czynienia z dużą ilością danych lub nie masz innego procesu działającego na SQL? Kursory, tabele Temp, a nawet zmienne tabelowe intensywnie wykorzystują TempDb. Sprawdź, który obiekt zajmuje więcej miejsca na 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
Tak więc, jeśli twój użytkownik i obiekty wewnętrzne są większe, oznacza to wyraźnie, że masz mało miejsca na TempDb z powodu kursorów i wewnętrznego użycia SQL Server (np.:tabele pośrednie, łączenia haszujące, agregacja haszująca itp.)
Możesz użyć poniższego kodu, aby uzyskać liczbę wszystkich tabel we wszystkich bazach danych
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
Napisałem artykuł na temat TempDb rekomendacja ; Sugerowałbym przeczytanie tego, aby zrozumieć obiekty, które mogą wpływać na TempDb i jak rozwiązać typowe problemy z nim. W idealnym przypadku całkowity rozmiar TempDb powinien być obliczony na podstawie obserwacji, która w twoim przypadku> 24 GB.
** Edytuj 1**
Jeśli nie masz pewności co do aktualizacji statystyk, użyj poniższego zapytania, aby uzyskać liczbę wszystkich tabel Uwaga:Zastąp bazy danych, dla których nie chcesz mieć statystyk
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
podobnie możesz wziąć różne we wszystkich tabelach dla wszystkich baz danych z poniższym zapytaniem
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