Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Tempdb voll, wenn eindeutige Anzahl aller Tabellen abgefragt wird

Sie sollten immer Konflikte berücksichtigen, bevor Sie eine TempDb-Datei hinzufügen. Das Hinzufügen von 7 zusätzlichen TempDb-Dateien wird nicht wirklich helfen.

Nein, sollte es nicht. Aber sind Sie sicher, dass Sie es nicht mit großen Datenmengen zu tun haben oder keinen anderen Prozess auf SQL ausführen? Cursor, Temp-Tabellen und sogar Tabellenvariablen verwenden TempDb ausgiebig. Überprüfen Sie, welches Objekt mehr TempDb-Speicherplatz verbraucht:

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

Wenn Ihre Benutzer- und internen Objekte also mehr sind, bedeutet dies eindeutig, dass Sie aufgrund von Cursorn und der internen Verwendung von SQL Server wenig TempDb-Speicherplatz haben (z. B.:Zwischentabellen, Hash-Joins, Hash-Aggregation usw.)

Sie können den folgenden Code verwenden, um die Anzahl aller Tabellen in allen Datenbanken zu erhalten

  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

Ich habe einen Artikel über TempDb geschrieben Empfehlung ; Ich würde Ihnen empfehlen, dies zu lesen, um Objekte zu verstehen, die TempDb beeinflussen können, und wie Sie häufige Probleme damit lösen können. Idealerweise sollte Ihre TempDb-Gesamtgröße basierend auf Beobachtungen berechnet werden, die in Ihrem Fall> 24 GB sind.

** Bearbeiten 1**

Wenn Sie sich bezüglich der Statistikaktualisierung nicht sicher sind, verwenden Sie die folgende Abfrage, um die Anzahl aller Tabellen zu erhalten. Hinweis:Ersetzen Sie Datenbanken, für die Sie keine Statistiken wünschen

    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

Ebenso können Sie in allen Tabellen für alle Datenbanken mit der folgenden Abfrage unterscheiden

    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