Mostrando postagens com marcador Tips. Mostrar todas as postagens
Mostrando postagens com marcador Tips. Mostrar todas as postagens

T-SQL Fast Tips - Qual foi o último boot do servidor SQL?


/*

      Senhores, Senhoras e Senhoritas DBAs!!!


      Essa é dica rápida e descaradamente copiada de Adeilson Brito (blog) !


      Como identificar qual foi o ultimo Boot do seu servidor??

      Na SQL 2008 em diante sua vida foi simplificada com a dm sys.dm_os_sys_info



/*



SELECT

      sqlserver_start_time  Iniciou_Em

FROM

      sys.dm_os_sys_info



/*

      No post do sr. Brito, você pode checar o método para fazer o mesmo na versão 2000, veja o link!

      Abraços!!!


*/

T-SQL Tips - Checar existência de Tabela Temporária!

/*

Senhores,


      Como faz meses que não coloco algo novo no blog, vou oferecer para vocês uma dica bem rápida.
    

      Como checar a existencia de uma tabela temporária!!!
    

      Achava que era impossivel ou extremamente complexo. Mas na verdade é bem simples!!
    

*/   


      CREATE TABLE #MeuTesteTemporario (Coluna1 int, Coluna2 varchar(100))

    

-- E aqui está o pulo do gato!! 
-- Ao invés de um EXISTS na sys.objects, use a função OBJECT_ID   

      IF OBJECT_ID('TempDb.dbo.#MeuTesteTemporario') IS NOT NULL

            DROP TABLE #MeuTesteTemporario


/*

      Simples, fácil, descomplicado!
    

      Obrigado Simon Sabin!

           

*/   

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!

*/

T-SQL Tips - Convertendo linhas em colunas com o operador PIVOT

/* Olá Caros Amigos dos Dados!

      Mais um operador interessante que deveria estar na ToolBox de todo DBA/Desenvolvedor SQL Server. O Operador PIVOT.

      Disponivel a partir da versão 2005/2008 para converter linhas em colunas (e vice versa), o Pivot é um só um pouco dificil de entender, mas depois que voce
pega o jeito percebe que é bem facil e eficiente nas suas consultas.

      Então mãos a obra!
 

      Em uma base de dados de um sistema de e-commerce, temos a tabela Fluxo_Pedido que armazena as datas em que cada processo de um pedido foi realizado conforme Figura 1 
*/


/*
      Nosso cliente deseja a seguinte visualização dessa informação
*/



/* Agora dê uma olhada na syntax padrão do operador PIVOT */


SELECT <Coluna non-pivoted >,

    [Primeira coluna pivoted] AS <alias da coluna>,
    [Segunda coluna pivoted] AS <alias da coluna>,
    ...
    [Ultima coluna pivoted] AS <alias da coluna>
FROM
    (<Consulta fonte>)  AS <alias da consulta fonte>

PIVOT --<< AQUI ESTÁ O OPERADOR!

(
    <Valor agregado>
FOR
    [Coluna do cabeçalho]
    IN (
        [Primeira coluna pivoted],
        [Segunda coluna pivoted]...
        [Ultima coluna pivoted]
       )
) AS <alias da tabela pivot>


/*
  Agora dando nomes ao bois!

  A coluna non pivoted é a coluna que agrupa as linhas. No nosso caso é o Numero do Pedido, pois teremos uma linha para cada pedido

As colunas pivoted são os valores que passarão a ser colunas da tabela.Aqui colocamos a coluna Etapa e criaremos uma coluna para cada etapa (Solicitacao, Pagamento, Transportadora,Finalizacao)

  Veja como ficou:
*/ 

SELECT
     NumeroPedido,
    [Solicitação],
    [Pagamento],
    [Transportadora],
    [Finalizacao]
FROM
    (<Consulta fonte>)  AS <alias da consulta fonte>
PIVOT
(
    <Valor agregado>
FOR
    [Coluna do cabeçalho]
    IN (
         [Primeira coluna pivoted],
         [Segunda coluna pivoted]
         ...
         [Ultima coluna pivoted])
) AS <alias da tabela pivot>

 /*
      Nossa consulta fonte é um SELECT dos dados da tabela Fluxo_Pedido.

      Devemos incluir no select a coluna non-pivoted, a coluna que possui os valores pivoted e o campo que será exibido nas células (DataEtapa)

      ou seja:

      SELECT NumeroPedido,Etapa  ,DataEtapa  FROM Fluxo_Pedido
*/   

           

SELECT
      NumeroPedido,
    [Solicitação],
    [Pagamento],
    [Transportadora],
    [Finalizacao]
FROM
    (SELECT NumeroPedido,Etapa  ,DataEtapa  FROM Fluxo_Pedido)  AS Consulta_Fonte

PIVOT
(
    <Valor agregado>
FOR
    [Coluna do cabeçalho]
    IN (
        [Primeira coluna pivoted],
        [Segunda coluna pivoted]
        ...
        [Ultima coluna pivoted]
       )
) AS <alias da tabela pivot>


/*
      E por fim vamos dar os parametros do operador PIVOT.

      O valor agregado deve ser uma função de agrupamento (MAX(), MIN(),COUNT(),etc...) e a coluna que vamos no nosso "miolo".

      Como vamos exibir a data em que foi executada cada etapa vamos usar MIN(DataEtapa)

      Após o FOR indicamos a coluna cabeçalho (Etapa) e repetimos as colunas pivoted.
*/

SELECT
    NumeroPedido,
    [Solicitação],
    [Pagamento],
    [Transportadora],
    [Finalizacao]
FROM
    (SELECT NumeroPedido,Etapa  ,DataEtapa  FROM Fluxo_Pedido)  AS Consulta_Fonte
PIVOT
(
   MAX(DataEtapa)
FOR
      Etapa
    IN (
        [Solicitação],
        [Pagamento],
        [Transportadora],
        [Finalizacao]
       )
) AS TabelaPivot
 

/* E pronto!! Temos uma PIVOT novinha em folha!

  Obrigado pela leitura e espero ter ajudado você em seu dia a dia

Comente abaixo, sugira na nossa caixinha de sugestõe e se tiver duvidas me mande um email: fjantunes@gmail.com.br

Abraços!
*/