Dica do Mês – Utilizando a Trace Flag 9292 para exibir objetos estatísticos úteis


 

Olá comunidade, boa tarde.

Tudo bem? Estamos se aproximando dos últimos dias de férias ou recesso para grande maioria dos professores e profissionais de educação espalhados por todo Brasil. E ai, já esta preparado para voltar a luta? Posso dizer tranquilamente que sim, eu estou pronto para voltar a conviver com meus alunos e amigos de trabalho.

Antes de começarmos a falar sobre o post de hoje, nada mais justo começar agradecendo como de costume a você está aqui neste momento acessando meu blog. Espero que possa ter encontrado o que precisa, bem como, esteja gostando do conteúdo publicado, fique a vontade para entrar em contato expressando suas opiniões e demais pensamentos.

Neste novo post da sessão Dica do Mês, vou apresentar um recurso que imagino ser conhecido por muitos ou principalmente pelos profissionais de banco de dados, estou me referindo as Trace Flag ou sinalizador de rastreamento em português.

Você já ouvir falar sobre isso ou já utilizou? Eu imagino que sim pois aqui no meu blog diversos posts e artigos foram publicado ao longo dos últimos anos sobre este tipo de recurso. Hoje mais especificamente vou destacar o uso da Trace Flag 9292, por acaso você já utilizou em algum momento esta trace flag?

Bom independente da sua reposta vamos conhecer um pouco mais sobre ela, sua forma de uso e como poderá nos ajudar a entender ainda mais o funcionamento das estatísticas e seus chamados objetos úteis para análise do plano de execução.

E ai esta curioso para saber um pouco sobre este recurso? Eu estou, sendo assim, vamos em frente, seja bem vindo ao post Dica do Mês – Utilizando a Trace Flag 9292 para exibir objetos estatísticos úteis.

Vamos em frente…..


Introdução

Todos sabemos que as estatísticas desempenham um papel muito importante dentro do SQL Server, como também, sabemos que as estatísticas são usadas pelo otimizador de consultas para gerar o plano de execução para cada consulta.
Então a questão é, podemos verificar qual objeto estatístico é útil para a execução da consulta? Sim, usando o Trace Flag do SQL Server 9292. Este é um do sinalizador de rastreamento que pode ser usado durante a solução de problemas.
Esse sinalizador de rastreamento é usado para obter o relatório sobre objetos de estatísticas considerados como “interessantes” ou “úteis” pelo otimizador de consulta durante a compilação ou recompilação de consulta.

Adicionada ao Microsoft SQL Server 2008 após a instalação do service pack 1 e mantida até as atuais versões, no momento em tomamos a decisão de utilizar a Trace Flag 9292, orientamos o SQL Server a apresentar todos os objetos estatísticos considerados úteis por parte do plano de execução para realizar o processamento e retorno dos dados.

O uso da Trace Flag 9292 dentro de uma sessão ou query específica, nos ajuda a entender e conhecer como as estatísticas e seus elementos podem mudar totalmente a maneira que o plano de execução é idealizado, armazenado e processado.

Através dela podemos obter um relatório sobre as estatíticas para cada objeto envolvido em nossa query, onde estes supostos objetos devem ser considerados úteis, ou melhor dizendo válidos e aplicáveis no decorrer do caminho realizado até a apresentação do resultado.

Esta é uma trace flag que pode ser usada durante a resolução de problemas, onde sua função é apresentar na guia de mensagens do Management Studio, um pequeno cabeçalho contendo informações estatísticas sobre cada componente útil e válido para formas os dados estatísticos de processamento da query. Este cabeçalho é conhecido como Stats header loaded.

Para ativar a trace flag utilize o comando DBCC TraceON (9292) ou DBCC TraceOFF (9292) para desativar, ou se preferir utilize a opção QueryTraceOn em sua respectiva query.

Agora que já conhecemos um pouco mais sobre os conceitos desta trace flag, chegou a hora de colocar as mãos no teclado e conhecer melhor o funcionamento da flag 9292 e de que forma ela poderá impactar o trabalho do Microsoft SQL Server, nos permitindo identificar os objetos úteis processados ou candidatos a processamento por parte do Query Processor em conjunto com Execution Plan.

Preparando o ambiente

Nosso ambiente será bastante simples, basicamente criaremos um banco de dados denominado DBTrace9292, constituído de uma tabela denominada TBTrace9292, para tal utilizaremos o Bloco de Código 1 que apresenta a criação dos respectivos objetos:

— Bloco de Código 1 —
— Criando o Banco de Dados DBTrace9292 —
Create Database DBTrace9292
Go

— Acessando —
Use DBTrace9292
Go

— Criando a Tabela TBTrace9292 —
Create Table TBTrace9292
(Codigo Int Identity(1,1) Primary Key,
Valores Int,
Descricao Varchar(100))
Go

Após a criação dos objetos básicos, nosso próximo passo será a criação de índice nonclustered para coluna Valores que nos permitirá fazer o uso de estatísticas de processamento para esta coluna durante o processo de inserção de dados, conforme apresenta o Bloco de Código 2 apresentado abaixo:

— Bloco de Código 2 —
— Criando o Índice NonClustered IND_TBTrace9292Valores —
Create NonClustered Index IND_TBTrace9292Valores on TBTrace9292(Valores)
Go

— Inserindo uma linha de registro na Tabela TBTrace9292 —
Insert Into TBTrace9292
Values(2000,’pedrogalvaojunior.wordpress.com’)
Go

— Inserindo 1.000 linhas de registros na Tabela TBTrace9292 —
Insert Into TBTrace9292
Values(4000,’pedrogalvaojunior.wordpress.com’)
Go 1000

Note que existir uma pequena mais importante diferença entre os dois Inserts, no primeiro estamos inserindo uma linha de registro na tabela TBTrace9292. No segundo criamos em tempo de execução um pequeno bloco de inserção de linhas, sendo este processado 1.000 vezes, inserindo então 1.000 linhas.

Seguindo em frente, o Bloco de Código 3 será utilizado para criarmos uma Stored Procedure denominada P_PesquisarValores como forma para buscar os respectivos registros armazenados na tabela TBTrace9292. A seguir apresento o Bloco de Código 3:

— Bloco de Código 3 –
— Criando a Stored Procedure P_PesquisarValores —
Create Procedure P_PesquisarValores @Valor int
As
Begin
Select Descricao from TBTrace9292
Where Valores = @Valor
OPTION (RECOMPILE)
End
Go

Se você for como eu, normalmente gosto de fazer uma análise de código antes de colocar em prática no meu ambiente, sendo assim, vamos lá. Analisando de forma superficial a Stored Procedure P_PesquisarValores a princípio não apresenta nada muito especial ou de grande complexidade em seu código, mas sim o uso de opção Recompile que justamente vai orientar o plano de execução a recompilar a  P_PesquisarValores no momento da sua execução, forçando assim que a cada execução um novo plano de execução seja criado em conjunto com uma nova análise estatística e seus demais elementos.

O próximo passo consiste na pesquisa de um dos valores armazenados na tabela TBTrace9292 através da execução e processamento da Stored Procedure P_PesquisarValores. Para este passo vamos utilizar o Bloco de Código 4 a seguir, antes de sua execução recomendo habilitar a apresentação do Plano de Execução Atual no SQL Server Management Studio através do botão Include Actual Execution Plan ou simplesmente através da tecla de atalho CTRL+M.

— Bloco de Código 4 —
— Habilitando as TraceFlags 9292 e 3604 —
DBCC TraceOn(9292,3604,-1)
Go

Dica: Utilize o comando DBCC TraceStatus WITH NO_INFOMSGS para verificar quais Trace Flags estão habilitadas em qual nível de escopo.

— Execuntando a Stored Procedure P_PesquisarValores —
Exec P_PesquisarValores 4000
Go

Pois bem, após a execução do Bloco de Código 4, o Microsoft SQL Server realizou o processamento da nossa Stored Procedure P_PesquisarValores realizando uma busca de todas as linhas de registros que possuem o valor 4.000, onde obrigatoriamente foram retornadas 1.000 linhas de registros.

Até ai nada de novo ou surpreende, o que justamente eu quero mostrar para vocês é o que o Management Studio apresenta na guia Messages após o processamento do Bloco de Código 4, conforme apresenta a Figura 1 abaixo:

Note que o cabeçalho retornado pela Trace Flag 9292 conhecido como Stats header loaded esta apresentando os objetos realmente utilizados para o processamento de nossa query, bem como, os objetos considerados úteis e necessários para criação, compilação e processamento do plano de execução envolvidos na execução, sendo eles:

  • Database: DBTrace9292;
  • Table: TBTrace9292,
  • Index: IND_TBTrace9292Valores, sendo este do tipo Nonclustered;
  • Column: Valores; e
  • EmptyTable: False, representa que a tabela possui linhas de registro.

Perfeito, perfeito, ai esta a prova que a Trace Flag 9292 nos permite identificar de forma simples, coerente e muito intuitiva todos os objetos envolvidos na execução de uma query, stored procedure ou demais elementos que permitem a criação de um plano de execução.

Desta forma, chegamos ao final de mais um post, tendo a sensação de dever cumprido, espero que você tenha gostado, como sempre o Microsoft SQL Server nos surpreende com a sua capacidade e potencialidade de recursos.


Referências

https://thomaslarock.com/2016/06/sql-server-Trace-flags/

https://pedrogalvaojunior.wordpress.com/2016/02/26/02-para-que-serve/

DBCC TRACEOFF (Transact-SQL)

DBCC TRACEON (Transact-SQL)

DBCC TRACESTATUS (Transact-SQL)

EXECUTE (Transact-SQL)

Query Hints (Transact-SQL)

Post Anteriores

https://pedrogalvaojunior.wordpress.com/2017/05/23/conhecendo-e-aplicando-o-uso-de-atualizacao-de-estatisticas-incrementais/

https://pedrogalvaojunior.wordpress.com/2017/04/13/dica-do-mes-microsoft-sql-server-identificando-as-transacoes-que-estao-utilizando-o-transact-log/

https://pedrogalvaojunior.wordpress.com/2017/03/01/dica-do-mes-microsoft-sql-server-2016-sp1-novo-argumento-use-hint-disponivel-para-query-hints/

https://pedrogalvaojunior.wordpress.com/2017/01/16/dica-do-mes-conhecendo-a-nova-dmf-sys-dm_exec_input_buffer-no-microsoft-sql-server-2016/

https://pedrogalvaojunior.wordpress.com/2016/11/28/dica-do-mes-sql-server-2016-sp1-comando-create-or-alter/

https://pedrogalvaojunior.wordpress.com/2016/10/24/dica-do-mes-sql-server-2016-obtendo-informacoes-sobre-o-cache-de-execucao-de-funcoes/

Conclusão

Muitas vezes temos dificuldade em entender como um determinado recurso ou funcionalidade esta sendo utilizada pelo Microsoft SQL Server, com também, de que maneira este elemento poderá impactar nosso ambiente.

Neste post foi possível apresentar como a Trace Flag 9292 nos permite identificar quais objetos estão sendo utilizando durante o processamento e execução de uma determinada query. Um recurso de fácil configuração tanto para ser ativado como também desativado a qualquer momento ou necessidade.

Recomendo que você realize diversos testes e validações antes de fazer qualquer tipo de uso de uma trace flag em seu ambiente de produção, isso também se aplica a Trace Flag 9292.

Agradecimentos

Mais uma vez obrigado por sua visita, agradeço sua atenção, fique a vontade para enviar suas críticas, sugestões, observações e comentários.

Um forte abraço, nos encontramos em breve com mais um post da sessão Dica do Mês.

Valeu….

Dica do Mês – SQL Server 2016 SP1 – Comando Create Or Alter


Muito bom dia…..

Olá pessoal, mais uma semana começando. Estou retornando com mais um post dedicado a sessão Dica do Mês, este é o post de número 11 dedicado de forma exclusiva a esta sessão.

Como você já deve ter observado desde o mês de outubro todos os posts das sessões: Dicas do Mês, Para que Serve, Short Scripts e Material de Apoio estão apresentado o mesmo layout, sendo esta uma das sugestões que os meus seguidores solicitaram, e hoje não será diferente.

A dica de hoje é bastante simples e esta totalmente relacionada a uma novidade apresentanda com o lançamento do Service Pack 1 do Microsoft SQL Server 2016.

E ai você já esta se informando sobre este novo service pack? Já realizou o download? Posso lhe dizer que diversas melhorias foram implementas, bem como, muitas mas muitas mudanças identificadas pela equipe de desenvolvimento da Microsoft foram realizadas.

Se quiser saber mais sobre este novo conjunto de atualizações e melhorias dedicadas para o Microsoft SQL Server 2016, acesses os links abaixo:

 

Voltando ao post de hoje, vamos em frente, seja bem vindo a mais um Dica do Mês!!!


Introdução

A cada nova versão do Microsoft SQL Server que a Microsoft libera ou até mesmo após um service pack ou cummulative pack disponibilizados para download, sempre fazemos aquelas perguntas:

  • O que será que melhorou?
  • Quais correções foram definitivamente corrigidas?
  • Será que alguma solicitação do Connection foram atendidas?

Enfim sempre estamos querendo descobrir o que realmente o tipo de engenheiros e desenvolvedores voltados para o SQL Server estão pensando em melhorar e corrigir no produto.

Para esta versão não foi diferente como de costume desde a versão 2012 a Microsoft esta liberando em doses homeopáticas pequenas novidades voltadas para a linguagem Transact-SQL e isso se manteve no SP1 da versão 2016 com a introdução do comando Create or Alter na mesma instrução.

Isso mesmo você pode estar se perguntando ou até mesmo pensando, mas somente agora na versão 2016 este tipo de instrução foi adicionada? A resposta é sim, somente agora pois, algo que para muitos parecia ser simples se comparado com outras ferramentas de banco de dados como Oracle ou MySQL, mas como diz aquele velho ditado: “Nem tudo o que parece é” e isso também se justifica ao Microsoft SQL Server.

Problema

Você saberia me dizer quantas vezes teve que realizar a criação de um recurso programável em um servidor ou instância SQL Server? Algo do tipo Stored Procedure, Function, Trigger ou Views?

E realizar uma ou várias alterações na estrutura de codificação de algum tipo destes recursos? Com certeza é algo bastante comum de ser realizado principalmente quando estamos criando nossos ambientes.

Por muitos anos este tipo de atividade a ser realizada na linguagem Transact-SQL deveria ser feita de forma separada. Onde devemos basicamente seguir uma regra de criar um destes tipos de objetos através do comando Create e caso tenhamos a necessidade de realizar algum tipo de alteração utilizar o comando Alter.

Então, e se agora com o lançamento do service pack 1 para o SQL Server 2016 eu te dizer que isso já pode ser realizado de uma única vez, você acredita?

Eu posso te dizer que acredito pois é verdade…..

Solução

Dizer que demorou um pouco para a equipe de desenvolvimento entender o quanto esta melhoria seria útil e importante não é verdade, ao meu ver demorou bastante, eu posso dizer isso pois trabalho com SQL Server desde a versão 7, isso já se vão 18 anos.

Mas enfim dizer do passado muitas vezes não ajuda em nada, o que vale e deve ser destacado é que agora temos esta pequena mas importante melhoria implementada no Microsoft SQL Server 2016 SP1 que nos permite ao mesmo tempo que declaramos o comando Create adicionar na mesma linha o comando Alter, mas a princípio somente para os objetos programáveis dentre eles:

  • Function;
  • Stored Procedure;
  • Triggers; e
  • Views.

O Create or Alter voltado para tabelas ainda não esta presente neste momento, e sinceramente falando acredito que vai demorar mais um pouco para ser adicionado ao produto.

Legal, mesmo assim já tivemos um grande avanço com a liberação deste nova capacidade adicionada a linguagem Transact-SQL.

Exemplos

Pois bem, seguindo em frente e dando seta para direita afim de realizar uma ultrapassagem na atual versão do SQL Server 2016 mudando para nova versão SQL Server 2016 SP1 ou se preferir versão 13.0.4001 número que identifica e evolução do kernel para o SP1.

Acelarando um pouco mais, vamos trabalhar com alguns exemplos de código que ilustram como podemos fazer uso do comando Create or Alter, para tal torna-se necessário realizar o download do SP1, caso você ainda não tenha feito, utilize o link apresentado a seguir:

Dando continuidade vamos executar o primeiro bloco de código, denominado Bloco de Código 1 apresentado abaixo:

— Bloco de Código 1 —

create-alter-procedure-1
Podemos observar que a forma de uso desta instrução é bastante simples, não necessitando de algum tipo de alteração na sintaxe tanto do comando Create como também do Alter.

Observe que realizamos a criação de um simples Stored Procedure denonimado P_Teste e após a execução do create/alter realizar a apresentação do código fonte da mesma através do system stored procedure SP_HelpText.

Um detalhe importante que vale a pena ser destacado, se relacionado a apresentação do código fonte da nosso stored procedure, note que o SQL Server não adiciona a palava chave Alter na apresentação do código, você pode pensar, mas é claro nós acabamos de criar o objeto. Eu também pensei assim, mas isso não altera caso você realize qualquer tipo de alteração no código fonte, mesmo após realizar alguma mudança na codificação do seu objeto o Database Engine não reconhece a execução do comando Alter ele mais uma vez adiciona o comando ou palavra chave create antes do nome do objeto.

Isso me faz pensar que todas as vezes que utilizarmos este tipo de implementação o Database Engine vai na verdade realizar o processo de drop físico do objeto e posteriormente a criação deste objeto.

Vamos agora trabalhar da mesma forma para criação/alteração de uma function, para isso vamos utilizar o Bloco de código 2 apresentado a seguir:

— Bloco de Código 2 —

create-alter-function-1

Legal, legal, muito bem, simples, fácil, rápido e por quê não dizer que é prático! Ao mesmo tempo que criamos um objeto programável já podemos realizar a alteração. Isso não é algo que realmente estava faltando para o SQL Server?

Acredito que sim, e fazendo um comparativo era a mesma coisa que faltava quando se referiamos a existência de tipos de dados para armazenar somente data ou hora, algo que também foi implementada após um longo tempo a partir da versão 2008 do SQL Server, ou os comandos IIF ou Choice que já existiam na linguagem C#, mas não estavam presentes no Microsoft SQL Server até a versão 2012.

Bom vou deixar para que praticar o uso deste comando na criação de Triggers e Views, com certeza não terá problemas.

Referências

Conclusão

Como de costume a cada nova versão ou atualização a Microsft esta apresentando diversas inovações e melhorias no Microsoft SQL Server.

Desta forma, em um novo service pack lançado novas melhorias ou mudanças de comportamento do produto são esperadas, algo que a partir do service pack o SQL Server 2016 também vai apresentar.

O que a partir do momento que este conjunto de melhorias for instalada em seu ambiente, será possível dentre elas fazer uso da nova sintaxe combinado dos comandos Create e Alter utilizados de maneira simultânea formando o Create or Alter.

Agradecimentos

Mais uma vez obrigado por sua visita, agradeço sua atenção, fique a vontade para enviar suas críticas, sugestões, observações e comentários.

Até mais.

Short Scripts – Junho 2016


Salve, salve minha gente, boa tarde!!!

Mais uma segunda – feira começando e mais uma semana se iniciando, já passamos da metade do mês de Junho tão aguardado devido ao lançamento do novo Microsoft SQL Server 2016. Caso você tenha perdido alguma informação sobre este lançamento, aproveito para compartilhar aqui um dos diversos posts publicados no meu blog sobre esta nova versão:

Voltando a falar sobre o Short Scripts, esta é uma das sessões mas visitadas do meu blog, onde o objetivo  é compartilhar os scripts existentes em minha biblioteca de códigos  dedicados exclusivamente para o SQL Server. Muitos destes scripts são resultado de pesquisas, posts publicados nos fóruns MSDN e também de respostas encontradas em outros websites de profissionais, administradores de banco de dados, professores e comunidades.

Boa parte deste material é fruto de um trabalho dedicado exclusivamente a colaboração com a comunidade, visando sempre encontrar algo que possa ser a solução de um determinado problema, bem como, a demonstração de como se pode fazer uso de um determinado recurso. Todos os scripts publicados nesta sessão são devidamente testados antes de serem publicados, mas isso não significa que você pode fazer uso dos mesmo em seu ambiente de produção, vale sim todo cuidado possível para evitar maiores problemas.

Caso você não tenha acessado os últimos posts, não perca tempo, utilize os links publicados a seguir:

https://pedrogalvaojunior.wordpress.com/2016/03/22/short-scripts-marco-2016/

https://pedrogalvaojunior.wordpress.com/2015/12/14/short-script-dezembro-2015/

https://pedrogalvaojunior.wordpress.com/2015/10/21/short-scripts-outubro-2015/

https://pedrogalvaojunior.wordpress.com/2015/08/26/short-scripts-agosto-2015/

https://pedrogalvaojunior.wordpress.com/2015/06/03/short-script-junho-2015/

Para esta relação você vai encontrar scripts relacionados aos seguintes assuntos, conceitos, recursos ou funcionalidades:

  • Acesso a banco de dados;
  • Collation;
  • Comando Exec;
  • Comando Union;
  • Comando Union All;
  • Comando Create Table;
  • Comando Alter Table;
  • Common Table Expression;
  • DBCC CheckPrimaryFile;
  • DMV sys.dm_db_index_usage_stats;
  • DMV sys.dm_os_buffer_descriptors;
  • Índices Clustered e NonClustered;
  • Option MaxRecursion;
  • Plano de Execução;
  • Querys consideradas pesadas;
  • Tabela de sistema sys.allocation_units;
  • Tabela de sistema sys.partitions;
  • Tabela de sistema sys.indexes;
  • Tabela e caracteres Unicode; e
  • Recursividade.
A seguir, apresento a relação de short scripts:

— Short Script 1 – DBCC CheckPrimaryFile Verificando se o arquivo realmente é um Primary File —
DBCC CheckPrimaryFile (‘C:\Bancos\Laboratorio.MDF’,0)
Go

 

— Short Script 2 – DBCC CheckPrimaryFile – Retornando o conjunto completo de informações associados ao Primary File que formam a estrutura do respectivo Banco de Dados —
DBCC CheckPrimaryFile (‘C:\Bancos\Laboratorio.MDF’,1)
Go

 

— Short Script 3 – DBCC CheckPrimaryFile – Retornando o nome do banco de dados, versão e collation relacionados ao Primary File —
DBCC CheckPrimaryFile (‘C:\Bancos\Laboratorio.MDF’,2)
Go

— Short Script 4 – DBCC CheckPrimaryFile – Retornando o status, fileid, name e filename associados ao Primary File que formam a estrutura do respectivo Banco de Dados —
DBCC CheckPrimaryFile (‘C:\Bancos\Laboratorio.MDF’,3)
Go
— Short Script 5 – Informações sobre acesso ao Banco de Dados —
WITH agg AS
(SELECT last_user_seek,
                  last_user_scan,
                  last_user_lookup,
last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID()
)
SELECT last_read = MAX(last_read),
                 last_write = MAX(last_write)
FROM
(SELECT last_user_seek, NULL FROM agg
UNION ALL
SELECT last_user_scan, NULL FROM agg
UNION ALL
SELECT last_user_lookup, NULL FROM agg
UNION ALL
SELECT NULL, last_user_update FROM agg
) AS x (last_read, last_write);
Go

 

— Short Script 6 – Observando a mudança de comportamento após a troca de Collation —

CREATE TABLE [dbo].[Authors]
([id] [INT] NULL,
   [author] [VARCHAR](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
   [dateposted] [DATE] NULL) ON [PRIMARY]
GO
INSERT Authors  VALUES (1, ‘Steve’, ‘20160101’),
                                                   (2, ‘STEVE’, ‘20160201’),
                                                   (3, ‘Andy’, ‘20160301’),
                                                   (4, ‘andy’, ‘20160401’)
GO
CREATE PROCEDURE GetAuthors @author VARCHAR(50)
AS
BEGIN
SELECT a.id, a.author FROM dbo.Authors a
WHERE a.author = @author
END
GO
— If I run the procedure with a parameter of ‘Steve’, it returns two rows. I then run this code:
Exec GetAuthors ‘Steve’
Go
ALTER TABLE dbo.Authors
ALTER COLUMN author VARCHAR(50) COLLATE SQL_Latin1_General_CP437_BIN2 NULL
— If I were to execute the stored procedure, what would happen?
Exec GetAuthors ‘Steve’
Go

 

— Short Script 7 – Descobrindo o código Unicode de um caracter ou String —

— Exemplo 1 —
DECLARE @n CHAR(10);
SET @n = N’Abc’;
SELECT UNICODE(@n);
Go
— Exemplo 2 —
DECLARE @n NCHAR(10);
SET @n = N’??????????’;
SELECT UNICODE(@n);
Go

 

— Short Script 8 – Criando CTEs —

— Exemplo 1 – Criando uma simples CTE —
;With Exemplo1(Valor, Nome)
As
(
Select 1, ‘Pedro Galvão’ As Nome
)
Select * from Exemplo1
Go
— Exemplo 2 – Criando uma CTE com Union de Selects —
;With Exemplo2(Valor)
As
( Select 10
Union
Select 50
Union
Select 8
Union
Select 10 + 2
)
Select Valor = (Select Max(valor) From Exemplo2) + (Select Sum(Valor) From Exemplo2)
Go
– Short Script 9 – Criando CTEs com Recursividade —
— Exemplo – Criando uma nova CTE Recursiva concatenando dados —
;With ConcatenarNomes(nome)
AS
( SELECT Nome = CONVERT(Varchar(4000),’Pedro Antonio’)
UNION ALL
SELECT CONVERT(Varchar(4000),nome + ‘ Galvão Junior’) FROM ConcatenarNomes
WHERE LEN(nome) < 30
)
SELECT Nome FROM ConcatenarNomes
Go
— Exemplo 2 – Criando uma CTE com Union + Recursividade – Simulando uma sequência de números pares —
;With CTENumerosPares(Numero)
As
( Select 0 As Numero
Union All
Select Numero + 2 As Numero From CTENumerosPares
Where Numero < 100
)
Select Numero From CTENumerosPares
Go
— Exemplo 3 – Criando uma CTE com Union + Recursividade – Simulando uma sequência de números —
;With CTENumerosSequenciais(Numero)
AS
(   SELECT 1 AS Numero
UNION ALL
SELECT Numero + 1 AS num FROM CTENumerosSequenciais
WHERE Numero < 1000
)
SELECT * FROM CTENumerosSequenciais
OPTION (MAXRECURSION 0)
Go
— Short Script 10 – Obtendo o tamanho de índices Clustered e NonClustered —
SELECT COUNT(*) AS cached_pages_count,
COUNT(*)/128.0000 MB,
name AS BaseTableName,
IndexName,
IndexTypeDesc
FROM sys.dm_os_buffer_descriptors AS bd
INNER JOIN (SELECT s_obj.name,
s_obj.index_id,
s_obj.allocation_unit_id,
s_obj.OBJECT_ID,
i.name IndexName,
i.type_desc IndexTypeDesc
FROM
(SELECT OBJECT_NAME(OBJECT_ID) AS name,
index_id,
allocation_unit_id,
OBJECT_ID
FROM sys.allocation_units AS au INNER JOIN sys.partitions AS p
ON au.container_id = p.hobt_id
AND (au.TYPE = 1 OR au.TYPE = 3)
UNION ALL
SELECT OBJECT_NAME(OBJECT_ID) AS name,
index_id,
allocation_unit_id,
OBJECT_ID
FROM sys.allocation_units AS au INNER JOIN sys.partitions AS p
ON au.container_id = p.partition_id
AND au.TYPE = 2
) AS s_obj LEFT JOIN sys.indexes i
ON i.index_id = s_obj.index_id
AND i.OBJECT_ID = s_obj.OBJECT_ID
) AS obj ON bd.allocation_unit_id = obj.allocation_unit_id
WHERE database_id = DB_ID()
and name not like ‘sys%’
and IndexName <> ‘null’
GROUP BY name, index_id, IndexName, IndexTypeDesc
ORDER BY cached_pages_count DESC;
Muito bem, mais uma relação de short scripts acaba de ser compartilhada, mesmo sendo denominados short entre aspas “pequenos”, posso garantir que todos estes exemplos são de grande importância e apresentam um valor e conhecimento do mais alto nível.

Chegamos ao final de mais um post, fique a vontade para compartilhar este conteúdo com seus contatos e redes sociais, contribua também enviando dicas, sugestões, dúvidas, críticas, enfim participe e ajude a melhorar cada vez mais esta sessão.

Mais uma vez obrigado por sua visita, nos encontramos em breve em mais um post da sessão Short Scripts.

Uma ótima semana, abraços.

Material de Apoio – Abril – 2016


Boa noite, boa noite, boa noite!!!!

Véspera de feriado e aqui estamos nós se preparando para alguns dias de descanso e também não deixando de compartilhar com a comunidade um pouco mais sobre o Microsoft SQL Server seus segredos e mistérios. Alias este é um ótimo nome para uma possível nova sessão que estou pensando em lançar no meu blog!!!

Falando das sessões atuais, hoje estou retornando com mais um post relacionado a minha biblioteca de scritps e códigos voltados para o SQL Server, como você já percebeu estou me referindo a sessão Material de Apoio que este ano ainda não recebeu uma merecida atenção, tendo seu último post publicado em Janeiro.

Caso você queira acessar este último post, utilize o link apresentado abaixo:
https://pedrogalvaojunior.wordpress.com/2016/01/18/material-de-apoio-janeiro-2016/

Neste post vou ser um pouco mais generoso e disponibilizar uma relação mais extensa e diversificada de arquivos, destaco alguns dos assuntos relacionados aos scripts de hoje:

  • BulkInsert com arquivos de formato .fmt;
  • Criptografia;
  • Controle Automática de Very Large Files;
  • Constrainst e Common Table Expressions;
  • Dynamic Management View – Sys.dm_os_memory_clerks;
  • Extended Stored Procedure – XP_FixedDrives;
  • Informações sobre Page Life Expectancy;
  • Informações sobre licença do uso do SQL Server
  • Funções – DateDiff, Convert, SubString;
  • System Stored Procedure – SP_FixedDrives;
  • Stored Procedure Não Documentada – SP_MSForEachDB; entre outros.

Como de costume gosto sempre de destacar que todos estes arquivos são fruto do meu trabalho realizado como DBA desde 2000 e principalmente da pesquisa e coleta de informações através da internet, onde grande parte do conhecimento aqui compartilhado também obtido através da dedicação e colaboração de seus autores grande profissionais nacionais e internacionais que atuam como profissionais reconhecidos e especialistas nas áreas de:

  • Modelagem de Dados;
  • Engenharia de Banco de Dados;
  • Engenharia de Softwares e Processos;
  • Banco de Dados;
  • Servidores;
  • Alta Disponibilidade;
  • Desenvolvimento;
  • Migração e Contingência de Dados.

Obseravação: Toda e qualquer informação, código, exemplo e lógica utilizada nestes scripts foi aplicada em um determinado cenário, situação ou necessidade, o que em muitos casos talvez não se aplica a sua necessidade mas pode ser útil como material de consulta ou aprendizado.

Além disso, todos os arquivos estão renomeados tendo ao final do seu nome a extensão .doc como forma de compatibilidade com a plataforma do WordPress.com, vale sempre ressaltar que após o seu download será necessário remover esta extensão mantendo a extensão .sql padrão para arquivos do script do SQL Server.

A seguir a relação de scripts:

1 – Exemplo – Avançado – Utilizando – Stored Procedure – sp_fixeddrives.sql

2 – Exemplo – Básico – Utilizando a Extended Procedure – XP_fixeddrives.sql

3 – Exemplo – Intermediário – BulkInsert com arquivo de formato.fmt.sql

4 – Exemplo – Obtendo informações – Utilizando sys.dm_os_memory_clerks.sql

5 – Exemplo – Obtendo informações – Page Life Expectancy.sql

6 – Exemplo – Informações – Server Memory.sql

7 – Exemplo – Intermediário – Cuidados – DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs.sql

8 – Exemplo – Avançado Controle Automático de VLFs – Passo 1 – Setup.sql

9 – Exemplo – Avançado Controle Automático de VLFs – Passo 2 – Initial Config.sql

10 – Exemplo – Avançado Controle Automático de VLFs – Passo 3 -On Demand Check.sql

11 – Exemplo – Básico – Descobrindo se o Trigger é Insert, Update ou Delete.sql

12 – Exemplo – Utilizando – CTE Composta + CTE Recursiva.sql

13 – Exemplo – Criando – Check Constraint + User Function vinculada com Check Constraint.sql

14 – Exemplo – Utilizando – SP_MSForEachDB + Use Dinâmico.sql

15 – Exemplo – Utilizando – Stored Procedure – Exibir – Código Stored Procedure Criptografada.sql

16 – Exemplo – Utilizando – Stored Procedure para Descriptografia de Stored Procedure.sql

17 – Exemplo – Obtendo o Menor e o Maior Valor – Acrescentendo Valores Intermediários.sql

18 – Exemplo – Obtendo – Quantidade de Dias – Encerramento – Licença SQL Server.sql

 

Fique a vontade para compartilhar com seus contatos, não deixe de enviar seus comentários, críticas, dicas ou sugestões.

Mais uma vez obrigado por sua visita, por seu interesse e participação.

Um ótimo feriado, bom descanso, nos encontramos me breve.

Abraços.

Short Script – Dezembro – 2015


Bom dia, Comunidade. Good Morning Everyone!!!!!

Como diria aquele apresentador “O louco meu…..”, 2015 esta chegando ao seu final parece que foi ontem que publiquei o primeiro post deste ano, realmente o tempo esta passando de forma assustadora e não estamos dando conta do quanto estamos vivendo, ou melhor sobrevivendo as loucuras do mundo.

Mantendo a escrita e tradição não poderia deixar passar a oportunidade de compartilhar com vocês os mais novos Short Scripts que adicionei a minha biblioteca de Scripts dedicados ao Microsoft SQL Server desde a versão 2000. Neste momento minha modesta biblioteca de arquivos esta composta por 1.121 scripts organizados em 66 pastas, sub-dividos em 4 categorias:

  • Comuns;
  • Básicos;
  • Intermediários; e
  • Avançados.

Pois bem, no post de hoje destaco os seguintes recursos ou funcionalidades:

  • Arquivo de ErrorLog e Logs Management;
  • Contagem de linhas existentes em tabelas;
  • CTE Recursiva;
  • Diferença entre datas desconsiderando sábado e domingo;
  • Extended Events Target;
  • Função para formatar a primeira letra de cada palavra em maiúscula;
  • Geração de combinação de letras;
  • Multiple Server in Query Windows;
  • Stored Procedure para gerar CNPJ e CPF;
  • SQLCMD Mode; e
  • Variável Table.

Fique a vontade para compartilhar, sugerir melhoras, críticas ou questionamentos sobre estes exemplos.

Segue abaixo a relação de short scripts:

1 – Exemplo – Utilizando Extended Events Target para separar e contar loings e logouts:

CREATE EVENT SESSION [CounterTest] ON SERVER

ADD EVENT sqlserver.login,

ADD EVENT sqlserver.logout(

ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.username))

ADD TARGET package0.event_counter

WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)

GO
— login and logout a few times

GO

— query for data

— Query the Target

SELECT

n.value(‘@name[1]’, ‘varchar(50)’) AS Event

, n.value(‘@count[1]’, ‘int’) AS EventCounts

FROM

( SELECT

CAST(t.target_data AS XML) AS target_data

FROM

sys.dm_xe_sessions AS s

JOIN

sys.dm_xe_session_targets AS t

ON

t.event_session_address = s.address

WHERE

s.name = ‘CounterTest’

AND t.target_name = ‘event_counter’

) AS tab

CROSS APPLY target_data.nodes(‘CounterTarget/Packages/Package/Event’) AS q ( n )

GO

 

2 – Exemplo – Stored Procedure para gerar CNPJ e CPF:

CREATE PROCEDURE dbo.stpGerador_CPF_CNPJ (
@Quantidade INT = 1,
@Fl_Tipo BIT = 1
)
AS BEGIN

IF (OBJECT_ID(‘tempdb..#Tabela_Final’) IS NOT NULL) DROP TABLE #Tabela_Final
CREATE TABLE #Tabela_Final (
Nr_Documento VARCHAR(18)
)

DECLARE
@n INT,
@n1 INT,
@n2 INT,
@n3 INT,
@n4 INT,
@n5 INT,
@n6 INT,
@n7 INT,
@n8 INT,
@n9 INT,
@n10 INT,
@n11 INT,
@n12 INT,

@d1 INT,
@d2 INT

— CPF
IF (@Fl_Tipo = 0)
BEGIN

WHILE (@Quantidade > 0)
BEGIN

SET @n = 9
SET @n1 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n2 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n3 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n4 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n5 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n6 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n7 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n8 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n9 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @d1 = @n9 * 2 + @n8 * 3 + @n7 * 4 + @n6 * 5 + @n5 * 6 + @n4 * 7 + @n3 * 8 + @n2 * 9 + @n1 * 10
SET @d1 = 11 – ( @d1 % 11 )

IF ( @d1 >= 10 )
SET @d1 = 0

SET @d2 = @d1 * 2 + @n9 * 3 + @n8 * 4 + @n7 * 5 + @n6 * 6 + @n5 * 7 + @n4 * 8 + @n3 * 9 + @n2 * 10 + @n1 * 11
SET @d2 = 11 – ( @d2 % 11 )

IF ( @d2 >= 10 )
SET @d2 = 0

INSERT INTO #Tabela_Final
SELECT CAST(@n1 AS VARCHAR) + CAST(@n2 AS VARCHAR) + CAST(@n3 AS VARCHAR) + ‘.’ + CAST(@n4 AS VARCHAR) + CAST(@n5 AS VARCHAR) + CAST(@n6 AS VARCHAR) + ‘.’ + CAST(@n7 AS VARCHAR) + CAST(@n8 AS VARCHAR) + CAST(@n9 AS VARCHAR) + ‘-‘ + CAST(@d1 AS VARCHAR) + CAST(@d2 AS VARCHAR)

SET @Quantidade = @Quantidade – 1

END

END

— CNPJ
ELSE BEGIN

WHILE (@Quantidade > 0)
BEGIN

SET @n = 9
SET @n1 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n2 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n3 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n4 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n5 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n6 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n7 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n8 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n9 = 0
SET @n10 = 0
SET @n11 = 0
SET @n12 = 1

SET @d1 = @n12 * 2 + @n11 * 3 + @n10 * 4 + @n9 * 5 + @n8 * 6 + @n7 * 7 + @n6 * 8 + @n5 * 9 + @n4 * 2 + @n3 * 3 + @n2 * 4 + @n1 * 5
SET @d1 = 11 – ( @d1 % 11 )

IF (@d1 >= 10)
SET @d1 = 0

SET @d2 = @d1 * 2 + @n12 * 3 + @n11 * 4 + @n10 * 5 + @n9 * 6 + @n8 * 7 + @n7 * 8 + @n6 * 9 + @n5 * 2 + @n4 * 3 + @n3 * 4 + @n2 * 5 + @n1 * 6
SET @d2 = 11 – ( @d2 % 11 )

IF (@d2 >= 10)
SET @d2 = 0

INSERT INTO #Tabela_Final
SELECT ” + CAST(@n1 AS VARCHAR) + CAST (@n2 AS VARCHAR) + ‘.’ + CAST (@n3 AS VARCHAR) + CAST (@n4 AS VARCHAR) + CAST (@n5 AS VARCHAR) + ‘.’ + CAST (@n6 AS VARCHAR) + CAST (@n7 AS VARCHAR) + CAST (@n8 AS VARCHAR) + ‘/’ + CAST (@n9 AS VARCHAR) + CAST (@n10 AS VARCHAR) + CAST (@n11 AS VARCHAR) + CAST (@n12 AS VARCHAR) + ‘-‘ + CAST (@d1 AS VARCHAR) + CAST (@d2 AS VARCHAR);

SET @Quantidade = @Quantidade – 1

END

END

SELECT * FROM #Tabela_Final

END

 

3 – Exemplo – Reciclando o arquivo de ErrorLog e Logs Management:

EXEC sp_cycle_errorlog
GO

 

4 – Exemplo – Função – Formatar a primeira letra de cada palavra em maiúscula:

CREATE FUNCTION dbo.udfNomeProprio (
@Nome varchar(250)
)
RETURNS varchar(250)
AS
BEGIN
DECLARE @Pos tinyint = 1
DECLARE @Ret varchar(250) = ”

WHILE (@Pos < LEN(@Nome) + 1)
BEGIN
IF @Pos = 1
BEGIN
–FORMATA 1.LETRA DA “FRASE”
SET @Ret += UPPER(SUBSTRING(@Nome, @Pos, 1))
END
ELSE IF (SUBSTRING(@Nome, (@Pos-1), 1) = ‘ ‘
AND SUBSTRING(@Nome, (@Pos+2), 1) <> ‘ ‘) AND (@Pos+1) <> LEN(@Nome)
BEGIN
–FORMATA 1.LETRA DE “CADA INTERVALO””
SET @Ret += UPPER(SUBSTRING(@Nome, @Pos, 1))
END
ELSE
BEGIN
–FORMATA CADA LETRA RESTANTE
SET @Ret += LOWER(SUBSTRING(@Nome,@Pos, 1))
END

SET @Pos += 1
END

RETURN @Ret
END
GO

SELECT dbo.udfNomeProprio(‘pedro antonio galvão junior’)
GO

 

5 – Exemplo – Utilizando Multiple Server in Query Windows using SQLCMD Mode:

— Sem o GO o SQLCMD Mode não entende o final do bloco —
:connect saom4276
select @@SERVERNAME

:connect SAOM4276\SQLEXPRESS2014
select @@SERVERNAME

— Utilizando o comando Go para encerrar o bloco —
:connect saom4276
select @@SERVERNAME
Go

:connect SAOM4276\SQLEXPRESS2014
select @@SERVERNAME
Go

 

6 – Exemplo – Gerando combinação de letras:

create table #t (string varchar (2))

declare @a1 varchar(1), @a2 varchar(1)
set @a1=’A’

while @a1 <= ‘Z’
begin
set @a2=’A’

while @a2 <= ‘Z’
begin
insert into #t select @a1 + @a2
set @a2 = char (ascii(@a2) + 1)
end

set @a1 = char (ascii(@a1) + 1)
end

select string from #t
where string like ‘_’ /*single underscore*/

Go

 

7 – Exemplo – Calculando diferença entre datas desconsiderando sábado e domingo:

declare @Data datetime set @Data = ‘2015/10/01’

–Calcula a quantidade de dias entre a data inicial e a data atual, excluindo sbados e domingos soma 1 no fim pois no conta o proprio dia

WITH AllDates AS

(   SELECT  TOP (DATEDIFF(DAY, @Data, GETDATE()))

D = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.Object_ID), @Data)

FROM    sys.all_objects a

CROSS JOIN sys.all_objects b

)

SELECT  WeekDays = COUNT(*) +1 –

–Clcula a quantidade de feriados entre as datas

(select count(*) from FTAFE(NOLOCK)

where convert(datetime, convert(varchar, FTAFE.DT_FERIADO), 112) between @Data and GETDATE()

and FTAFE.CD_CIDADE in(0)

and DATEPART(weekday, convert(datetime, convert(varchar, FTAFE.DT_FERIADO), 112)  ) not in(6,7))

FROM    AllDates

WHERE   DATEPART(WEEKDAY, D) NOT IN(6, 7)

Go
8 – Exemplo – Variável Table + CTE Recursiva para gerar sequência de letras:

declare @Tabela table
( COL1 INT,  COL2 VARCHAR(1));

insert into @Tabela values
(75, NULL),
(78, ‘C’),
(12, ‘B’),
(24, ‘D’)

;with CTE_Rec (COL1, COL2) as
(
select
COL1,
COL2
from @Tabela

union all

select
COL1,
case when ASCII(COL2) > 66 then CAST(CHAR(ASCII(COL2) – 1) AS VARCHAR(1))  end
from CTE_Rec as c
where
COL2 is not null
)

select
COL1,
COL2
from CTE_Rec
order by
COL1,
COL2

Go

 

9 – Exemplo – Quantidade de Linhas – Todas as Tables:

— Exemplo 1 —
SELECT t.[name], p.[rows]
FROM sys.schemas s INNER JOIN sys.tables t
ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.indexes i
ON i.[object_id] = t.[object_id]
AND i.[type] IN (0,1)
INNER JOIN sys.partitions p
ON p.[object_id] = t.[object_id]
AND p.[index_id] = i.[index_id]
Go

— Exemplo 2 —
;With Contador (name, rows)
As
(
SELECT t.[name], p.[rows]
FROM sys.schemas s INNER JOIN sys.tables t
ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.indexes i
ON i.[object_id] = t.[object_id]
AND i.[type] IN (0,1)
INNER JOIN sys.partitions p
ON p.[object_id] = t.[object_id]
AND p.[index_id] = i.[index_id]
)
Select name, rows,  ” as soma from Contador
Union all
Select ‘Total’ , Null, convert(varchar(10),sum(rows)) as soma from contador

Go

Caso você queria acessar os demais Short Scripts publicados em 2015, segue abaixo os links:

https://pedrogalvaojunior.wordpress.com/2015/10/21/short-scripts-outubro-2015/

https://pedrogalvaojunior.wordpress.com/2015/08/26/short-scripts-agosto-2015/

https://pedrogalvaojunior.wordpress.com/2015/06/03/short-script-junho-2015/

https://pedrogalvaojunior.wordpress.com/2015/05/04/short-script-maio-2015/

Mais uma vez obrigado por sua visita, espero que estes material posso ser útil e venha a colaborar em seu aprendizado.

Nos encontramos em breve…..

Short Scripts – Outubro – 2015


Salve, salve, comunidade da tecnologia e amantes do Microsoft SQL Server.

Tudo bem?

Hoje quarta – feira, estou retornando com mais um posts dedicado a minha sessão Short Script, alias acredito que esta é uma das sessões mais procuradas do meu blog.

Caso você não conheça esta sessão, vou explicá-la rapidamente: “A sessão Short Scripts foi criada em 2009 com objetivo de compartilhar de forma simples é rápidas, pequenos scripts(códigos) criados e utilizados no Microsoft SQL Server. Como seu próprio nome já defini Short Scripts, são realmente pequenos códigos que podem fazer toda diferença no momento da correção ou solução de um problema, dúvida ou até mesmo dificuldade.”

Muito bem, espero que este pequeno briefing possa ter ajudado a entender um pouco mais sobre esta sessão. Na relação de hoje, gostaria de destacar os seguintes recursos ou funcionalidades:

  • Bitwise;
  • Contagem de caracteres;
  • Erro 3609;
  • Operador Mod;
  • Nível de Compatibilidade;
  • Numa Node;
  • Rollback Transaction;
  • SET RowCount;
  • Sys.dm_exec_sessions;
  • Sys.dm_os_schedulers;
  • Tratamento de Erros;
  • Time – Expression; e
  • Variavel Table.

Fique a vontade para compartilhar este conteúdo em suas redes sociais e comunidade, conto com seus comentários, sugestões, críticas e observações. Segue abaixo a relação de Short Scripts:

— Short Script 1 – Sys.dm_os_schedulers – Identificando o número de Numa Nodes —

Select * from sys.dm_os_schedulers

Go

— Observar a coluna parent_node_id para identificar o Node

— Observar a coluna cpu_id para identificar o número da CPU

 

— Short Script 2 – Trabalhando com variáveis + Bitwise + Mod –

Declare @b As Int = 5,

@C as Int =5,

@D Int = 5,

@e int = 56

 

Set @b=5;

Set @b &=1 — Bitwise AND EQUALS —

Set @c=5;

Set @c |=1 — Bitwise OR EQUALS —

Set @d ^=1 — (Bitwise Exclusive OR EQUALS) —

Set @e %= 5 — Modulo EQUALS — Mod resto da divisão —

 

Select @b As ‘b’,

@c As ‘c’,

@d As ‘d’,

@e As ‘e’

Go

 

— Short Script 3 – Criando um loop infinito utilizando SET ROWCOUNT + Variable Table –

DECLARE @i float,

@rc int

 

set @i = 0

 

while @i <> 1

begin

declare @a table(a int)

 

set @rc = @i + 0.9

 

set rowcount @rc

 

insert into @a

select id from sysobjects

 

set @i = @i + 0.1

end

 

SELECT * FROM @a

Go

 

— Short Script 4 – Função – Contar caracteres específicos dentro de um texto –

Create FUNCTION [dbo].[CountChar] (@Palavra Varchar(100), @String Varchar(Max))

RETURNS int AS

Begin

Declare @Count int, @CountTexto int

 

Set @CountTexto = 0

Set @Count = 0

 

While @Count <= Len(@String)

Begin

Set @CountTexto = Case

When Substring(@String, @Count, Len(@Palavra)) = @Palavra Then @CountTexto + 1

Else @CountTexto

End

 

Set @Count = @Count + 1

End

 

Return @CountTexto

End

 

— Executando —

Select dbo.CountChar(‘/’,’Pedro / Galvão / Junior’)

Go

 

— Short Script 5 – Simulando – Diferença entre nível de compatibilidade 120 e 100 –

Alter Database [AdventureWorks2014]

Set Compatibility_Level = 100

 

SET DATEFORMAT dmy;

 

DECLARE @t2 date = ’12/5/2011′ ;

 

SET LANGUAGE dutch;

SELECT CONVERT(varchar(11), @t2, 106);

Go

 

— Results when the compatibility level is less than 120.

12 May 2011

 

Alter Database [AdventureWorks2014]

Set Compatibility_Level = 120

 

SET DATEFORMAT dmy;

 

DECLARE @t2 date = ’12/5/2011′ ;

 

SET LANGUAGE dutch;

SELECT CONVERT(varchar(11), @t2, 106);

 

— Results when the compatibility level is set to 120).

12 mei 2011

 

— Short Script 6 – Trabalhando com Time-Expression FN para cálculo de horas –

Create Table #s(Start Datetime, [end] Datetime)

 

Insert Into #s

Select Cast(‘2010-04-08 12:00:00’ As datetime),Cast(‘2010-04-08 14:10:00’ As datetime) Union All

Select Cast(‘2010-04-08 13:00:00’ As datetime),Cast(‘2010-04-08 14:00:00’ As datetime) Union All

Select Cast(‘2010-04-08 15:45:00’ As datetime),Cast(‘2010-04-08 16:00:00’ As datetime) Union All

Select Cast(‘2010-04-08 15:00:00’ As datetime),Cast(‘2010-04-08 18:00:00’ As datetime)

 

 

— Exemplo 1 —

Select Round(Cast(Sum(({fn Hour([end])}-{fn Hour(start)})) As decimal(4,2)) +

Cast(Sum({fn Minute([end])} –

{fn Minute( start)}) As decimal(4,2))/60,4) As ‘Total Hrs’ From #s

 

— Exemplo 2 —

Select {fn Hour([end])}+{fn Hour(GetDate())},

{fn Minute([end])},

{fn Second([end])}   from #S

Go

 

— Short Script 7 – Utilizando Rollback Transaction dentro de Trigger + Realizando tratamento de erro 3609 –

Use DBMonitor

Go

 

Create Table T1

(Codigo Int)

Go

 

Create Trigger T_ValidarHorario

On T1

For Insert, Update, Delete

As

Begin

Set NoCount On

Set DateFirst 7

 

Declare @Horario TinyInt,

@DiaSemana TinyInt

 

Set @Horario = DATEPART(HH, Getdate())

Set @DiaSemana = DATEPART(WeekDay,GetDate())

 

If (@Horario = 23 And @DiaSemana = 6)

Begin

Begin Tran

Select ‘error….’

 

Rollback Transaction

Begin Transaction

End

End

 

Insert Into T1 Values(4)

 

Select * from T1

 

Go

 

— Short Script 8 – Utilizando – SYS.DM_EXEC_SESSIONS para monitoramento de querys em execução –

SELECT

DES.SESSION_ID,

DES.CPU_TIME,

DES.READS,

DES.WRITES,

DES.LOGICAL_READS,

DES.ROW_COUNT,

DER.SESSION_ID,

DES.STATUS,

DES.HOST_NAME,

DES.PROGRAM_NAME,

DES.LOGIN_NAME,

DES.ORIGINAL_LOGIN_NAME,

DEC.CLIENT_NET_ADDRESS,

DEC.AUTH_SCHEME,

DEC.NET_TRANSPORT,

SUBSTRING(T.[TEXT], DER.[STATEMENT_START_OFFSET] / 2,

COALESCE(NULLIF(DER.[STATEMENT_END_OFFSET], – 1) / 2, 2147483647)) AS COMANDO

FROM

SYS.DM_EXEC_SESSIONS AS DES

INNER JOIN SYS.DM_EXEC_REQUESTS DER

ON DER.BLOCKING_SESSION_ID = DES.SESSION_ID

INNER JOIN SYS.DM_EXEC_CONNECTIONS DEC

ON DEC.SESSION_ID = DES.SESSION_ID

INNER JOIN SYS.DM_EXEC_REQUESTS DER2

ON DER2.SESSION_ID = DES.SESSION_ID

CROSS APPLY SYS.DM_EXEC_SQL_TEXT(DER.[SQL_HANDLE]) AS T

GO

 

Mais uma vez obrigado por sua visita, agradeço a sua participação, não deixe de acessar os últimos Shorts Scripts publicados em 2015:

https://pedrogalvaojunior.wordpress.com/2015/08/26/short-scripts-agosto-2015/

https://pedrogalvaojunior.wordpress.com/2015/06/03/short-script-junho-2015/

https://pedrogalvaojunior.wordpress.com/2015/05/04/short-script-maio-2015/

Nos encontramos em breve.

Até mais.

 

 

Conhecendo o Live Query Statistics no Microsoft SQL Server 2016


Salve, salve galera, bom dia….. Ufa, sexta – feira!!!!

Para terminar mais uma semana de muito trabalho, gostaria de compartilhar com vocês mais uma novidade que o Microsoft SQL Server 2016 esta nos apresentando, conhecida como Live Query Statistics.

Quando eu ouvi ao sobre esta funcionalidade sinceramente não acreditei, mas é verdade, alias uma grande realidade, conseguir em tempo real de processamento de uma query acompanhar todo seu processamento, entendendo realmente como cada operador é sensibilizado pelo Query Processor durante seu trabalho, e como cada operador interage com os demais.

Tenho a certeza que esta nova funcionalidade vai ajudar em muito a todos os profissionais que de alguma forma utilizam o Microsoft SQL Server em sua atividades.

Espero que você goste deste artigo, vamos em frente.

Introdução

O time de engenheiros e desenvolvedores da Microsoft a cada nova versão vem trazendo novos recursos, funcionalidades e comandos que possibilitam a qualquer profissional da área de Banco de Dados, conseguir acompanhar e entender como o Microsoft SQL Server através do Query Processor e Query Optmizer trabalha, algo que foi evoluíndo desde a versão 2008 com a mudanças de alguns operadores como o antigo Bookmark Lookup que posteriormente veio a ser chamado de Key Lookup, além disso, a introdução do Missing Index dentro do Execution Plan também foi considerado por todos em meados de 2008 um elemente fundamental para se obter ganhos de performance no processamento de nossas querys.

Na versão 2014 a Microsoft deu um grande salto a possibilitar o monitorando o progresso de execução de querys em tempo real através da DMV sys.dm_exec_query_profiles disponível em todas as edições desta versão, inclusive você vai poder encontrar aqui no meu blog, um artigo dedicado exclusivamente a esta funcionalidade, acessando: https://pedrogalvaojunior.wordpress.com/2015/08/12/monitorando-o-progresso-de-execucao-de-querys-em-tempo-real-no-microsoft-sql-server-2014/

Agora na versão 2016 no meu entendimento a Microsoft conseguiu realmente trazer o que estava faltando, permitir ao SQL Server ter a capacidade técnica de apresentar em real-time, isso mesmo, em tempo real todo processo de execução de nossas querys, apresentando de forma visual, gráfica e muito inteligente o Execution Plan estabelecido com seus operadores sendo processados, e não somente mostrar, mas sem necessitar de qualquer ferramenta adicional proporcional dentro do Management Studio clicar em um simples botão e habilitar esta funcionalidade.

As dificuldades do dia a dia

Acredito que uma das maiores dificuldades de qualquer administrador de banco de dados, analista de sistema, desenvolvedores, enfim profissionais que de alguma forma acabam tendo a necessidade de trabalhar com SGBD (Sistemas Gerenciadores de Banco de Dados) é encontram em qual parte do seu ambiente podem estar ocorrendo á chamada “lentidão”, elemente presente dentre de qualquer infraestrutura de tecnologia que deixa todos os envolvidos diretamente ou indiretamente muitas vezes sem respostas.

Com o Live Query Statistics teremos a capacidade de conseguir encontrar de uma forma mais fácil, rápida e prática em qual parte da uma determinada query esta temida “lentidão” pode estar ocorrendo ou posso proporcionar em seguida algum tipo de mudança de comportamento.

Sobre o Live Query Statistics

Introduzido a partir do CTP 2.1 do Microsoft SQL Server 2016, o Live Query Statistics tem como principal objetivo apresentar o plano de execução ao vivo, exibindo:

  1. O progresso de processamento de uma query;
  2. As Estatísticas de tempo de execução de cada operador;
  3. O Tempo de execução geral do processamento da query;
  4. O Número de linhas processadas;
  5. A Sequência de processamento de cada operador;
  6. A interação entre os operadores;
  7. A ordem de processamento de cada operador até o final de execução da query; e
  8. A porcentagem de processamento de cada operador.

Talvez a colocação que eu venha a fazer agora possa ser um pouco exagerada, mas eu acredito que esta feature nos possibilita acompanhar um apresentação ao vivo de todo o trabalho realizado pelo SQL Server, cheguei até pensar que isso poder ser considerado uma “Vídeo aula”, espero não estar exagerando, mas a maneira que é demonstrado a evolução de execução da nossa query nos faz pensar e até mesmo imaginar que estamos assistindo um pequeno vídeo ou webcast.

Outra consideração que podemos fazer em relação ao Live Query Statistics, é a capacidade de permitir uma análise na linear e precisa de cada parte do processament realizado por uma query, bem como, o seu próprio debug se torma mais flexível e inteligente.

Colocando a mão na massa….na verdade no teclado

Para tentar demonstrar como podemos utilizar esta nova funcionalidade, vamos utilizar o mesmo ambiente criado no artigo: https://pedrogalvaojunior.wordpress.com/2015/08/12/monitorando-o-progresso-de-execucao-de-querys-em-tempo-real-no-microsoft-sql-server-2014/. Trabalhando como o Database: DBMonitor e a Table: BigTable.

Em nosso ambiente de teste, estou utilizando a última versão do Management Studio 2015 chamada de Preview September 2015, que você poderá baixar acessando: http://blogs.msdn.com/b/sqlagent/archive/2015/09/30/sql-server-management-studio-september-2015-preview.aspx ou https://msdn.microsoft.com/en-us/library/mt238290.aspx.

Vale ressaltar que este último preview corresponde a versão CTP 2.4 do Microsoft SQL Server 2016, caso você queira saber mais sobre esta versão preview acesse: http://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016

Para começar a brincadeira, vou utilizar o select apresentando abaixo denominado Código 1:

— Código 1 – Consultando os dados da Tabela BigTable —

Use DBMonitor

Go

 

Select Top 100000 OrderID,

CustomerID,

Format(OrderDate, ‘dd/mm/yyyy – hh:mm’) As ‘Date’,

Round(Value,2) As ‘Value’,

CONCAT(‘Teste de execução do Live Query Statistics – ‘,GetDate()) As ‘Mensagem’

From BigTable

Order By CustomerID Desc

Go

 

Analisando de forma superficial o Código 1, você pode observar que estou fazendo uso do comando Top para retornar 100.000(Cem mil) linhas de registros existentes dentro da tabela BigTable, além disos, estou fazendo uso das funções Format e Concat, ambas funções string introduzida no Microsoft SQL Server 2012, que nos permite realizar a formatação de valores e concatenação de textos respectivamente. Até aqui tranquilo, nada de diferente, podemos continuar, nos preparando para execução deste Select, onde antes de clicar no botão Execute ou teclar F5, vamos neste momento habilitar o Live Query Statistics, localizando este botão na Toolbar – SQL Editor existente em nosso Management Studio, conforme apresenta a Figura 1, a seguir:

lqs
Figura 1 – Toolbar – SQL Editor.

Observe que logo após os botão Include Atual Execution Plan, foi adicionado um novo botão, chamado Live Query Statistics, conforme apresenta a Figura 2 abaixo:

lqs1

Figura 2 – Botão – Live Query Statistics.

Agora, basta você clicar neste botão para que o Management Studio realiza a ativação do mesmo e permita sua apresentação durante a execução da nossa query, sendo assim, clique no botão em seguida selecione o nosso bloco de código Select e tecle F5 ou Execute.

 

A partir do momento que o SQL Server começa a executar nossa query, o Management Studio adiciona em sua guia de resultados e mensagens uma nova Guia rotulada: Live Query Statistics, conforme apresenta a Figura 3 a seguir:

lqs2

Figura 3 – Guia – Live Query Statistics apresentando durante o processamento do Código 1.

Se tudo correu bem esta guia esta sendo apresentada neste momento no Management Studio e você vai poder acompanhar em real time, todo fluxo de processamento do nosso select, observe que as linhas que interligam cada operador estão neste momento desenhadas de forma pontilhada, indicado que esta ocorrendo um troca de dados, onde estas linhas e posteriormente as respectivas setas serão preenchidas completamente após a conclusão da execução da nossa query ou de acordo com o termino de processamento de cada operador.

Para ilustrar melhor a execução do Live Query Statistics disponibilizei um vídeo que poderá nos ajudar na compreensão:

Outra maneira de habilitar e acompanhar todo trabalho realizado LQS, pode ser feito através da ferramenta Activity Monitor, onde será apresentada a opção Show Live Execution Plan, dentro da guia Active Expensive Queries conforme apresenta a Figura 4 na sequência:

lqs4

Figura 4 – Activity Monitor – Opção Show Live Execution Plan.

Considerações

Como tudo no mundo nada é 100% perfeito, maravilhoso e principalmente 100% utilizável, isso também se aplica para o Live Query Statistics que até o presente momento possui algumas limitações, sendo elas:

  • Não possui suporte para ColumnStoreIndex;
  • Tabelas do tipo Memory-Optimized não são suportadas; e
  • Compilação de Stored Procedures nativas do SQL Server também não são suportadas.

Outro detalhe muito importante, esta relacionado a saúde das estatísticas existentes em nosso banco de dados, sejam elas estatísticas criadas automaticamente para nossos tabelas e índices, como também, estatísticas internas, caso estes componentes não mantenham-se atualizados o Live Query Statistics também será impactado da mesma forma que o Query Processor e Query Optimizer na identifação e processamento de uma query. Para evitar este tipo de cenário, torna-se recomendável fazer uso do comando Update Statistics ou da System Stored Procedure SP_UpdateStats. Caso você deseja saber mais sobre estas funcionalidades acesse:

Conclusão

Com certeza, o Live Query Statistics nova feature adicionada o novo Microsoft SQL Server 2016, vai proporcionar uma grande revolução no trabalho dos profissionais que trabalham com banco de dados. Esta capacidade de conseguir em tempo real acompanhar todo processamento realizado pelo SQL Server, torna este recurso um ferramenta indispensável na identificação de possível problemas de performance que podem estar relacionados ao SQL Server.

Observar, acompanhar, analisar e compreender o fluxo de processamento realizado pelo Query Processor através de um plano de execução ao vivo, obtendo dados estatísticos processamentos naquele momento trazem uma nova visão aos Administradores de Banco de Dados, onde estes profissionais terão maior precisão e argumentos mais concretos na tomada de decisão de uma possível mudança de arquitetura e infraestrutura.

Espero que você tenha gostado deste artigo, que as informações compartilhadas aqui possam lhe ajudar.

Mais uma vez obrigado.

Até a próxima.