IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Connaître les performances de plusieurs instructions ?


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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).
    Most Valued Pas mvp

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    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)

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    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 ?
    Most Valued Pas mvp

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    voilou...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/03/2013, 13h15
  2. [Performances] Séparer les tables dans plusieurs bases ?
    Par Seb33300 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 29/09/2007, 19h55
  3. Réponses: 0
    Dernier message: 18/04/2006, 08h19
  4. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49
  5. Réponses: 5
    Dernier message: 06/03/2003, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo