Crônica Corporativa - O Militar e o telefone.

            Há muito tempo atrás estava jogando conversa fora com um amigo cujo pai era militar. Ele me contava que achava muito estranho o jeito que o pai dele atendia ao telefone quando estava em serviço. A conversa era seca e sem rodeios, ele já atendia falando o próprio nome, pulava todos os “bons dias” e “como vais” tão comuns em nosso dia-a-dia e após responder perguntas desligava às vezes sem nem dizer um tchau.

A princípio quando você se depara com uma situação assim, a primeira impressão é de que você está falando com uma pessoa bem mal–educada, mas se analisarmos com quem estamos falando, não daria para esperar outra coisa.

Vendo um exército como uma corporação, é logico esperar que a cultura organizacional seja baseada em um espirito de combate. Em um combate, o telefone não é um canal para conversar e fazer amizades, ele é um meio de comunicação e na guerra comunicação é recurso. E recurso, principalmente em situações extremas, deve ser usado com economia e eficiência. Identifique-se, passe a mensagem, libere o canal. Sem desperdício, sem perda de tempo.

Da mesma maneira funciona o combate real, o caso extremo, os soldados estão atirando uns nos outros e se você é um cabo com meia dúzia de soldados ao seu comando e vê o inimigo sorrateiramente se aproximando, você não vai virar para um deles e dizer:

- Com licença soldado?

- Pois não senhor. - responderia o soldado solícito.

- Como está tudo bem? – você perguntará com um sorriso.

- Tudo ótimo, senhor, obrigado por perguntar. Em que posso ser útil?

- Soldado, você poderia, por favor, atirar naquele soldado inimigo que está chegando para nos matar.

E o soldado não responderia, pois ele já estaria morto. E provavelmente você também.



Muito disso acontece no nosso mundo corporativo. Não estamos em guerra, mas estamos o tempo todo competindo com outras organizações. E isso é levado muito a sério, pois se a organização perde a competição, nós perdemos nosso emprego e com ele nosso sustento, ou seja, não é a morte, mas é bem ruim.

E quando pensa especificamente no universo da TI, com seus servidores de missão crítica, alta disponibilidade, milhares de usuários e milhões de transações e isso tudo parado dependendo da sua habilidade para corrigir um bug inesperado já dá pra sentir um calafrio na espinha e o corpo se preparando para uma briga do tipo “faca nos dentes”.

E é nessas horas, quando o circo pega fogo, que vejo algumas pessoas se melindrando porque o chefe falou mais alto, porque o e-mail veio sem assinatura ou bom dia, porque o colega pediu sem falar “por favor”.

Vamos lá né amigo! Agora estamos na guerra cara! Graças a deus não é assim todo dia e logo que a coisa esfriar, o servidor subir e o ultimo soldado inimigo estiver morto e enterrado, eu volto a sorrir e te darei todos os “por favor”, “meu caro”  e “se não for muito incomodo” que você quiser, mas enquanto isso não chega:



- ATIRA CARA!!! ATIRA NELE!!! ATIIIIRAAAAAAA!!!!



Atenciosamente,

Felipe Antunes

T-SQL Tips - Agendando um Trace com SQL Profiler

/*
      Olá amigos!

      Esse post é bem simples. Uma receita de bolo para voce agendar a execução do seu SQL Server Profiler e retornar isso depois em uma consulta T-SQL. Ótimo para relatórios de Performance e analise de problemas.

      Então mãos a obra!

-- ## PASSO 1 - Criar o Script Tracer Definition.

      O Script Tracer Definition é um arquivo .SQL que contém todas as regras sobre o que será capturado, quanto tempo e quais critérios de filtro. Como ele é bem extenso e pouco intuitivo para ser feito na mão, o primeiro passo é utilizar o SQL Profiler para fazer o trabalho para você.


1 - Abra o SQL Profiler, crie um novo Trace.

     

2 - Selecione a checkbox SaveToFile e escolha um diretório na sua máquina para armazenarmos o resultado.

     

      Obs: Esse diretório na verdade deve ser um diretório do servidor onde voce executará o Job. Mas é possivel alterarmos essa configuração depois.

      Obs2: A opção SaveToTable não é possivel no job agendado (Checar)

3 - Selecione a checkbox "Enable Trace Stop Time". Isso dirá ao Profiler que hora ele deve parar de processar o trace.

      No meu exemplo, quero que o profiler rode das 09:00 até as 11:00.

     

      Obs: A configuração de Start fica por conta do schedule do job como veremos adiante.

4 - Configure os eventos que voce deseja. Em geral eu capturo as StoreProcedures e Batchs T-SQL que finalizaram.

     

     

5 - Clique em Run e na sequencia para a captura. Vá File/Export/Script Trace Definition/ For SQL Server 2005-2008

     

     

6 - Abra o Script no SQL Management Studio. Abaixo o script que foi gerado. Fiz comentários grifados em cada ponto importante.
    
*/
     

/****************************************************/

/* Created by: SQL Server 2008 Profiler             */

/* Date: 16/09/2011  17:52:36         */

/****************************************************/

-- Create a Queue

declare @rc int

declare @TraceID int

declare @maxfilesize bigint

declare @DateTime datetime

set @DateTime = '2011-09-19 11:00:00.000' --<< Aqui é o Stop Time que definimos.

set @maxfilesize = --<<---- Aqui é o tamanho maximo do arquivo TRC em Mb.


-- Please replace the text InsertFileNameHere, with an appropriate

-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension

-- will be appended to the filename automatically. If you are writing from

-- remote server to local drive, please use UNC path and make sure server has

-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, N'F:\Traces\Trace_Agendado', @maxfilesize, @Datetime

/*<<-- Onde está em amarelo voce coloca o diretório do servidor e nome do arquivo desejado (sem o .trc) .>> */

if (@rc != 0) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit

set @on = 1

exec sp_trace_setevent @TraceID, 10, 15, @on

exec sp_trace_setevent @TraceID, 10, 16, @on

exec sp_trace_setevent @TraceID, 10, 1, @on

exec sp_trace_setevent @TraceID, 10, 9, @on

exec sp_trace_setevent @TraceID, 10, 17, @on

exec sp_trace_setevent @TraceID, 10, 10, @on

exec sp_trace_setevent @TraceID, 10, 18, @on

exec sp_trace_setevent @TraceID, 10, 11, @on

exec sp_trace_setevent @TraceID, 10, 12, @on

exec sp_trace_setevent @TraceID, 10, 13, @on

exec sp_trace_setevent @TraceID, 10, 6, @on

exec sp_trace_setevent @TraceID, 10, 14, @on

exec sp_trace_setevent @TraceID, 12, 15, @on

exec sp_trace_setevent @TraceID, 12, 16, @on

exec sp_trace_setevent @TraceID, 12, 1, @on

exec sp_trace_setevent @TraceID, 12, 9, @on

exec sp_trace_setevent @TraceID, 12, 17, @on

exec sp_trace_setevent @TraceID, 12, 6, @on

exec sp_trace_setevent @TraceID, 12, 10, @on

exec sp_trace_setevent @TraceID, 12, 14, @on

exec sp_trace_setevent @TraceID, 12, 18, @on

exec sp_trace_setevent @TraceID, 12, 11, @on

exec sp_trace_setevent @TraceID, 12, 12, @on

exec sp_trace_setevent @TraceID, 12, 13, @on

-- Set the Filters

declare @intfilter int

declare @bigintfilter bigint



exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - c16c42f1-c66c-4152-8fc1-d92a44fef880'

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - fd8af8d3-5b18-49b2-93d4-048a74902059'

-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1



-- display trace id for future references
select TraceID=@TraceID

-- Loop para aguardar a conclusão do job

DECLARE @Running int = 1

WHILE @Running = 1
     BEGIN
            WAITFOR DELAY '00:01:00'

            IF EXISTS(SELECT * FROM sys.traces WHERE ID = @TraceID)

                  SET @Running = 1
            else
                  SET @Running = 0 
      END


goto finish

error:
select ErrorCode=@rc

finish:
go


--################ FIM DO SCRIPT ##############################

-- OBSERVAÇAO: Voce pode fazer um teste do script no próprio SSMS. É só executar -- o script, se ele foi bem sucessido ele retorna um TraceID que pode ser
-- consultado na tabela sys.trace

/*

-- ## PASSO 2 - Criação de Job.

Vamos criar um Job com dois passos

      1 - No primeiro será o da execução do trace.

     

      2 - Vamos acrescentar um pequeno loop T-SQL que checa se o Trace conclui logo depois do "select TraceID=@TraceID". Veja abaixo.

*/

(…)

      select TraceID=@TraceID
   

      DECLARE @Running int = 1

      WHILE @Running = 1

            BEGIN

                  WAITFOR DELAY '00:01:00'

                  IF EXISTS(SELECT * FROM sys.traces WHERE ID = @TraceID)

                        SET @Running = 1

                  else

                        SET @Running = 0 

            END

(…)

/*   

      3 - O segundo passo é colocar o conteudo do trace em uma tabela usando a function fn_trace_gettable

*/   

      SELECT TextData, CPU,Reads,Writes,Duration
      into SuaBaseDeDados.dbo.SuaTabela
       -- Coloque acima a base e tabela de sua referencia
      FROM fn_trace_gettable ( N'F:\Traces\Trace_Agendado.trc' , DEFAULT )


     


--    4 - E pronto só agendar o Job e brincar com sua tabelinha.

/*

## BEGIN BONUS ##

        Se voce chegou até aqui é porque o assunto realmente te interessou. Existe um pequeno truque para você tornar o Stop Time dinamico.

       É bem simples e torna o job ainda mais versátil. Se quiser saber como faz, ou se voce descobriu como fazer me mande um email.

## END BONUS ##

      Gostou da dica? Achou algum bug? Tem alguma pergunta?? Fique a vontade para me contactar e comentar abaixo!

      email: fjantunes@gmail.com

      E Muito Obrigado pela visita!

*/