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

Tempdb fuld ved forespørgsel om tydeligt antal af alle tabeller

Du bør altid overveje påstand, før du tilføjer TempDb-fil. Tilføjelse af 7 ekstra TempDb-filer hjælper ikke rigtigt.

Nej, det burde det ikke. Men er du sikker på, at du ikke har med store mængder data at gøre, eller at du ikke har andre processer kørende på SQL? Markører, Temp-tabeller og endda tabelvariabler bruger TempDb i udstrakt grad. Tjek hvilket objekt der bruger mere TempDb plads:

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

Så hvis dine bruger- og interne objekter er flere, betyder det klart, at du har lav TempDb-plads på grund af markører og intern brug af SQL Server (eks.:mellemliggende tabeller, Hash joins, Hash-aggregering osv.)

Du kan bruge nedenstående kode til at få optællingen af ​​alle tabeller i alle databaser

  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

Jeg har skrevet en artikel om TempDb anbefaling ; Jeg vil foreslå dig at læse det for at forstå objekter, der kan påvirke TempDb, og hvordan man løser almindelige problemer med det. Ideelt set bør din samlede TempDb-størrelse beregnes baseret på observation, som i dit tilfælde er> 24 GB.

** Rediger 1**

Hvis du er usikker på statistikopdatering, så brug nedenstående forespørgsel for at få optælling af alle tabellerBemærk:Erstat databaser, som du ikke ønsker statistik for

    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

på samme måde kan du tage distinkt i alle tabeller for alle databaser med nedenstående forespørgsel

    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. Kompileringsfejl:Forventet funktion eller variabel i VBA for adgang

  2. Ufanget undtagelse 'PDOException'-meddelelse 'ugyldigt datakildenavn'

  3. Reducer 19 kolonner til 5 kolonner

  4. Oracle Data Mining (ODM) – Installation og opsætning