Material de Apoio – Agosto 2017


Boa tarde pessoal!

Salve, salve amantes de banco de dados, Tudo bem?

Este é mais um post da sessão Material de Apoio, sendo o terceiro no decorrer de 2017 e de número 153 no total desta sessão.

Já passamos da metade de 2017, que loucura isso, como a rotina do dia a dia não nos deixa perceber o quanto o tempo na para de correr. Falando justamente da correria da nossas vida, a relação de arquivos compartilhadas neste post poderá justamente lhe ajudar a economizar muito do seu tempo.

O post de hoje

Para aqueles que já acompanham o meu blog a um certo tempo, os posts dedicados a sessão Material de Apoio, possuem o objetivo de compartilhar o conhecimento de recursos, funcionalidades e procedimentos que podemos realizar no Microsoft SQL Server.

Hoje não será diferente, estou trazendo alguns dos mais recentes scripts  catalogados nos últimos meses, que atualmente estão compondo a minha galeria de códigos formada ao longo dos anos de trabalho como DBA, e hoje principalmente como Professor de Banco de Dados.

Neste post você vai encontrar arquivos relacionados com os seguintes temas:

  • Cláusula Values;
  • Comando Distinct;
  • Comando Select;
  • Comando Top;
  • CTE Recursiva para geração de sequência de datas;
  • CTE Recursiva para geração de sequência numérica de CEPs;
  • Extended Events;
  • Função Format;
  • Função PARSE;
  • Funções de Ranking – Row_Number;
  • Monitoramento de senhas;
  • Operador Cross Apply;
  • Operador Outer Appy;
  • Recursos bloqueados;
  • SPDIDs de Conexões;
  • SPIDs de usuários; e
  • User Defined Function para cálculo de anos em colunas computadas.

Tenho a certeza que este conteúdo poderá lhe ajudar muito em seus atividades profissionais e acadêmicas, fique a vontade para copiar, editar, compartilhar e distribuir estes arquivos com seus contatos.

Material de Apoio

A seguir apresento a relação de scripts selecionados:

 

 

 

 

 

 

 

 

 

Por questões de compatibilidade com a plataforma WordPress.com, todos os arquivos estão renomeados com a extensão .doc ao final do seu respectivo nome, sendo assim, após o download torna-se necessário remover esta extensão, mantendo somente a extensão padrão .sql.

Nota: Todos os arquivos disponibilizados foram obtidos ou criados com autorização de seus autores, sendo estes, passíveis de direitos autorais.

Links

Caso você queira acessar os posts anteriores da sessão, não perca tempo utilize os links listados abaixo:

Agradecimento

Quero agradecer imensamente a sua visita, espero lhe encontrar muitas vezes no decorrer deste ano em meu blog.

Não deixe de acessar os outros posts das demais sessões, e o próximo post desta sessão será publicado no mês de Novembro, até lá continue curtindo sua vida e compartilhando suas experiência.

Um forte abraço.

SQL Server Management Studio 17.2 liberado para download


Você conhece o SQL Server Management Studio?

SQL Server Management Studio é um ambiente integrado para o gerenciamento de qualquer infra-estrutura SQL do SQL Server banco de dados SQL. SQL Server Management Studio fornece ferramentas para configurar, monitorar e administrar as instâncias de SQL. Use o SQL Server Management Studio para implantar, monitorar e atualizar os componentes de camada de dados usados por suas aplicações, bem como construir consultas e scripts.

Use o SQL Server Management Studio (SSMS) para consultar, projetar e gerenciar seus bancos de dados e data warehouses, onde quer que estejam – no computador local ou na nuvem.

SQL Server Management Studio é grátis!

Baixar o SQL Server Management Studio 17,2

Baixar o SQL Server Management Studio 17,2 atualizar pacote (atualizações 17 para 17,2)

A instalação de 17 SSMS não atualizar ou substituir as versões do SQL Server Management Studio 16.x ou anterior. SSMS 17 instalações lado a lado com as versões anteriores para que ambas as versões estão disponíveis para uso. Se um computador contiver instalações lado a lado de SQL Server Management Studio, verifique se que você começar a versão correta para suas necessidades específicas. A versão mais recente é rotulado como Microsoft SQL Server Management Studio 17e tem um novo ícone:

SSMS 17.x

Informações de versão

O número de versão: 17,2 o número de compilação para esta versão: 14.0.17177.0.

Novidades

SSMS 17,2 é a versão mais recente do SQL Server Management Studio. A geração de 17 do SQL Server Management Studio fornece suporte para quase todas as áreas de recurso no SQL Server 2008 através de SQL Server de 2017. Versão 17 também suporta SQL Analysis Service PaaS.

Versão 17,2 inclui:

    • Autenticação de vários fatores (AMF)
      • Autenticação de usuário múltiplo AD Azure para autenticação Universal com autenticação de vários fatores (UA com AMF)
      • Um novo campo de entrada de credencial do usuário foi adicionado para autenticação Universal com AMF para oferecer suporte à autenticação multi-usuário.
    • A caixa de diálogo de conexão agora suporta os seguintes métodos de 5 autenticação:
      • Autenticação do Windows
      • Autenticação do SQL Server
      • Active Directory – Universal, com o apoio do MFA
      • Active Directory – senha
      • Active Directory – integrado
    • Banco de dados de importação/exportação para assistente de DacFx agora pode usar autenticação Universal com AMF.
    • ADAL biblioteca gerenciada usada pela autenticação Azure AD Universal com AMF foi atualizada para versão 3.13.9.
    • Uma nova interface CLI suportando configuração de admin AD Azure para banco de dados SQL e SQL Data Warehouse.
    • Janela de saída possui entradas para consultas executadas durante a expansão de nós do pesquisador de objetos.
    • Habilitado o modo de exibição designer para bancos de dados SQL Azure
    • Mudaram-se as opções de script padrão para scripts de objetos de Object Explorer no SQL Server Management Studio:
      • Anteriormente, o padrão em uma instalação nova era ter o destino do script gerado a versão mais recente do SQL Server (atualmente SQL Server 2017).
      • No SSMS 17,2 foi adicionada uma nova opção: Configurações de Script Match a fonte. Quando definida como True, o script gerado destina-se a mesma versão, tipo do motor e do motor edition como servidor do objeto sendo roteirizado é de.
      • O valor de Configurações de Script Match a fonte é definido para True por padrão, para que novas instalações do SQL Server Management Studio automaticamente padrão serão sempre scripts de objetos para o mesmo destino que o servidor original.
      • Quando o valor de Configurações de Script Match a fonte é definido como False, as opções de destino script normal serão habilitadas e funcionam como fizeram anteriormente.
      • Além disso, todas as opções de script foram movidas para a sua própria seção – Opções de versão. Eles não estão mais sob Opções gerais de Scripting.
    • Adicionado suporte para nuvens nacional em “Restaurar a partir de URL”
    • QueryStoreUI relatórios agora suporta adicional métricas (número de linhas, DOP, CLR tempo etc.) do sys.query_store_runtime_stats.
    • IntelliSense agora é suportado por banco de dados SQL Azure.
    • Segurança: caixa de diálogo conexão será o padrão para não confiar em certificados de servidor e solicitando criptografia para conexões de banco de dados SQL Azure
    • Melhorias gerais em torno de suporte para o SQL Server no Linux:
      • Nó de correio do banco de dados está de volta
      • Abordadas algumas questões relacionadas com caminhos
      • Melhorias de estabilidade de Monitor de atividade
      • Caixa de diálogo Propriedades de Conexão exibe a plataforma correta
    • Relatório de servidor Dashboard desempenho agora disponível como um relatório padrão:
      • Pode se conectar ao SQL Server 2008 e versões mais recentes.
      • Subrelatório de índices ausentes usa Pontuação para ajudar a identificar índices mais útil.
      • Estatísticas de espera histórica sub relatam agora agregados esperas ser categoria. Ocioso e esperas de sono filtrados por padrão.
      • Novo histórico travas subrelatório.
    • Pesquisa de plano de execução nó permite buscar em Propriedades do plano. Facilmente procure qualquer propriedade de operador como nome da tabela. Para usar esta opção quando visualizar um plano:
      • Botão direito do mouse no plano e no menu de contexto clique na opção Localizar nó
      • Usar CTRL + F

Para obter uma lista completa de alterações, consulte SQL Server Management Studio – Changelog (SSMS).

Suporte para versões

    • Esta versão do SQL Server Management Studio funciona com todas as versões suportadas do SQL Server 2008 – 2017 de SQL Server e fornece o maior nível de suporte para trabalhar com as mais recentes características de nuvem no banco de dados SQL Azure e SQL Azure Data Warehouse.
    • Não há nenhum bloco explícito para SQL Server 2000 ou SQL Server 2005, mas alguns recursos podem não funcionar corretamente.
    • Além disso, o SSMS 17 pode ser instalado lado a lado com o SQL Server Management Studio 16.x ou SQL Server 2014 SSMS e versões anteriores.

Sistemas operacionais com suporte

Esta versão do SQL Server Management Studio suporta as seguintes plataformas de 64 bits quando usado com o mais recente disponível service pack:

    • 10 Windows (64 bits)
    • Windows 8.1 (64 bits)
    • Windows 8 (64 bits)
    • Windows 7 (SP1) (64-bit)
    • Windows Server 2016 *
    • Windows Server 2012 R2 (64 bits)
    • Windows Server 2012 (64 bits)
    • Windows Server 2008 R2 (64 bits) 

* O SSMS 17 baseia-se na shell do Visual Studio 2015 isolada, que foi lançado antes de 2016 de servidor Windows. Microsoft leva a sério o compatibilidade de aplicativo e garante que já enviados com aplicações continuam a correr sobre as versões mais recentes do Windows. Para minimizar problemas na execução do SQL Server Management Studio em 2016 de servidor Windows, certifique-se de que SSMS tem todas as últimas atualizações aplicadas. Se você tiver quaisquer problemas com o SQL Server Management Studio no Windows Server 2016, contate o suporte. A equipe de suporte determina se o problema for com o SQL Server Management Studio, Visual Studio, ou com compatibilidade do Windows. A equipe de suporte roteia a questão para a equipe apropriada para maiores investigações.

Idiomas disponíveis

Esta versão do SQL Server Management Studio pode ser instalado nos seguintes idiomas:+

SQL Server Management Studio 17,2:
chinês (República Popular da China) | Chinês (Taiwan) | Inglês (Estados Unidos) | Francês | Alemão | Italiano | Japonês | Korean | Português (Brasil) | Russas | Espanhol

SQL Server Management Studio 17,2 atualizar pacote (atualizações 17 para 17,2):
chinês (República Popular da China) | Chinês (Taiwan) | Inglês (Estados Unidos) | Francês | Alemão | Italiano | Japonês | Korean | Português (Brasil) | Russas | Espanhol

Download de versões anteriores

Versões anteriores do SQL Server Management Studio

Links adicionais

Fontes e Direitos Autorais: Microsoft – 07/08/2017 – https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Microsoft disponibiliza o SQL Server 2017 CTP 2.0


A Microsoft anunciou nesta semana em seu blog a disponibilidade no TechNet Evaluation Center do SQL Server 2017 CTP 2.0, a versão de testes pública mais recente do novo SQL Server.

Performance inigualável
Faça consultas até 100 vezes mais rápido do que o disco com columnstore in-memory e transações até 30 vezes mais rápido com OLTP in-memory.

Menos vulnerável
Melhore a segurança com criptografia em repouso e em movimento. O SQL Server é o banco de dados menos vulnerável nos últimos sete anos no banco de dados de vulnerabilidades do NIST.

Inteligência em tempo real
Obtenha insights transformadores com até 1 milhão de previsões por segundo usando o Python interno e a integração da linguagem R e obtenha o BI móvel completo em qualquer plataforma.

Qualquer aplicativo, em qualquer lugar
Crie aplicativos modernos usando quaisquer dados e qualquer linguagem, na infraestrutura local e na nuvem.

Microsoft disponibiliza o SQL Server 2017 CTP 2.0Faça o download do SQL Server 2017 CTP 2.0
O SQL Server 2017 CTP 2.0 para Windows (64 bits) está disponível para download aqui como uma imagem ISO e como um arquivo CAB nos seguintes idiomas: Inglês, alemão, espanhol, japonês, italiano, francês, russo, chinês simplificado, chinês tradicional, português (Brasil), coreano.
As versões para Linux, Docker, Azure e Mac OS estão disponíveis aqui.

Fontes e Direitos Autorais: Baboo.com.br – 20 abr 2017 | 9:40 am.

Atualização Cumulativa 5 para SQL Server 2014 SP2


A Microsoft disponibilizou para download nesta semana a Atualização Cumulativa 5 para SQL Server 2014 SP2. Esta atualização contém correções para os problemas que foram descobertos depois do lançamento do SQL Server 2014 SP2. O SP2 foi lançado pela Microsoft em julho de 2016.

Atualização Cumulativa 5 para SQL Server 2014 SP2

De acordo com o artigo KB4013098 publicado no site de suporte da Microsoft, esta atualização traz correções para múltiplos bugs.
Entre os bugs corrigidos estão um que causa erro System.NullReferenceException quando você usa autenticação personalizada no SSRS 2014 e um que causa o crash do SQL Server quando o comando DBCC CLONEDATABASE é utilizado.

A lista completa com todos os bugs corrigidos por esta atualização cumulativa pode ser vista no link acima.

Atualização Cumulativa 5 para SQL Server 2014 SP2A Microsoft disponibilizou para download nesta semana a Atualização Cumulativa 5 para SQL Server 2014 SP2. Esta atualização contém correções para os problemas que foram descobertos depois do lançamento do SQL Server 2014 SP2.

A Atualização Cumulativa 5 para SQL Server 2014 SP2 está disponível para download aqui em múltiplos idiomas para plataformas 32 e 64 bits.
Para quem ainda usa o SQL Server 2014 com SP1, a Atualização Cumulativa 12 também está disponível. Faça o download aqui.
Fontes e Direitos Autorais: Baboo.com.br – 18 abr 2017 | 8:24 am.

Dica do Mês – Microsoft SQL Server – Identificando as transações que estão utilizando o Transact Log


Bom dia pessoal, tudo bem?

Véspera de feriado religioso e um dos mais importantes para boa parte da população mundial! Justamente por ser véspera de feriado hoje é um daqueles dias que qualquer profissional da área de banco de dados reza para que nada ocorra de errado próximo ás 17hrs ou mais conhecido como 5 horas da tarde.

Pensando neste tipo de necessário o post de hoje dedicado a sessão Dica do Mês tem o objetivo de ajudar você profissional que esta em apuros neste momento tentando identificar o que pode estar ocorrendo em seu ambiente ou servidor Microsoft SQL Server.

Hoje vou apresentar como você pode no Microsoft SQL Server a partir da versão 2008 R2 identificar quais transações estão realizando o acesso e demandando informações para o Transact – Log, arquivo utilizado por qualquer banco de dados existente em seu servidor ou instância SQL Server para registrar dados relacionados as transações atuais ou já processadas, sendo este mais conhecido como log de transações.

Estão vamos em frente…..


Introdução

Quando se referimos ao log de transações, temos sempre aquele boa e velha definição, “o transact log é o arquivo utilizado pelo banco de dados para registrar o que esta sendo processado por nossas transações, conhecido como o dedo duro”, na verdade o transact-log é bem mais do que isso, trata-se de um dos principais componentes de qualquer banco de dados criado no Microsoft SQL Server que nos permite através do seu uso garantir a continuidade e disponibilidade de nossos dados para diversos cenários de armazenamento e principalmente recuperação de informações.

Durante o processamento de uma ou mais querys o transact-log pode apresentar comportamentos diversas de acordo com o que esta sendo processado, mas principalmente no que se relacionado aos processos de escrita e leitura do log, onde nossas querys podem gerar processos de gravação de dados no transact-log e internamente o SQL Server pode necessitar a acessar outros dados em log para atender outras possíveis demandas.

Estes processos são conhecidos como leitura ou escrita do transact-log, situações que podem impactar aleatoriamente no processamento de nossas querys.

Pensando neste tipo de possibilidade, o post de hoje visa ilustrar e apresentar como através do Management Studio ferramenta de administração e gerenciamento do Microsoft SQL Server podemos em conjunto com as DMVs – Dynamic Management Views listadas abaixo, monitorar, catalogar e identificar quais querys ou transações estão fazendo uso do Transact-Log em possíveis processos de leitura ou escrita do log.

Dynamic Management Views

Para saber mais sobre cada DMV acesse as referências apresentadas no final do post:

  • sys.dm_tran_session_transactions;
  • sys.dm_tran_active_transactions;
  • sys.dm_tran_database_transactions;
  • sys.dm_exec_sessions;
  • sys.dm_exec_requests; e
  • sys.dm_exec_sql_text.

O Cenário

Para tentar ilustrar como podemos realizar de maneira fácil este tipo de monitoramento e identificação, vamos criar um pequeno cenário através do Bloco de Código 1, onde estaremos realizando a criação de um novo banco de dados denominado UsingTransactLog para armazenar a tabela TabelaTransactionLog.

— Bloco de Código 1 —
— Criando o banco de dados —
Create Database UsingTransactLog
Go

— Acessando o banco de dados —
Use UsingTransactLog
Go
— Criando a tabela —
Create Table TabelaTransactLog
(TransactionID Int Default Current_Transaction_ID(),
TransactionUser Varchar(100) Default System_User,
TransactionDate DateTime Default Current_TimeStamp)
Go

 

Note que nosso tabela TabelaTransactLog possui um simples estrutura composto por três colunas: TransactionID, TransactionUser e TransactionDate, sendo estes elementos básicos utilizados para catalogar o ID da transação em processamento, o usuário conectado ao banco de dados e data/hora do momento da inserção da linha.

Até aqui nada de tão importante, mas importante para podemos simular o uso do log, nosso próximo passo consiste no processamento do Bloco de Código 2, onde estaremos realizando o processamento de uma transação de inserção de 50.000 mil linhas de registros, sendo a operação de insert uma das mais diversas operações que demando processos de escrita ao transact – log, sendo assim, apresento a seguir o Bloco de Código 2:

— Bloco de Código 2 —
Insert Into TabelaTransactLog Default Values
Go 50000

Observe que não estamos passando nenhum tipo de valores para nossas colunas, na verdade estou forçando o SQL Server a utilizar a criação de valores padrões durante o processamento de cada linha de registro através da instrução Default Values (valores padrões), o que vai obrigar nossa instância e ter que gerar valores durante o tempo de processamento e posteriormente registrar em log.

Muito bem, o processamento desta massa de dados, teremos a necessidade de abrir uma nova query para justamente fazer uso do Bloco de Código 3, sendo este o principalmente elemento do nosso cenário, a query que nos permiti monitorar e identificar as transações que estão em tempo real utilizando o transact-log. Então abra uma nova query e log o Bloco de Código 3 apresentado a seguir:

— Bloco de Código 3 —
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Go

SELECT tst.session_id As ‘Sessão’,
es.original_login_name As ‘Login’,
DB_NAME(tdt.database_id) AS ‘Database’,
DATEDIFF(SECOND, tat.transaction_begin_time, GETDATE()) AS ‘Tempo decorrido’,
tdt.database_transaction_log_record_count AS ‘Espaço Utilizado’,
CASE tat.transaction_state
WHEN 0 THEN ‘A transação não foi completamente inicializada ainda…’
    WHEN 1 THEN ‘A transação foi inicializada, mas não começou…’
    WHEN 2 THEN ‘A transação esta ativa…’
    WHEN 3 THEN ‘A transação foi encerrada…’
    WHEN 4 THEN ‘Foi iniciado o processo de confirmação sobre o transação distribuída…’
    WHEN 5 THEN ‘A transação está em estado preparação e esperando resolução…’
    WHEN 6 THEN ‘A transação foi confirmada…’
    WHEN 7 THEN ‘A transação esta sendo revertida para o estado anterior…’
    WHEN 8 THEN ‘A transação foi revertida para o estado anterior…’
   ELSE ‘Estado da transação desconhecido’
   END AS ‘Estado da Transação’,
SUBSTRING(TXT.text, ( er.statement_start_offset / 2 ) + 1, ((CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), TXT.text)) * 2
ELSE er.statement_end_offset
END – er.statement_start_offset ) / 2 ) + 1) AS ‘Query Atual’,
TXT.text AS ‘Query relacionada’,
es.host_name As ‘Hostname’,
   CASE tat.transaction_type
    WHEN 1 THEN ‘Transação Read/Write’
    WHEN 2 THEN ‘Transação Read-Only’
    WHEN 3 THEN ‘Transação de Sistema’
                WHEN 4 THEN ‘Transação distribuída’
            ELSE ‘Tipo de Transação desconhecido’
            END AS ‘Tipo da Transação’,
tat.transaction_begin_time AS ‘Iniciado em’
FROM sys.dm_tran_session_transactions AS tst INNER JOIN sys.dm_tran_active_transactions AS tat
ON tst.transaction_id = tat.transaction_id
INNER JOIN sys.dm_tran_database_transactions AS tdt
ON tst.transaction_id = tdt.transaction_id
INNER JOIN sys.dm_exec_sessions es
ON tst.session_id = es.session_id
INNER JOIN sys.dm_exec_requests er
ON tst.session_id = er.session_id
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) TXT
ORDER BY [Tempo decorrido] DESC
Go
Pois bem, você pode estar querendo saber um pouco mais sobre o que exatamente esta acontecendo ao processar o Bloco de Código 3, pode ficar tranquilo que a seguir vou fazer um pequeno overview sobre este bloco de código, começando pelo conjunto de colunas retornadas por ele:
  • Sessão – Apresenta o ID da sessão que esta utilizando o transact-log;
  • Login – Nome da conta de login que esta conectada ao SQL Server;
  • Database – Nome do banco de dados utilizado pela query que esta acessando o transact-log;
  • Tempo decorrido – Representa o tempo de processamento que o query esta demandando para utilizar o transact-log;
  • Log Record Count– Identifica a quantidade de registros de log gerados pela query ou transações em processamento;
  • Estado da transação – Esta coluna apresenta o estado atual da query em processamento, sendo este formado por um conjunto de valores;
  • Query Atual – Apresenta as instruções que estão sendo processadas por cada query;
  • Query Relacionada– Apresenta as instruções processadas por querys que podem estar relacionadas com as atuais querys em processamento;
  • Hostname – Apresenta o nome dos hosts utilizados por cada query em processamento;
  • Tipo de Transação – Identifica se a transação em processamento esta realizando acesso de leitura ou escrita ao log, bem como, se esta query é uma query de sistema ou distribuída; e
  • Iniciado em – Apresenta o horário de início do acesso ao transact-log por parte da query em processamento.

Agora que você já conhece um pouco sobre cada coluna que será retornada após o processamento do Bloco de Código 3, vou abordar o uso da instrução Set Transaction Isolation Level declarada no início do código, que possui a finalidade de alterar no nível de isolamento do nosso banco de dados para Read Uncommitted afim de força o SQL Server a descartar ou desconsiderar qualquer possível ocorrência de bloqueios tanto no nível de tabela e registros, mas principalmente no escopo de banco de dados.

Nota: Se você me perguntar que isso é obrigatório ser feito para conseguir identificar as querys que estão utilizando o transact-log eu vou responder NÃO, isso não é obrigatório, mas pode ser considerada uma possível solução para garantir que o Bloco de Código 3 possa ser processado e consultar as dynamic management views na busca das informações catalogadas por ela em tempo de execução.

Ufa, estamos quase lá, agora nos resta fazer a execução do mesmo e observar o retorno dos dados coletados por este bloco de código, com base, na Figura 1 apresentada abaixo:

Figura 1 – Relação de querys em execução utilizando transact-log.

Perfeito, nosso monitoramento funcionou, conseguimos coletar os dados referentes as querys que estão neste momento em processamento fazendo acesso e utilizando o transact-log criado para o banco de dados UsingTransactLog.

Isso não é sensacional, desta forma, chegamos ao final de mais um post dedicado a sessão Dica do Mês, espero que você tenha gostado.

Referências

Post anteriores

  1. https://pedrogalvaojunior.wordpress.com/2017/03/01/dica-do-mes-microsoft-sql-server-2016-sp1-novo-argumento-use-hint-disponivel-para-query-hints/
  2. https://pedrogalvaojunior.wordpress.com/2017/01/16/dica-do-mes-conhecendo-a-nova-dmf-sys-dm_exec_input_buffer-no-microsoft-sql-server-2016/

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

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

Conclusão

Administrar, gerenciar, cuidar e prover um ambiente sempre no melhor estado possível não é uma das atividades mais tranquilas e simples desempenhadas por profissionais ou administradores de banco de dados, mas também não pode ser considerada um “bicho de sete cabeças” ou uma “caixa preta” ainda mais quando este servidor de banco de dados utiliza o Microsoft SQL Server.

Neste post você pode observar que através do uso de alguns DMVs – Dynamic Management Views a Microsoft nos permite coletar, analisar e entender de forma visual e muito intuitiva como o um servidor ou instância SQL Server gerencia o que esta sendo processado por nossas aplicações, querys ou transações no que se relaciona aos seus componentes e recursos internas, algo que nos permite em diversas situações de administração ou manutenção tentar identificar o que pode estar ocorrendo, bem como, impactando em nosso ambiente.

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, bom feriado, espero que neste momento você não esteja no seu trabalho tentando resolver problemas do seu servidor (kkkkk).

Valeu….

Short Scripts – Março 2017


Hoje é sexta – feira, sexta – feira…

Salve, salve comunidade e amantes de bancos de dados e SQL Server, Tudo bem? Mais uma final de semana próximo após uma longa semana de muito trabalho, se eu for falar de muito trabalho, sinceramente  esta semana foi complicada, repleta de novidades e muita troca de conhecimento.

Conforme o prometido no final de 2016, estou retornando com o primeiro post da sessão Short Scripts, sessão criada a alguns anos no meu blog que lentamente esta conseguindo ajudar diversos profissionais da área de banco de dados na busca por exemplos de códigos que possam solucionar ou elucidar na resolução de um determinado problema.

O post de hoje

Como já destaquei acima, este é o primeiro post de 2017 dedicado exclusivamente a sessão Short Scripts, na relação de scritps selecionados para hoje, você vai poder encontrar códigos relacionados com os seguintes assuntos:

  • Auditoria,
  • Comando Intersect,
  • Comando OpenQuery,
  • Comando Order By,
  • Datatype Char,
  • Datatype Int,
  • DMF Sys.dm_exec_sessions,
  • DMV Sys.system_internals_partitions,
  • DMV Sys.system_internals_allocation_units,
  • Função Substring,
  • Índices,
  • Informações sobre conexão de usuário,
  • Páginas de Dados,
  • Trigger, e
  • Variáveis.

Então mãos no teclado, a seguir apresento os códigos e exemplos selecionados para o Short Script – Março 2017. Vale ressaltar que 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. Fique a vontade para compartilhar, comentar, melhorar cada um destes códigos.

Short Scripts

— Short Script 1 – Realizando Auditoria in Live —

SELECT [Spid] = session_Id
, ecid
, [Database] = DB_NAME(sp.dbid)
, [User] = nt_username
, [Status] = er.status
, [Wait] = wait_type
, [Individual Query] = 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)
,[Parent Query] = qt.text
, Program = program_name
, Hostname
, nt_domain
, start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50              — Ignore system spids.
AND session_Id NOT IN (@@SPID)     — Ignore this current statement.
ORDER BY 1, 2
Go

— Short Script 2 – Utilizando comando Intersect com Datatypes Char e Int —

Create Table #A (x Char(2));
Go
Insert Into #A Values (‘1’);
Insert Into #A Values (‘6’);
Insert Into #A Values (‘2’);
Insert Into #A Values (‘3’);
Insert Into #A Values (‘5’);
Insert Into #A Values (‘5’);
Insert Into #A Values (‘6’);
Insert Into #A Values (‘9’);
Go
Create Table #B (M BigInt);
Go
Insert Into #B Values(5);
Insert Into #B Values(5);
Insert Into #B Values(6);
Insert Into #B Values(7);
Insert Into #B Values(7);
Go
— (Select #1)
SELECT x AS ‘Select #1’ FROM #A
INTERSECT SELECT M FROM #B
Go
— (Select #2)
SELECT DISTINCT(x) AS ‘Select #2’
FROM #A LEFT OUTER JOIN #B
ON #A.x = #B.M
Go
— (Select #3)
SELECT DISTINCT(x) AS ‘Select #3’
FROM #A LEFT OUTER JOIN #B
ON #A.x = #B.M
Go
— (Select #4)
SELECT DISTINCT(x) AS ‘Select #4’
FROM #A INNER JOIN #B
ON #A.x = #B.M
Go
— (Select #5)
SELECT x AS ‘Select #5’
FROM #A INNER JOIN #B
ON #A.x = #B.M
Go
— Short Script 3 – Utilizando comando OpenQuery com variáveis —
— Valores Básicos —
DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT  @VAR = ‘teste’
SELECT  @TSQL = ‘SELECT * FROM OPENQUERY(MeuLinkedServer,”SELECT * FROM MinhaTabela WHERE User = ””’ + @VAR + ”””’)’
EXEC (@TSQL)
Go
— Query Complexa —
DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = ‘MyLinkedServer’
SET @OPENQUERY = ‘SELECT * FROM OPENQUERY(‘+ @LinkedServer + ‘,”’
SET @TSQL = ‘SELECT au_lname, au_id FROM pubs..authors”)’
EXEC (@OPENQUERY+@TSQL)
— Use o Sp_executesql procedimento armazenado —
DECLARE @VAR char(2)
SELECT  @VAR = ‘CA’
EXEC MyLinkedServer.master.dbo.sp_executesql
N’SELECT * FROM pubs.dbo.authors WHERE state = @state’,
N’@state char(2)’,
@VAR
Go
— Short Script 4 – Realizando order by com base na função SubString —
Declare @Tabela Table
(Codigo VarChar(15))
Insert Into @Tabela Values(‘191-XXX-003’)
Insert Into @Tabela Values(‘192-XXX-003’)
Insert Into @Tabela Values(‘193-XXX-003’)
Insert Into @Tabela Values(‘194-XXX-003’)
Insert Into @Tabela Values(‘195-XXX-003’)
Insert Into @Tabela Values(‘191-XXX-001’)
Insert Into @Tabela Values(‘192-XXX-001’)
Insert Into @Tabela Values(‘193-XXX-001’)
Insert Into @Tabela Values(‘194-XXX-001’)
Insert Into @Tabela Values(‘195-XXX-001’)
Insert Into @Tabela Values(‘191-XXX-002’)
Insert Into @Tabela Values(‘192-XXX-002’)
Insert Into @Tabela Values(‘193-XXX-002’)
Insert Into @Tabela Values(‘194-XXX-002’)
Insert Into @Tabela Values(‘195-XXX-002’)
Select * from @Tabela
Order By SubString(codigo,Len(Codigo)-2,3) Asc
Go
— Short Script 5 – Monitorando 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
— Short Script 6 – Identificando tabelas e suas respectivas páginas de dados —
— Exemplo 1: —
SELECT P.partition_id,
OBJECT_NAME(P.object_id) As ObjectName,
U.allocation_unit_id,
SU.First_Page,
SU.Root_Page,
SU.First_IAM_Page
From Sys.Partitions As P INNER JOIN Sys.Allocation_Units As U
ON P.hobt_id = U.container_id
Inner Join Sys.system_internals_allocation_units SU
On u.allocation_unit_id = su.allocation_unit_id
Go
— Exemplo 2: —
SELECT SIP.partition_id,
OBJECT_NAME(SIP.object_id) As ObjectName,
sip.rows,
SU.First_Page,
SU.Root_Page,
SU.First_IAM_Page
From Sys.system_internals_partitions As SIP Inner Join Sys.system_internals_allocation_units SU
On sip.partition_id = su.allocation_unit_id
Go
— Short Script 7 – Identificando índices com Escrita Excessiva —
— Quantidade de Índices com Escrita Excessiva em comparação a leitura —
SELECT  OBJECT_NAME(s.object_id),
i.name,
i.type_desc
FROM    sys.dm_db_index_usage_stats s WITH ( NOLOCK ) Inner JOIN sys.indexes i WITH (NOLOCK)
ON s.index_id = i.index_id
AND s.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1
AND s.database_id = DB_ID()
AND s.user_updates > ( s.user_seeks + s.user_scans + s.user_lookups )
AND s.index_id > 1
Go
— Quantidade de Índices com Escrita Excessiva —
SELECT  COUNT(*)
FROM    sys.dm_db_index_usage_stats s WITH ( NOLOCK )
WHERE   OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1
AND s.database_id = DB_ID()
AND s.user_updates > ( s.user_seeks + s.user_scans + s.user_lookups )
AND s.index_id > 1
Go
— Short Script 8 – Identificando o espaço ocupado por conexões em uso —
SELECT A.session_id,
B.host_name, B.Login_Name ,
(user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128 as TotalalocadoMB,
D.Text
FROM sys.dm_db_session_space_usage A Inner JOIN sys.dm_exec_sessions B
ON A.session_id = B.session_id
Inner JOIN sys.dm_exec_connections C
ON C.session_id = B.session_id
CROSS APPLY sys.dm_exec_sql_text(C.most_recent_sql_handle) As D
WHERE A.session_id > 50
and (user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128 > 100 — Ocupam mais de 100 MB
ORDER BY totalalocadoMB desc
COMPUTE sum((user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128)
Go
— Short Script 9 – Obtendo a diferença de datas entre registro anterior e o próximo registro —
Create Table Datas
(ID Int Identity(1,1),
DataInicio Date,
DataFinal Date)
Go
Insert Into Datas Values (GETDATE(), GETDATE()+30)
Insert Into Datas Values (GETDATE()+1, GETDATE()+20)
Insert Into Datas Values (GETDATE()+2, GETDATE()+10)
Insert Into Datas Values (GETDATE(), GETDATE()+5)
Go
— Exemplo 1 —
Select I.ID, I.DataInicio, F.DataFinal,
DateDiff(D, I.DataInicio, F.DataFinal) As Intervalo
From Datas I Left Join Datas F
On I.ID = F.ID + 1

Go

— Exemplo 2 —
SELECT
[current].Id,
[current].Time CurrentValue,
[next].Time          NextValue
FROM #temp AS [current] LEFT JOIN #temp AS [next]
ON [next].Id = (SELECT MIN(Id) FROM #temp

                                 WHERE Id > [current].Id)
Go
— Short Script 10 – Criando um trigger condicional —
–Criando a Table de Novos Produtos–
Create Table NovosProdutos
(Codigo Int Identity(1,1),
Descricao VarChar(10))
–Criando a Table de Histórico Novos Produtos–
Create Table HistoricoNovosProdutos
(Codigo Int,
Descricao VarChar(10))
Go
–Inserindo valores —
Insert Into Novosprodutos Values(‘Arroz’)
Insert Into Novosprodutos Values(‘Arroz1’)
Insert Into Novosprodutos Values(‘Arroz2’)
Insert Into Novosprodutos Values(‘Arroz3’)
Go
–Criando a Trigger para controle de histórico–
Create TRIGGER T_Historico
ON NovosProdutos
for update
AS
IF (Select Descricao from Inserted) <> (Select Descricao from Deleted)
BEGIN
INSERT Into HistoricoNovosProdutos (Codigo, Descricao)
SELECT Codigo, Descricao FROM INSERTED
END
Go
–Fazendo os teste —
Update NovosProdutos
Set Descricao=’Arroz 4′
Where Codigo = 1
Go
Update NovosProdutos
Set Descricao=’Arroz1′
Where Codigo = 2
Go
Select * from NovosProdutos
Go

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 Short Scripts, espero que este material possa lhe ajudar, ilustrando o uso de alguns recursos e funcionalidades do Microsoft SQL Server.

Acredito que você tenha observado que estes códigos são bastante conhecidos em meu blog, todos estão relacionados aos posts dedicados ao Microsoft SQL Server publicados no decorrer dos últimos anos.

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.

Links

Caso você queira acessar os últimos posts desta sessão, não perca tempo acesse os links listados abaixo:

Agradecimento

Mais uma vez obrigado por sua visita, um forte abraço…

Nos encontramos em breve nos próximos posts desta e outras sessões do meu blog, valeu.

#11 – Para que serve


Boa tarde, boa tarde, boa tardeeeeee…..

Tudo bem pessoal?

Hoje 16 de Dezembro, data inesquecível para qualquer corinthiano, estamos completando mais um aniversário da fantástica e memorável conquista do Mundial de Clubes da Fifa, melhor dizendo o Bi-Campeonato Mundial de Clubes em 2012.

Fico honrado com a sua ilustre visita, seja bem – vindo mais uma vez ao meu blog, espero que você consiga encontrar o que esta procurando ou algo que possa lhe agradar.

Este é mais um post da sessão Para que serve, lançada no início de 2016 e que esta chegando ao post de número 11, isso mesmo estamos no décimo primeiro post dedicado a esta sessão que aos poucos esta conseguindo se tornar uma referência de conhecimento diferenciado no meu Blog.

Após esta tradicional saudação, chegou a hora de falar sobre o #11 – Para que serve de hoje, tenho a certeza que você vai gostar….


Introdução

Como você já deve ter percebido os posts relacionados a esta sessão tem o objetivo de apresentar ou até mesmo em outros casos demonstrar como exemplos de código, aplicativos, utilitários, entre outros elementos envolvidos a banco de dados ou gerenciadores de bancos de dados dentro eles o Microsoft SQL Server podem ser utilizados para se obter uma possível solução de um problema, como em outros casos orientar na sua forma de utilização.

Para o post de hoje vou destacar um script que utilizei no decorrer desta semana, na área de uma determinada aplicação, o mesmo não foi a solução do meu problema, mas ajuda de forma considerável.

Basicamente a minha necessidade era identificar ao longo de um período de tempo quais tipos de objetos estavam gerando e acumulando cache em uma instância de banco de dados Microsoft SQL Server 2014, foi justamente para este cenário que de maneira direta realizei o uso da DMF – Dynamic Management Function – sys.dm_exec_cached_plans implementada a partir da versão 2008 do Microsoft SQL Server.

Sys.dm_exec_cached_plans

Esta foi uma das primeiras DMF adicionadas pelo time de desenvolvimento do Microsoft SQL Server na versão 2008, onde a Microsoft introduziu uma nova forma de gerenciamento um servidor ou instância de Banco de Dados.

A sys.dm_exec_cachec_plan tem como finalidade principal retornao conjunto de linhas relacionadas para cada plano de consulta armazenada em cache mantido em memória no SQL Server, possibilitando assim uma execução do conjunto de recursos que necessitam destes objetos de forma mais rápido e simplificada.

Você pode usar essa função de gerenciamento dinâmico para encontrar e identificar dados em tempo real relacionados a:

  • Cached Query Plans;
  • Cached Query Text;
  • Quantidade de memória usada pelo plan cached; e
  • Quantidade de reutilização de plan cached.

Para muitos profissionais, a sys_dm_exec_cached_plans é considerada uma das DMFs mais fácies e práticas para ser utilizada em atividades de análise e manutenção de um banco de dados, devido principalmente por possuir uma sintaxe simples que não requer parâmetros adicionais no momento da sua execução.

#11 Para que serve – Identificando os tipos de cache e quantidade armazenada no Query Plan —

Agora que conhecemos um pouco do que esta relacionada com este post, vamos então conhecer este script que poderá nos ajudar a obter todas as possíveis informações relacionadas aos tipos de cache e demais dados relacionados com esta importante área de armazenamento em memória do Microsoft SQL Server.

Para isso vamos utilizar o Bloco de Código apresentado a seguir, que demonstra como a sys_dm_exec_cached_plans pode ser utilizada:

– Bloco de Código —

sys_dm_exec_cached_plans

Realizando uma rápida análise, fica fácil observar que o uso desta DMF realmente é muito simples, como também, trata-se de um bloco de código com um nível de complexidade muito pequena, onde estamos fazendo uso do conjunto de colunas existente na própria DMF.

A parte mais complexa do código esta relacionado a contagem do total de planos gerados e armazenados em cached para cada tipo de recurso, em conjunto com o total em megabytes ocupado em memória pelo mesmo. Vale ressaltar que este bloco de código foi testado e validado a partir da versão 2008 e demais versões: R2, 2012, 2014 e também 2016.

Após executarmos o bloco de código apresentando anteriormente, o Management Studio deverá retornar um conjunto de colunas e valores similares ao apresentado na Figura 1 apresentada abaixo:

sys_dm_exec_cached_plans-2Figura 1 – Relação de tipos de cache e suas respectivas quantidades armazenadas e memória ocupada.

Agora fica mais fácil notar a existência das colunas Cache TypeTotal Plans e Total MBs, são justamentes estas as colunas que nos permitem encontrar as informações relacionadas aos tipos de cache, total de planos armazenados e espaço ocupado em memória em nosso servidor ou instância de bancos de dados Microsoft SQL Server.

Falando um pouco sobre estas três colunas é possível observar:

Cache Type: Esta coluna apresenta os tipos de cache identificados pela sys_dm_exec_cached_plans.

Total Plans: Retorna a quantidade de Plan Cached armazenadas em tempo real para os respectivos tipos de cache coletados na sys_dm_exec_cached_plans.

Total MBs: Apresenta a quantidade de memória ocupada para cada Cache Type identificados pela sys.dm_exec_plans, sendo este valor correspondente ao total armazenado ao longo do tempo de execução da instância ou servidor de banco de dados, com base, no último processo de reinicialização.

Acredito que agora ficou bem mais fácil entender os dados retornados após o processamento do bloco de código, como também, o que esta DMF pode nos oferecer de recursos em um momento de análise mais aprofundada do uso dos tipos de cached.

Referências

https://msdn.microsoft.com/en-us/library/ms187404.aspx

https://msdn.microsoft.com/en-us/library/ms189488.aspx

https://msdn.microsoft.com/en-us/library/ms179875.aspx

https://msdn.microsoft.com/en-us/library/ms189747.aspx

Links

Caso você ainda não tenha acessado os posts anteriores desta sessão, fique tranquilo é fácil e rápido, basta selecionar uns dos links apresentados a seguir:

https://pedrogalvaojunior.wordpress.com/2016/11/15/10-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2016/10/08/09-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2016/08/06/07-para-que-serve/

Conclusão

Administrar um banco de dados não é uma tarefa das mais complicadas do mundo, mas quando se referimos em administratar um servidor de banco de dados ou conjunto de servidores de bancos de dados o cenário com certeza muda bastante.

Foi pensando neste tipo de situação que compartilhei com vocês hoje este script no #11 – Para que serve, que apresenta como podemos de maneira fácil, rápida, segura e muito prática encontrar informações relacionadas aos tipos de cache existentes no Microsoft SQL Server, suas respectivas quantidades armazenadas e principalmente o espaço ocupado.

Esta não é uma atividade que você vai realizar todos os dias, particularmente falando, foram poucas as vezes que tive a real necessidade de mergulhar mais a fundo nesta parte de uma instância ou servidor de banco de dados, mas sempre vale a pena conhecer, saber que este de funcionalidade existe e pode ser utilizada de forma rápida e prática.

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.

Aproveitando este final de ano, quero lhe desejar um Feliz Natal e Próspero Ano Novo.

Nos encontramos em breve, até lá…..