Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Tempdb pieno quando si esegue una query su un conteggio distinto di tutte le tabelle

Dovresti sempre considerare la contesa prima di aggiungere il file TempDb. L'aggiunta di 7 file TempDb aggiuntivi non aiuterà davvero.

No, non dovrebbe. Ma sei sicuro di non avere a che fare con una grande quantità di dati o di non avere altri processi in esecuzione su SQL? I cursori, le tabelle temporanee e persino le variabili di tabella utilizzano ampiamente TempDb. Controlla quale oggetto sta consumando più spazio 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

Quindi, se il tuo utente e gli oggetti interni sono più, significa chiaramente che hai uno spazio TempDb basso a causa dei cursori e dell'utilizzo interno di SQL Server (es:tabelle intermedie, hash join, aggregazione hash, ecc.)

Puoi utilizzare il codice seguente per ottenere il conteggio di tutte le tabelle in tutti i database

  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

Ho scritto un articolo su TempDb raccomandazione ; Ti suggerirei di leggerlo per capire gli oggetti che possono influenzare TempDb e come risolverne i problemi comuni. Idealmente, la dimensione totale di TempDb dovrebbe essere calcolata in base all'osservazione che nel tuo caso è> 24 GB.

** Modifica 1**

Se non sei sicuro dell'aggiornamento delle statistiche, utilizza la query seguente per ottenere il conteggio di tutte le tabelle Nota:sostituisci i database per i quali non desideri statistiche

    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

allo stesso modo puoi distinguere in tutte le tabelle per tutti i database con la query sottostante

    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