Précédent   Forum du club des développeurs et IT Pro > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/12/2012, 15h37   #1
Sergejack
Membre émérite
 
Inscription : juillet 2006
Messages : 1 331
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 331
Points : 887
Points : 887
Par défaut Connaître les performances de plusieurs instructions ?

Bonjour,

J'essaie de voir dans une série de batchs (GO) quelles sont les performances de certaines parties de ces batchs.
Mais je ne trouve pas comment détecter une série de query et en tirer des statistiques.

J'ai essayé comme suit, mais ça ne fonctionne pas vraiment :
(déjà quand j’exécute plusieurs fois, les information de l'essaie précédent se cumulent XD)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
DECLARE @I INT
DECLARE @D DATETIME
 
SET @I = 0
SET @D = GETDATE()
/* Ce que je veux mesurer [... */
WHILE @I < 10
BEGIN
	<faire quelque chose>
 
	SET @I = @I + 1
END	
/* ...] */
 
SELECT
	T.text
	, COUNT(*)
	, SUM(S.total_logical_reads)
	, SUM(S.total_logical_writes)
	, SUM(total_physical_reads)
	, DATEDIFF(ms, @D, GETDATE())
FROM sys.dm_exec_requests AS R
INNER JOIN sys.dm_exec_query_stats AS S ON (
	S.sql_handle = R.sql_handle
)
CROSS APPLY sys.dm_exec_sql_text(S.sql_handle) AS T
WHERE R.session_id = @@SPID
AND S.last_execution_time BETWEEN @D AND GETDATE()
GROUP BY T.text
Je dois bien avouer être hyper novice dans l'emploie de ces tables (qui ne sont peut-être pas celles qu'il me faut).
__________________
Où est votre sens de l'humour ?
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h04   #2
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
Bonjour,

pour faire ce que tu veux faire (je pense), j'ai créé un job qui exécute cette requête (ou presque) toutes les 30 Secondes, et qui stocke le résultat dans une table

je regarde ensuite les requêtes qui sont passées.

tu as une autre solution qui consiste a lancer la trace et lire le résultat grace aux fonctions du type sys.fn_trace_gettable => attention MS dit de ne plus les utiliser car a près Denali elle ne seront plus supportées, il faudra utiliser les évènements étendus
__________________
Errare humanum est, perseverare diabolicum (Sénèque)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 09h24   #3
Sergejack
Membre émérite
 
Inscription : juillet 2006
Messages : 1 331
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 331
Points : 887
Points : 887
Citation:
Envoyé par serge0934 Voir le message
Bonjour,

pour faire ce que tu veux faire (je pense), j'ai créé un job qui exécute cette requête (ou presque) toutes les 30 Secondes, et qui stocke le résultat dans une table
Quels résultats plus précisément ?

Citation:
Envoyé par serge0934 Voir le message
je regarde ensuite les requêtes qui sont passées.

tu as une autre solution qui consiste a lancer la trace et lire le résultat grace aux fonctions du type sys.fn_trace_gettable => attention MS dit de ne plus les utiliser car a près Denali elle ne seront plus supportées, il faudra utiliser les évènements étendus
Auriez-vous un bout de code pour illustrer cela ?
__________________
Où est votre sens de l'humour ?
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 09h54   #4
serge0934
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 715
Points : 912
Points : 912
voilou...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
CREATE TABLE [dbo].[QUERY_FOLLOW](
	[QFO_I_ID] [int] IDENTITY(1,1) NOT NULL,
	[QFO_I_SPID] [int] NULL,
	[QFO_C_LOGINNAME] [varchar](128) NULL,
	[QFO_I_BLOCKED] [int] NULL,
	[QFO_I_CPU] [int] NULL,
	[QFO_I_PHYSICAL_IO] [int] NULL,
	[QFO_D_last_request_start_time] [datetime] NULL,
	[QFO_C_LAUNCHED] [varchar](128) NULL,
	[QFO_C_HOSTNAME] [varchar](128) NULL,
	[QFO_C_STATUS] [varchar](128) NULL,
	[QFO_C_Command] [varchar](128) NULL,
	[QFO_C_DB] [varchar](128) NULL,
	[QFO_C_PROGRAMNAME] [varchar](128) NULL,
	[QFO_L_QUERY] [varchar](8000) NULL,
	[QFO_D_CREATE] [datetime] NOT NULL DEFAULT GETDATE(),
 CONSTRAINT [PK_QUERY_FOLLOW] PRIMARY KEY CLUSTERED 
(
	[QFO_I_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
 
CREATE PROCEDURE [dbo].[GET_QUERY_FOLLOW]
AS
BEGIN
INSERT INTO QUERY_FOLLOW
(QFO_I_SPID,QFO_C_LOGINNAME,QFO_I_BLOCKED,QFO_I_CPU,QFO_I_PHYSICAL_IO,QFO_D_last_request_start_time,QFO_C_LAUNCHED
,QFO_C_HOSTNAME,QFO_C_STATUS,QFO_C_Command,QFO_C_DB,QFO_C_PROGRAMNAME,QFO_L_QUERY)
SELECT
        PROCESS.SPID,
        CONVERT(SYSNAME, RTRIM(PROCESS.LOGINAME)) LOGINNAME,
        PROCESS.BLOCKED,
        PROCESS.CPU,
        PROCESS.PHYSICAL_IO,
        SESSION.last_request_start_time,
        CASE(CONVERT(VARCHAR, DATEDIFF(second, SESSION.last_request_start_time, GETDATE())/3600) + 'h ')
                WHEN '0h' THEN ''
                ELSE CONVERT(VARCHAR, DATEDIFF(second , SESSION.last_request_start_time, GETDATE())/3600) + 'h '
        END +
        CASE(CONVERT(VARCHAR, DATEDIFF(second, SESSION.last_request_start_time, GETDATE())/60%60) + 'min ')
                        WHEN '0min' THEN ''
                        ELSE CONVERT(VARCHAR, DATEDIFF(second, SESSION.last_request_start_time, GETDATE())/60%60) + 'min '
 
        END +
        CONVERT(VARCHAR, DATEDIFF(second, SESSION.last_request_start_time, GETDATE())%60) + 's' AS LAUNCHED,
        PROCESS.HOSTNAME,
        UPPER(PROCESS.STATUS) STATUS,
        UPPER(PROCESS.CMD) Command,
        DB_NAME(PROCESS.DBID) DB,
        CASE SUBSTRING(PROCESS.PROGRAM_NAME, 1, 38)
                WHEN 'Microsoft SQL Server Management Studio' THEN 'SSMS Query'
                ELSE PROCESS.PROGRAM_NAME
        END PROGRAM_NAME,
        CONVERT(VARCHAR(8000), ST.text) SQL
FROM sys.sysprocesses (nolock) PROCESS
JOIN sys.dm_exec_sessions SESSION (nolock) ON PROCESS.spid = SESSION.session_id
CROSS APPLY sys.dm_exec_sql_text(PROCESS.sql_handle) ST
WHERE SPID > 50
AND SPID != @@SPID
AND CMD != 'AWAITING COMMAND'
AND PROCESS.PROGRAM_NAME NOT LIKE 'DatabaseMail90%'
ORDER BY PROCESS.SPID
END;
 
 
CREATE VIEW [dbo].[VIEW_CPU_QUERY_FOLLOW]
AS
SELECT   
QFO_I_SPID,QFO_C_LOGINNAME,QFO_I_BLOCKED,MAX(QFO_I_CPU) AS conso_cpu,QFO_D_last_request_start_time AS debut,MAX(QFO_D_CREATE) AS fin
,QFO_C_HOSTNAME,QFO_C_STATUS,QFO_C_Command,QFO_C_DB,QFO_C_PROGRAMNAME,QFO_L_QUERY
FROM QUERY_FOLLOW		
GROUP BY				 
QFO_I_SPID,QFO_C_LOGINNAME,QFO_I_BLOCKED,QFO_D_last_request_start_time
,QFO_C_HOSTNAME,QFO_C_STATUS,QFO_C_Command,QFO_C_DB,QFO_C_PROGRAMNAME,QFO_L_QUERY
__________________
Errare humanum est, perseverare diabolicum (Sénèque)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h17.


 
 
 
 
Partenaires

Hébergement Web