172 lines
7.0 KiB
Transact-SQL
172 lines
7.0 KiB
Transact-SQL
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
|
|
|
|
|