USE [HCITools] GO /****** Object: StoredProcedure [dbo].[mon_Collect_Stats_SP] Script Date: 23.09.2020 14:15:00 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Stats_SP]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[mon_Collect_Stats_SP] GO /****** Object: StoredProcedure [dbo].[mon_Collect_Stats_SP] Script Date: 23.09.2020 14:15:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Stats_SP]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[mon_Collect_Stats_SP] AS' END GO ALTER PROCEDURE [dbo].[mon_Collect_Stats_SP] AS /*============================================================================= Explication du traitement realise par la SP ------------------------------------------- La SP va stocker l'ensemble des statistiques des procédures stockées contenues dans la DMV [sys].[dm_exec_procedure_stats] et créer un historique pour chaque redémarrage du serveur Contexte d'utilisation ---------------------- Appelé depuis le job D92030 - Collect Stats SP Creation : 23.09.20 / FLA Modifications : 17.03.2022 - FLA : Change DBA mail =============================================================================*/ set nocount on; /*------------------- Declaration des variables --------------------*/ declare @databaseID smallint, @databasename sysname, @restartdate datetime, @actualdate datetime, @sql nvarchar(4000), @messageError varchar (8000), @errno int, @errmsg varchar(255) /*------------ Affectation des parametres aux variables ------------*/ select @RestartDate = MIN(login_time) from sys.sysprocesses select @actualdate = GETDATE() select @errno = 0 SET @messageError = '' SET @errmsg = '' IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD') BEGIN /*-------------------------- Traitement ---------------------------*/ BEGIN TRY DECLARE c_databases CURSOR FAST_FORWARD FOR select database_id, name from sys.databases where database_id > 4 open c_databases FETCH NEXT FROM c_databases into @databaseID, @databasename /* On parcourt chaque base de données pour récuperer les informations des index */ WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY SET @sql = 'insert into dbo.Stats_SP (SS_schemaname,SS_databasename,SS_name,SS_type,SS_execution_count,SS_last_execution_time,SS_total_worker_time,SS_total_physical_reads,SS_total_logical_writes,SS_total_logical_reads,SS_total_elapsed_time,SS_updatedate,SS_restartdate) select OBJECT_SCHEMA_NAME(sp.object_id,'+ CAST(@databaseID AS nvarchar(4)) +'),'''+ @databasename +''',sp.name,sp.type_desc, null, null, null ,null ,null ,null, null, CAST('''+ CONVERT(nvarchar(30),@actualdate,126) +''' as datetime), CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime) from '+ @databasename +'.sys.procedures sp WHERE NOT EXISTS (select * from dbo.Stats_SP as SS where ISNULL(SS.SS_name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS = ISNULL(sp.name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS and SS.SS_databasename COLLATE SQL_Latin1_General_CP1_CI_AS = '''+ @databasename +''' COLLATE SQL_Latin1_General_CP1_CI_AS and SS.SS_schemaname COLLATE SQL_Latin1_General_CP1_CI_AS = OBJECT_SCHEMA_NAME(sp.object_id,'+ CAST(@databaseID AS nvarchar(4)) +') COLLATE SQL_Latin1_General_CP1_CI_AS and SS_updatedate > CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime))' EXEC(@sql) /* On met à jour les stats des SP dans la table dbo.Stats_SP */ SET @sql = N'UPDATE dbo.Stats_SP SET SS_execution_count = eps.execution_count, SS_last_execution_time = eps.last_execution_time, SS_total_worker_time = eps.total_worker_time, SS_total_physical_reads = eps.total_physical_reads, SS_total_logical_writes = eps.total_logical_writes, SS_total_logical_reads = eps.total_logical_reads, SS_total_elapsed_time = eps.total_elapsed_time, SS_updatedate = CAST('''+ CONVERT(nvarchar(30),@actualdate,126) +''' as datetime) FROM (SELECT sp.object_id,sp.name,SUM(eps.execution_count) execution_count, MAX(eps.last_execution_time) last_execution_time, SUM(eps.total_worker_time) total_worker_time, SUM(eps.total_physical_reads) total_physical_reads, SUM(eps.total_logical_writes) total_logical_writes, SUM(eps.total_logical_reads) total_logical_reads, SUM(eps.total_elapsed_time) total_elapsed_time FROM [sys].[dm_exec_procedure_stats] eps INNER JOIN '+ @databasename + '.sys.procedures sp ON sp.object_id = eps.object_id AND eps.database_id = '+ CAST(@databaseID AS nvarchar(4)) +' GROUP BY sp.object_id,sp.name) as eps WHERE ISNULL(SS_name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS = ISNULL(eps.name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS AND SS_databasename COLLATE SQL_Latin1_General_CP1_CI_AS = '''+ @databasename +''' COLLATE SQL_Latin1_General_CP1_CI_AS AND SS_schemaname COLLATE SQL_Latin1_General_CP1_CI_AS = OBJECT_SCHEMA_NAME(eps.object_id,'+ CAST(@databaseID AS nvarchar(4)) +') COLLATE SQL_Latin1_General_CP1_CI_AS AND SS_updatedate > CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime)' EXEC(@sql) END TRY BEGIN CATCH select @messageError = @messageError + 'Collect_Stats_SP failed : ' + @databasename + ' ' + ERROR_MESSAGE() + CHAR(13) SET @errno = @errno + 1 END CATCH FETCH NEXT FROM c_databases into @databaseID, @databasename END CLOSE c_databases DEALLOCATE c_databases /* S'il y a une erreur, on envoie un mail aux DBA */ IF @messageError <> '' BEGIN exec aps_Send_Mail_with_template @in_param_varchar_2 = 'DBA_operator;', @in_job_type = 3, /* 3 = warning */ @in_param_varchar_3 = @messageError RAISERROR ('Erreur dans la SP [dbo].[mon_Collect_Stats_SP]',16,1) END /*---------------------- Traitement des erreurs ----------------------*/ END TRY BEGIN CATCH /* Traitement des erreurs (avec RaiseError) */ EXEC dbo.get_Error_Info @in_RaiseError = 1 END CATCH END GO