Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Tempdb пълен при заявка за различен брой на всички таблици

Винаги трябва да обмисляте спорове, преди да добавите TempDb файл. Добавянето на 7 допълнителни файла TempDb наистина няма да помогне.

Не, не трябва. Но сигурни ли сте, че не работите с голямо количество данни или нямате друг процес, работещ на SQL? Курсорите, временните таблици и дори променливите на таблицата използват широко TempDb. Проверете кой обект заема повече място в 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

Така че, ако вашите потребителски и вътрешни обекти са повече, това ясно означава, че имате малко TempDb пространство поради курсори и вътрешно използване на SQL Server (Напр.:междинни таблици, хеш-съединения, хеш-агрегиране и т.н.)

Можете да използвате кода по-долу, за да получите броя на всички таблици във всички бази данни

  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

Написах статия за TempDb препоръка ; Бих ви предложил да прочетете това, за да разберете обектите, които могат да повлияят на TempDb и как да разрешите често срещани проблеми с него. В идеалния случай вашият общ размер на TempDb трябва да бъде изчислен въз основа на наблюдение, което във вашия случай е> 24 GB.

** Редактиране 1**

Ако не сте сигурни относно актуализацията на статистиката, използвайте заявката по-долу, за да получите броя на всички таблици. Забележка:Заменете базите данни, за които не искате статистика

    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

по подобен начин можете да вземете различен във всички таблици за всички бази данни с по-долу заявка

    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL код за изтегляне на файл от FTP

  2. Използване на Like на параметърна променлива?

  3. DATEDIFF() връща грешни резултати в SQL Server? Прочети това.

  4. Как да създадете множество едно към едно

  5. Кръстосана заявка с динамични колони в SQL Server 2008