sql >> Databáze >  >> RDS >> Sqlserver

Tempdb Full při dotazování Rozdílný počet všech tabulek

Před přidáním souboru TempDb byste měli vždy zvážit spor. Přidání 7 dalších souborů TempDb opravdu nepomůže.

Ne, nemělo by. Jste si ale jisti, že nepracujete s velkým množstvím dat nebo vám na SQL neběží jiný proces? Kurzory, Temp tabulky a dokonce i proměnné tabulky používají TempDb značně. Zkontrolujte, který objekt spotřebovává více místa 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

Pokud je tedy vašich uživatelských a interních objektů více, pak to jasně znamená, že máte málo místa TempDb kvůli kurzorům a internímu použití SQL Serveru (např.:přechodné tabulky, spojení hash, agregace hash atd.)

Níže uvedený kód můžete použít k získání počtu všech tabulek ve všech databázích

  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

Napsal jsem článek na TempDb doporučení ; Navrhoval bych, abyste si to přečetli, abyste pochopili objekty, které mohou ovlivnit TempDb, a jak řešit jejich běžné problémy. V ideálním případě by se vaše celková velikost TempDb měla vypočítat na základě pozorování, které je ve vašem případě> 24 GB.

** Upravit 1**

Pokud si nejste jisti aktualizací statistik, použijte níže uvedený dotaz k získání počtu všech tabulek Poznámka:Nahradit databáze, pro které statistiky nechcete

    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

podobně můžete rozlišovat ve všech tabulkách pro všechny databáze pomocí níže uvedeného dotazu

    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. MySQL 5.7 &only_full_group_by

  2. Jaký je nejrychlejší způsob, jak aplikovat 150 milionů aktualizací na tabulku PostgreSQL

  3. PL/Perl posílejte poštu v Postgresql

  4. Sqlcmd pro generování souboru bez přerušované čáry pod záhlavím, bez počtu řádků