Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tempdb pełny podczas zapytania o odrębną liczbę wszystkich tabel

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wywołaj procedurę składowaną z php codeigniter

  2. Jak zmienić wartości dla edycji Top X i wybrać Top X Rows w SQL Server Management Studio (SSMS) — SQL Server / TSQL Tutorial, część 20

  3. Przekazywanie wielu wartości dla jednego parametru SQL

  4. Dodaj login i połącz się z SQL za pomocą uwierzytelniania SQL Server

  5. Pomóż ulepszyć statystyki programu SQL Server!