sql >> Database >  >> RDS >> Sqlserver

Tempdb vol bij het opvragen van verschillende tellingen van alle tabellen

U moet altijd rekening houden met twist voordat u een TempDb-bestand toevoegt. 7 extra TempDb-bestanden toevoegen zal niet echt helpen.

Nee, dat mag niet. Maar weet je zeker dat je niet te maken hebt met grote hoeveelheden gegevens of dat er geen ander proces op SQL draait? Cursors, Temp-tabellen en zelfs tabelvariabelen maken veelvuldig gebruik van TempDb. Controleer welk object meer TempDb-ruimte in beslag neemt:

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

Dus als uw gebruiker en interne objecten meer zijn, betekent dit duidelijk dat u weinig TempDb-ruimte heeft vanwege cursors en intern gebruik van SQL Server (bijv. tussenliggende tabellen, hash-joins, hash-aggregatie enz.)

U kunt onderstaande code gebruiken om het aantal tabellen in alle databases te krijgen

  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

Ik heb een artikel geschreven over TempDb aanbeveling ; Ik zou je aanraden om dat te lezen om objecten te begrijpen die TempDb kunnen beïnvloeden en hoe je veelvoorkomende problemen ermee kunt oplossen. Idealiter zou uw totale TempDb-grootte moeten worden berekend op basis van observatie, die in uw geval> 24 GB is.

** Bewerk 1**

Als u niet zeker bent van het bijwerken van statistieken, gebruik dan onderstaande query om het aantal tabellen te krijgen Opmerking:Vervang databases waarvoor u geen statistieken wilt

    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

op dezelfde manier kunt u onderscheid maken in alle tabellen voor alle databases met onderstaande query

    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. Hoe kan een niet-geclusterde index een kolom uitvoeren die niet in de index is opgenomen?

  2. Basistoestemming in Bugzilla om clients te scheiden

  3. Hoe LIMIT implementeren met SQL Server?

  4. MYSQL berekent een gemiddelde op een telling