Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Tempdb completo ao consultar a contagem distinta de todas as tabelas


Você deve sempre considerar a contenção antes de adicionar o arquivo TempDb. Adicionar 7 arquivos TempDb adicionais não ajudará muito.

Não, não deveria. Mas você tem certeza que não está lidando com uma grande quantidade de dados ou não tem outro processo rodando no SQL? Cursores, tabelas temporárias e até variáveis ​​de tabela usam TempDb extensivamente. Verifique qual objeto está consumindo mais espaço 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

Portanto, se seu usuário e objetos internos forem mais, isso significa claramente que você tem pouco espaço TempDb por causa de cursores e uso interno do SQL Server (Ex:tabelas intermediárias, junções de hash, agregação de hash etc.)

Você pode usar o código abaixo para obter a contagem de todas as tabelas em todos os bancos de dados
  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

Escrevi um artigo sobre TempDb recomendação ; Eu sugiro que você leia isso para entender os objetos que podem afetar o TempDb e como resolver problemas comuns dele. Idealmente, o tamanho total do TempDb deve ser calculado com base na observação, que no seu caso> 24 GB.

**Editar 1**

Se você não tiver certeza sobre a atualização das estatísticas, use a consulta abaixo para obter a contagem de todas as tabelas Nota:Substitua os bancos de dados para os quais você não deseja estatísticas
    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

da mesma forma, você pode ter distintos em todas as tabelas para todos os bancos de dados com a consulta abaixo
    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