sql >> Databasteknik >  >> RDS >> Sqlserver

Tempdb Full När du frågar Distinkt antal av alla tabeller

Du bör alltid överväga argument innan du lägger till TempDb-fil. Att lägga till ytterligare 7 TempDb-filer hjälper inte riktigt.

Nej, det borde det inte. Men är du säker på att du inte har att göra med stora mängder data eller att du inte har någon annan process som körs på SQL? Markörer, Temp-tabeller och även tabellvariabler använder TempDb i stor utsträckning. Kontrollera vilket objekt som förbrukar mer TempDb-utrymme:

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å om dina användar- och interna objekt är fler så betyder det tydligt att du har lågt TempDb-utrymme på grund av markörer och intern användning av SQL Server (Ex:mellanliggande tabeller, Hash-kopplingar, Hash-aggregation etc)

Du kan använda nedanstående kod för att få räkningen av alla tabeller i alla 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

Jag har skrivit en artikel om TempDb rekommendation ; Jag skulle föreslå att du läser det för att förstå objekt som kan påverka TempDb och hur man löser vanliga problem med det. Helst bör din totala TempDb-storlek beräknas baserat på observationer som i ditt fall är> 24 GB.

** Redigera 1**

Om du är osäker på statistikuppdatering, använd nedanstående fråga för att få räkning av alla tabellerObs:Ersätt databaser som du inte vill ha statistik för

    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å samma sätt kan du ta distinkt i alla tabeller för alla databaser med nedanstående fråga

    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. ASP.NET-inloggning misslyckades för användaren 'NT AUTHORITY\NETWORK SERVICE'

  2. Migrera SPATIAL-data från Oracle till Postgresql

  3. LÄGG TILL tid 23:59:59.999 till slutdatum för mellan

  4. BULK INSERT i specifika kolumner?