sexta-feira, 12 de dezembro de 2014

Mostrando conexões ativas com o SQL AZURE usando SP_WHO3

Como a minha procedure de acompanhamento spWhoxp não funciona no SQL Azure, devido à ausência de sys.processes, eu decidi procurar uma nova maneira de procurar conexões ativas no servidor. Acabei encontrando uma nova versão do spWho, chamado spWho3, com base apenas em DMVs.

Como spWho3 originalmente refere-se a sys.processes, eu tive que fazer algumas mudanças. É o mesmo proc, mas com algumas linhas comentadas. Confira:

ALTER PROCEDURE [dbo].[Sp_who3] 
AS 
  BEGIN 
      SET TRANSACTION isolation level READ uncommitted 

      SELECT SPID = er.session_id, 
             --,BlkBy              = CASE WHEN lead_blocker = 1 THEN -1 ELSE er.blocking_session_id END,  
             ElapsedMS = er.total_elapsed_time, 
             CPU = er.cpu_time, 
             IOReads = er.logical_reads + er.reads, 
             IOWrites = er.writes, 
             Executions = ec.execution_count, 
             CommandType = er.command, 
             LastWaitType = er.last_wait_type, 
             ObjectName = Object_schema_name(qt.objectid, dbid) + '.' 
                          + Object_name(qt.objectid, qt.dbid), 
             SQLStatement = Substring (qt.text, er.statement_start_offset / 2, ( 
                            CASE 
                            WHEN 
                            er.statement_end_offset = -1 THEN 
                            Len 
                            ( 
                                           CONVERT(NVARCHAR(max), qt.text)) * 
                            2 
                            ELSE 
                            er.statement_end_offset 
                            END - 
                            er.statement_start_offset ) / 2), 
             STATUS = ses.status, 
             [Login] = ses.login_name, 
             Host = ses.host_name, 
             DBName = Db_name(er.database_id), 
             StartTime = er.start_time, 
             Protocol = con.net_transport, 
             transaction_isolation = CASE ses.transaction_isolation_level 
                                       WHEN 0 THEN 'Unspecified' 
                                       WHEN 1 THEN 'Read Uncommitted' 
                                       WHEN 2 THEN 'Read Committed' 
                                       WHEN 3 THEN 'Repeatable' 
                                       WHEN 4 THEN 'Serializable' 
                                       WHEN 5 THEN 'Snapshot' 
                                     END, 
             ConnectionWrites = con.num_writes, 
             ConnectionReads = con.num_reads, 
             ClientAddress = con.client_net_address, 
             Authentication = con.auth_scheme, 
             DatetimeSnapshot = Getdate(), 
             plan_handle = er.plan_handle 
      FROM   sys.dm_exec_requests er 
             LEFT JOIN sys.dm_exec_sessions ses 
                    ON ses.session_id = er.session_id 
             LEFT JOIN sys.dm_exec_connections con 
                    ON con.session_id = ses.session_id 
             OUTER apply sys.Dm_exec_sql_text(er.sql_handle) AS qt 
             OUTER apply (SELECT execution_count = Max(cp.usecounts) 
                          FROM   sys.dm_exec_cached_plans cp 
                          WHERE  cp.plan_handle = er.plan_handle) ec 
      /*OUTER APPLY
      (
        SELECT
          lead_blocker = 1
        FROM master.dbo.sysprocesses sp
        WHERE sp.spid IN (SELECT blocked FROM master.dbo.sysprocesses)
        AND sp.blocked = 0
        AND sp.spid = er.session_id
      ) lb*/
 
      WHERE  er.sql_handle IS NOT NULL 
             AND er.session_id != @@SPID 
      ORDER  BY 
      --CASE WHEN lead_blocker = 1 THEN -1 * 1000 ELSE -er.blocking_session_id END,  
      er.blocking_session_id DESC, 
      er.logical_reads + er.reads DESC, 
      er.session_id 
  END 


A versão original está aqui.

Check out my new book on MariaDB http://www.amazon.com/dp/B00MQC06HC

Nenhum comentário:

Postar um comentário

Leave your comment here!