Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Tempdb Full lors de l'interrogation du nombre distinct de toutes les tables

Vous devez toujours tenir compte des conflits avant d'ajouter le fichier TempDb. L'ajout de 7 fichiers TempDb supplémentaires n'aidera pas vraiment.

Non, ça ne devrait pas. Mais êtes-vous sûr que vous ne traitez pas une grande quantité de données ou que vous n'avez pas d'autre processus en cours d'exécution sur SQL ? Les curseurs, les tables temporaires et même les variables de table utilisent largement TempDb. Vérifiez quel objet consomme le plus d'espace 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

Donc, si votre utilisateur et vos objets internes sont plus nombreux, cela signifie clairement que vous avez peu d'espace TempDb en raison des curseurs et de l'utilisation interne de SQL Server (Ex :tables intermédiaires, jointures de hachage, agrégation de hachage, etc.)

Vous pouvez utiliser le code ci-dessous pour obtenir le nombre de toutes les tables dans toutes les bases de données

  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

J'ai écrit un article sur TempDb recommandation ; Je vous suggère de lire cela pour comprendre les objets qui peuvent affecter TempDb et comment résoudre les problèmes courants de celui-ci. Idéalement, votre taille totale de TempDb devrait être calculée sur la base d'une observation qui, dans votre cas,> 24 Go.

**Modifier 1**

Si vous n'êtes pas sûr de la mise à jour des statistiques, utilisez la requête ci-dessous pour obtenir le nombre de toutes les tablesRemarque :Remplacez les bases de données pour lesquelles vous ne souhaitez pas de statistiques

    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 même, vous pouvez prendre distinct dans toutes les tables pour toutes les bases de données avec la requête ci-dessous

    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