sql >> Base de Datos >  >> RDS >> Sqlserver

Tempdb completo al consultar un recuento distinto de todas las tablas

Siempre debe considerar la contención antes de agregar el archivo TempDb. Agregar 7 archivos TempDb adicionales realmente no ayudará.

No, no debería. Pero, ¿está seguro de que no está tratando con una gran cantidad de datos o no tiene otro proceso ejecutándose en SQL? Los cursores, las tablas temporales e incluso las variables de tabla usan TempDb de forma extensiva. Compruebe qué objeto está consumiendo más espacio 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

Por lo tanto, si su usuario y los objetos internos son más, significa claramente que tiene poco espacio en TempDb debido a los cursores y al uso interno de SQL Server (por ejemplo, tablas intermedias, uniones hash, agregación hash, etc.)

Puede usar el siguiente código para obtener el recuento de todas las tablas en todas las bases de datos

  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

He escrito un artículo sobre TempDb recomendación ; Le sugiero que lea eso para comprender los objetos que pueden afectar a TempDb y cómo resolver problemas comunes. Idealmente, su tamaño total de TempDb debe calcularse en función de la observación que, en su caso,> 24 GB.

** Editar 1**

Si no está seguro acerca de la actualización de las estadísticas, use la siguiente consulta para obtener el recuento de todas las tablas. Nota:Reemplace las bases de datos para las que no desea estadí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

De manera similar, puede diferenciarse en todas las tablas para todas las bases de datos con la siguiente consulta

    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