Script Challenge – 2019 – Post 15


Olá, bom dia comunidade…

Tudo bem? Quarta – feira dia 13/02 estamos no verão, sofrendo muito com este super calor que esta “queimando nossas cacholas”, mas hoje aqui em São Roque, amanheceu um dia bem diferente dos últimos, muito chuva, vento e temperaturas bem amenas, podemos dizer que aquele friozinho gostoso esta de volta.

Pois bem, sou suspeito a dizer sobre o frio, ainda mais por ser fã incondicional de temperatura baixas, devido a ter trabalhado muitos anos dentro de os mais variados datacenters de empresas e clientes suportando “aquelas” altas temperaturas de 16 ou 18 graus.

Mas o que esta mudança de tempo tem haver com este novo post da sessão Script Chalenge, bom na minha opinião tem tudo haver, ainda mais dependendo do situação e como diria um velho amigo meu “do nível da problemática da coisa” ele poderá aumentar ou diminuir a sua temperatura em pouso segundo, kkkkkk.

Introdução

Os posts publicados nesta sessão tem o objetivo de desafiar o visitante a descobrir o que um determinado script pode fazer ao ser executado, e não somente isso, mostrar como podemos aprender com o uso da linguagem Transact-SQL e sua vasta coleção de comandos, funções e instruções adicionadas a cada nova versão ou atualização do Microsoft SQL Server.

Se você ainda não conhecia a sessão Script Challenge, fique tranquilo vai ter a possibilidade agora mesmo, como também a cada 4 meses poder desfrutar de um novo desafio e sua respectiva resposta, por isso esta sessão é denominada Script Challenge(Script Desafio ou Desafio do Script), bom a melhor forma de traduzir eu deixo para você escolher.

Seguindo um frente….

Gostaria de destacar mais uma vez duas mudanças iniciais implementadas na sessão Script Challenge tendo como base o post publicado em outubro de 2017, sendo elas:

  1. Como maneira ou forma de dificultar ainda mais o nível de complexidade do código, o bloco de código que representa o Script Challenge selecionado para compor o post será  apresentado no formato de imagem ou figura; e
  2. Algumas partes das linhas de código, trechos, ou partes de código serão omitidas, justamente como forma de tornar este código ainda mais desafiador.

Antes de destacar o script de hoje, não custa nada saber um pouco mais sobre esta sessão, por este motivo, quero lhe contar um pouco da história que cerca os posts relacionadas a ela…

Um pouco de História

Esta é uma sessão criado no final do ano de 2010 e mantida mensalmente até meados de 2012, desde então não me dediquei mais a mesma devido principalmente em não conseguir identificar possíveis scripts dentro da minha biblioteca que poderiam ser apresentados como um scripts considerados como desafio para os profissionais da área de banco de dados.

Mas acredito que nos últimos anos com o crescimento do Microsoft SQL Server, seu nível de evolução, amadurecimento e recursos adicionais, como também, meu nível de experiência profissional e acadêmica também evolui muito, sinto-me preparado para retornar com esta sessão e poder de forma bastante técnica, didática e conceitual poder lançar um “desafio” e responder o mesmo com muito segurança.

Outro detalhe importante, esta é uma sessão que foi criada, pensando em apresentar pequenos blocos de códigos oriundos da linguagem Transact-SQL que possam apresentar um nível de dificuldade e conhecimento técnico um pouco mais elevado, exigindo assim uma análise mais profunda e até mesmo a criação um pequeno cenário de teste para seu entendimento.

Vamos então conhecer o bloco de código selecionado para ser o Script Challenge deste post.


Script Challenge – 15

O bloco de código Transact-SQL selecionado para fazer parte do Script Challenge de hoje, esta relacionado com uma importante atividade exercidas por Administradores de Servidores,  DBAs e Administradores de Banco de Dados.

Trata-se de algo que pode ajudar a identificar possíveis situações que venham a atrapalhar o processamento e execução de nossas querys e transações. Vale ressaltar que este script, não possui a finalidade de apresentar os custos de processamento que estão sendo demandados pelos processos em execução.

Vou dar uma pequena canja, sobre este desafio: O mesmo, pode ser executado em conjunto com as demais sessões, transações ou querys em execução, sem necessitar que qualquer procedimento de manutenção ou alterações na configuração do SQL Server para sua execução.

E ai, ficou curioso para saber o que este script realiza? Qual seria esta possível atividade? Mesmo assim, não vou lhe responder hoje, vou deixar que você quebre um pouco a sua cabeça, afim de tentar matar esta curiosidade, mas como não sou tão mal assim, no final do post como de costume vou deixar uma enquete para você expor sua opinião.

A seguir apresento o bloco de código:

Figura 1 – Short Script 15.

Muito bem, nosso Script Challenge esta apresentado. Você preparado para mais este desafio?

Tenho a certeza que sim!


Sua participação

Legal, agora quero conter com a sua participação, me ajudando a responder este post, outra grande novidade que estou adicionando aos posts da sessão Script Challenge será uma pequena enquete com possíveis respostas para identificar qual é a correta, relacionada com o desafio apresentado através do bloco de código selecionado para este post, desta forma, apresento a seguir a Enquete – Script Challenge – 15 e suas alternativas de resposta:

Seguindo em frente, já conhecemos o Script Challenge selecionado, sua enquete e relação de opções de resposta, fica faltando somente a sua participação, algo que eu tenho a certeza que vai acontecer rapidamente.

Durante quanto tempo posso participar…

Outra grande mudança na sessão Script Challenge é seu tempo de publicação “validade”, anteriormente os posts desta sessão eram publicados mensalmente ou bimestralmente, agora serão publicados em um período mais longo, ou seja, a cada 4 meses estarei compartilhando com vocês novos posts dedicados exclusivamente para esta sessão.

Desta forma, você terá mais tempo para participar e me ajudar e encontrar a resposta correta para este desafio, enviando suas possíveis sugestões, críticas e até mesmo alternativas de resposta para minha enquete.

Posts anteriores

Caso esta seja a primeira vez que você acessa um post desta sessão, fico muito feliz e aproveito para compartilhar os posts mais recentes:

https://pedrogalvaojunior.wordpress.com/2018/10/06/script-challenge-14-a-resposta/

https://pedrogalvaojunior.wordpress.com/2018/06/29/script-challenge-2018-post-14/

https://pedrogalvaojunior.wordpress.com/2017/10/26/script-challenge-2017-o-retorno/

https://pedrogalvaojunior.wordpress.com/2018/03/01/script-challenge-13-a-resposta/


Agradecimentos

Obrigado por sua visita, espero que post apresentado como um possível “desafio” possa ser úteis e ao mesmo tempo prover conhecimento, aprendizado ou mostrar recursos e problemas existentes no Microsoft SQL Server que as vezes parecem não ter uma resposta, ou são tratados com “bichos de sete cabeças”.

Um forte abraço nos encontramos em breve nas demais sessões e especialmente em junho de 2019 em mais um post da sessão Script Challenge, o qual apresentará a resposta para este post.

Sucesso, mais uma vez obrigado por sua visita, espero que você tenha gostado deste post.

Fique a vontade para conhecer demais publicados até o presente momento nas demais sessões.

Abraços.

Anúncios

Microsoft SQL Server 2014 SP2 recebe atualização cumulativa 14


A Microsoft anunciou na última segunda-feira no blog SQL Server Release Services a disponibilidade da Atualização Cumulativa 14 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 e das atualizações cumulativas anteriores.

O artigo KB4459860 publicado no site de suporte da Microsoft, a atualização traz correções para múltiplos bugs no SQL Server 2014 SP2.

Atualização Cumulativa 14 para SQL Server 2014 SP2

A lista com os bugs corrigidos inclui um que causa erro de violação de acesso no SQL Server Analysis Services durante o processamento de certos bancos de dados, um que causa erro de violação de acesso durante uma consulta que faz referência ao tipo de dado Extended Markup Language (XML) e um que causa erro de falta de memória em certos cenários.

A relação completa com todos os bugs corrigidos pode ser vista através do link: https://support.microsoft.com/en-us/help/4459860/cumulative-update-14-for-sql-server-2014

A Figura 1 abaixo destaca a relação de arquivos disponíveis para download relacionados a  atualização cumulativa 14, nas arquiteturas de sistemas operacionais 32 e 64 bits:

Figura 1 – Relação de arquivos disponíveis para download relacionados ao SQL Server 2014 SP2 CU 14.

A Atualização Cumulativa 14 para SQL Server 2014 SP2 (build 12.0.5600.1) está disponível para download clicando na imagem abaixo:

Compatível com os seguintes sistemas operacionais (para múltiplos idiomas):

  • Windows 10,
  • Windows 7,
  • Windows 7 Service Pack 1,
  • Windows 8,
  • Windows 8.1,
  • Windows Server 2008 R2,
  • Windows Server 2008 R2 SP1,
  • Windows Server 2012,
  • Windows Server 2012 R2, e
  • Windows Server 2016.

Fontes e Direitos Autorais: Microsoft – Download Center: 15/10/2018.

Script Challenge – 14 – A resposta….


Boa tarde, pessoal…

Tudo bem?  Seja mais uma vez muito bem vindo ao meu blog, mais especificamente ao post que apresenta a resposta para o Script Challenge – 2018 – Post 14, publicado em junho de 2018, sendo este respectivamente o segundo post após o retorno desta desafiadora sessão em meu blog denominada Script Challenge (Script Desafiador ou Desafio do Script) como queiram traduzir.

Espero que você já tenha ouvido falar desta sessão ou acessado alguns dos posts publicados na mesma, caso ainda não tenha feito, fique tranquilo você vai encontrar no final deste post uma pequena relação contendo os últimos desafios lançados e seus respostas.

Vamos então falar um pouco mais sobre o último desafio, estou me referindo ao Script Challenge 14, desta forma, seja bem vindo a mais um post da sessão Script Challenge.


Script Challenge 14

Falando do desafio de número 14, o mesmo foi publicado no mês de junho de 2018, período de data em que o mundo todo praticamente direcionou os seus olhares para a Rússia, mais especificamente para os jogos de futebol que estavam ocorrendo no país naquele momento.

Pois bem, o Script Challenge 14 não tem nenhum relação com o mundo do futebol, muito menos com o esporte, e como diria aquele apresentador do programa que passa ao domingos: “Sabe o que isso significa? Nada…..”.

Na verdade não é bem assim, para todos aqueles que trabalham com tecnologia e são responsáveis em armazenar, compartilhar, gerenciar e manter dados armazenados em banco de dados, sabe muito bem o quanto temos que nos preocupar em estabelecer boas práticas de retenção de dados afim de podermos ter uma quem sabe vida tranquila ou momentos de lazer.

Continuando nossa história, quero lhe perguntar: E ai já matou a charada? Eu acredito que sim!

Mas para te ajudar mais um pouco vou apresentar a Figura 1 que contem todo código Transact-SQL utilizado neste desafio, contendo trechos ou partes de código ocultas, procedimento que realizei no post que contempla o lançamento deste desafio como forma de aumentar o nível de dificuldade:

Figura 1 – Código Transact-SQL apresentado no Script Challenge 14.

Bom chegou a hora de revelar o que exatamente este bloco de código esta fazendo, chegou o momento de revelar e desvendar este desafio, a seguir apresento a resposta para o Script Challenge 14 e o trecho de código disponível para você utilizar em seus ambientes de trabalho ou estudos.

A resposta

Tanto no post de lançamento do desafio, bem como, neste post que a resposta para o mesmo, eu deixei algumas pequenas dicas para tentar ajudar a identificar a resposta, dentre as quais a relação do script com uma das mais tradicionais atividades desempenhadas por um Administrador de Banco de Dados ou Profissional de tabela, mais diretamente falando a execução de uma operação de backup de banco de dados.

Mas se mesmo assim, você ainda não conseguiu adivinhar ou até mesmo esta se perguntando qual a relação do Script Challenge – 14 tem haver com um momento de lazer, a resposta é muito simples, para qualquer Administrador de Banco de Dados, Administrador de Servidores, Desenvolvedor, enfim um profissional de tecnologia, tudo o que fazemos basicamente em um computador é manipular dados (Criar, Atualizar, Excluir).

Tudo o que fazemos esta relacionado com esta palavrinha pequena mas de altíssima importância e pensando neste sentido a resposta para este desafio se relaciona a estimativa de crescimento de um arquivo de backup, e o quanto esta atividade tão importante e de alta complexidade pode impactar totalmente na vida daqueles que assim como eu um dia ou por diversos momentos teve que abrir mão do seu convívio familiar para se dedicar a acompanhar esta atividade.

Então a resposta para o Script Challenge 14 se relaciona com a possibilidade que o script apresenta em nos ajudar a identificar e estimar o quanto de espaço livre em disco em megabytes ainda teremos antes da execução do backup database levando-se em consideração o tamanho do arquivo de backup a ser criado.

Isso mesmo, esta é a resposta, e o script original que apresenta esta funcionalidade apresentada abaixo:

— Script Challenge 14 – A resposta – Identificando o total de espaço livre em disco antes da realização do backup database — 

— Criando a Stored Procedure —
USE AdventureWorksDW2016
Go

CREATE PROCEDURE dbo.dbo.EstimatedDriveFreeSpaceAndDBSize (
@drvLetter VARCHAR (5),
@enoughSpaceForBackupFlag BIT OUTPUT
)
AS
BEGIN
DECLARE @estimatedBackSizeMB INT,
@estimatedDriveFreeSpaceMB INT,
@dbCheckMessage varchar(80)

SET NOCOUNT ON

SET @dbCheckMessage = Concat (‘Checking database ‘, DB_NAME ())

SELECT @estimatedBackSizeMB = round (sum (a.total_pages) * 8192 / SQUARE (1024.0), 0)
FROM sys.partitions p JOIN sys.allocation_units a
                                            ON p.partition_id = a.container_id
                                           LEFT JOIN sys.internal_tables it
                                            ON p.object_id = it.object_id

CREATE TABLE #freespace

(drive VARCHAR (5),

MBFree DECIMAL (8, 2))

INSERT INTO #freespace (Drive, MBFree)
EXEC xp_fixeddrives

SELECT @estimatedDriveFreeSpaceMB = MBFree
FROM #freespace
WHERE drive = @drvLetter

IF @estimatedBackSizeMB * 1.15 < @estimatedDriveFreeSpaceMB
 SET @enoughSpaceForBackupFlag = 1
ELSE
 SET @enoughSpaceForBackupFlag = 0

SELECT DatabaseName = db_name(),
Estimated_Back_Size_MB = @estimatedBackSizeMB,
Estimated_Drive_Free_Space_MB = @estimatedDriveFreeSpaceMB,
EnoughSpaceForBackupFlag = @enoughSpaceForBackupFlag

DROP TABLE #freespace
SET NOCOUNT OFF
END
GO

Então, agora você deve ter gostado deste desafio, não é verdade? Poder estimar o espaço livre em disco e o tamanho ocupado pelo arquivo mesmo sem executar o Backup Database é realmente uma grande funcionalidade que o Microsoft SQL Server possui. 

Observações

  1. Estamos criando uma User Stored Procedure EstimatedDriveFreeSpaceAndDBSize;
  2. A mesma possui um parâmetros de entrada de valores: @drvLetter (utilizado para informar qual a letra da unidade de disco que iremos analisar); e
  3. Um parâmetro de saída @enoughSpaceForBackupFlag (utilizado no momento da execução da stored procedure como sinalizar responsável em apresentar uma mensagem ao usuário).

Para que você possa entender mais ainda sobre como podemos obter os resultados apresentados por este script, declaro a seguir uma possível maneira de executar o Script Challenge – 14:

— Executando o Script Challenge – 14 —

USE AdventureWorksDW2016
Go

DECLARE @enoughSpaceForBackupFlag bit

EXEC Master.dbo.EstimatedDriveFreeSpaceAndDBSize ‘S’, @enoughSpaceForBackupFlag OUTPUT

PRINT @enoughSpaceForBackupFlag
IF @enoughSpaceForBackupFlag = 1
PRINT ‘Continue to Backup…’
ELSE
PRINT ‘Drive Space Problem…’
GO

A Figura 2 apresentada abaixo, ilustra o conjunto de dados retornados após a execução do Script Challenge – 14:

Figura 2 – Informações relacionadas a estimativa de tamanho do arquivo de backup e espaço livre em disco em megabytes.

Muito bom, sensacional, conseguimos, chegamos ao final, esta é a resposta para o Script Challenge 14, fico extremamente feliz por ter conseguido compartilhar este conteúdo com vocês.

Espero que você tenha gostado deste novo post da sessão Script Challenge!


Sua Participação

No post de lançamento deste desafio, contei com a participação através de uma enquete contendo algumas opções de respostas que poderiam estar relacionadas com o Script Challenge 14. A seguir apresento o resultado desta enquete:

A opção mais votada com 77,78% dos votos é justamente a resposta correta para este desafio, o qual exibe retorna ao usuário informações relacionadas a estimativa de espaço em disco ocupado pelo arquivo de backup de banco de dados e o espaço livre disponível em disco após a conclusão do backup.

Referências

Agradecimentos

Obrigado por sua visita, espero que este conteúdo aqui apresentado como um possível “desafio” possa ser útil e ao mesmo tempo prover conhecimento, aprendizado ou mostrar recursos e problemas existentes no Microsoft SQL Server que as vezes parecem não ter uma resposta.

Um forte abraço nos encontramos em breve nas demais sessões e especialmente em fevereiro de 2019 em mais um post da sessão Script Challenge.

Até a próxima…

#22 – Para que serve


Oi, bom dia, tudo bem?

Seja bem-vindo a mais um post da sessão Para que Serve, sendo este o de número 22, mais um dia de muito trabalho começando, repleto de atividades, compromissos, reuniões, enfim tudo aquilo que normalmente estamos acostumados a nos deparar em nossos convívio diário.

E eu (parece música), estou aqui, como faço normalmente, acordando bem cedinho, para poder aproveitar da melhor maneira possível meu precioso tempo livre, colocando em prática algo que adoro fazer, publicar um post novo em meu blog mantendo a tradição de querer renovar e compartilhar as experiências e aprendizados adquiridos em minhas atividades profissionais e acadêmicas.

No post de hoje, não estarei compartilhando um conteúdo que pode ser considerado novo, ao contrário, quero destacar uma das mais antigas propriedades existentes em bancos de dados criados no Microsoft SQL Server desde suas versões mais antigas, mais especificamente falando da versão 2000 (é muito importante entender o passado, aprender com ele, para podemos melhorar e ofertar um futuro melhor) em diante.

Estou se referindo a propriedade denominada Page_Verify, a qual tem um papel de extrema importância no comportamento de um banco de dados de usuários, algo que pode impactar na forma de armazenamento, leitura e escrita das páginas de dados que formam a estrutura física e lógica de nossas tabelas e por consequência de nossos bancos de dados.

No decorrer deste post serão destacadas as respectivas opções existentes para esta propriedade, como também, será realizado uma análise comparativa no que diz respeito ao tempo de processamento de dados tendo como parâmetro um simples bloco de código inserindo 100.000 (Cem mil linhas de registros lógicos) com dados aleatórios.

Destaco antecipadamente que esta análise comparativa em nenhum momento leva em consideração características de Hardware, versão de Sistema Operacional ou uso de uma aplicação específica. Na verdade o objetivo desta simples análise é elucidar o uso desta propriedade, suas opções e respectivos algoritmos de processamento podem influenciar diretamente nos processos de escrita e leitura de dados.

Sendo assim, chegou a hora de conhecer um pouco mais sobre o post de número 22 da sessão Para que serve. Mas uma vez, bem vindo ao #22 – Para que serve – Propriedades de Bancos de Dados – Page_Verify e suas opções.

Espero que você esta animado para conhecer um pouco mais sobre esta propriedade, caso já conheça, continue lendo este post, sempre podemos aprender algo novo….


Introdução

Criar uma nova tabela para alocar dados em qualquer banco de dados existente no Microsoft SQL Server, pode ser considerada uma tarefa ou procedimento de fácil compreensão, muito simples de ser realizada tanto por linha de comando como também por interface gráfica, mas por trás “dos panos” diversos procedimentos internos são realizados pelo Sistema Gerenciador de Banco de Dados e seus diversos recursos e componentes internos.

Imagine então a tarefa de criação de um novo banco de dados, não parece também ser algo muito, mas muito simples! Teoricamente sim, mas se começarmos a analisar, entender e de preferência estudar cada uma das diversas propriedades que formam e orientam o Mecanismo de Bancos de Dados na execução da instrução de criação de um novo banco, teremos a total certeza que isso não tão simples como pensamos.

Pensando justamente neste cenário, decidi então identificar uma propriedade que por muitas vezes me passou totalmente despercebida e nos últimos dias acabou sendo motivo de estudos, como já destacado anteriormente estou me referindo a propriedade Page_Verify, sendo esta um das mais antigas propriedades existentes em bancos de dados desde a versão 2000 ou nível de compatibilidade 80, inicialmente apresentava como conjunto de opções os valores: None e Torn_Page_Detection e a partir da versão 2005 do Microsoft SQL Server ganhou uma nova opção conhecida como CheckSum e por consequência um novo algoritmo.

Vamos então conhecer um pouco mais sobre esta propriedade.

Propriedade de Banco de Dados Page_Verify

Propriedade existente em bancos de dados criados no Microsoft SQL Server que possui basicamente a função de permitir ao Sistema Gerenciador de Banco de Dados identificar e informar as chamadas Páginas de Dados Incompletas (Incomplete Pages) ou Páginas de Dados Suspeitas (Suspect Pages), através de dados internos catalogados e coletados na tabela suspect_pages existente dentro do banco de dados de sistemas MSDB.

Outra característica muito importante apresentada pela Page_Verify, relaciona-se ao método de verificação que garante ao Microsoft SQL Server que as páginas de dados que compõem um determinada tabela podem ser consideradas integras e completas, esta capacidade esta totalmente relacionada ao uso de um algoritmo pertencente a esta propriedade de acordo com o tipo de verificação de página que deve ser aplicada.

Esta tão importante característica, deve ser levada em consideração, mesmo tendo diversas funcionalidades que nos permitem identificar se a estrutura física e lógica de um banco de dados pode ser considerado integra. Em inúmeros cenários um banco de dados pode aparentemente estar apresentando falhas na estrutura interna que define uma respectiva página de dados sem necessariamente existir ou que tenha ocorrida uma falha física nas unidades de disco que armazenam tal página de dados.

A identificação se uma página de dados pode ou não ser considerada incompleta, suspeita ou quebrada é feita através da identificação de bits armazenados diretamente no cabeçalho de dados existente na respectiva página, é justamente por isso que a propriedade Page_Verify utiliza alguns algoritmos de acordo com a opção escolhida nas configurações e propriedades de um banco de dados, como recurso para garantir em tempo real o menor número de ocorrências ou possíveis falhas que venham a ocasionar uma perda de dados.

Vamos agora conhecer as formas de verificação de páginas de dados e seus respectivos algoritmos.

Formas de Verificação: None, Torn_Page_Detection e CheckSum

Até a versão 2005 SP2 do Microsoft SQL Server tínhamos somente as formas de verificação de páginas de dados None e Torn_Page_Detection, mas este cenário muito e uma nova opção denominada CheckSum foi adicionada, sendo esta então valor padrão para propriedade Page_Verify para bancos de dados com nível de compatibilidade 90 ou superior.

None: Ao escolher esta opção, o Microsoft SQL Server recebe a orientação para que não seja realizado os procedimentos de verificação e correção das páginas lidas durante os atividades de armazenamento de dados.

Logicamente esta é uma opção que não deverá ser utilizada em ambientes que não podemos correr o menor risco possível de aceitar falhas ou perdas de dados, mesmo confiando nas tecnologias de Hardware, estratégias de armazenamento, contingência e retenção de dados, a partir do momento que esta opção for escolhida você estará assumindo o risco.

Torn_Page_Detection: Opção padrão existente na versão 2000 do Microsoft SQL Server. Ao escolher esta opção, estaremos definindo o uso do algoritmo que armazenará em tempo real no cabeçalho de cada página de dados bits que identificam a operação de gravação.

No momento em que esta mesma página é lida de um disco durante a operação de leitura, os bits do cabeçalho da página são comparados àqueles no corpo da página. Caso alguma discrepância venha a ser detectada, esta específica página de dados será em tempo real considerada quebrada (incompleta ou suspeita) e o problema é relatado para um usuário.

Vale destacar que este algoritmo no momento em que uma página de dados esta sendo verificada, realiza o procedimento de duplicação de pequenas porções de bits de dados contidos em seu cabeçalho, algo que não podemos necessariamente relatar como um consumo maior de espaço em disco, na verdade é esta tarefa de duplicação de dados bits de dados utilizada para garantir a consistência da página. Por outro lado, dependendo do tipo de falha que poderá ocorrer alguns erros acabam não sendo detectados, se justamente o bit quebrado é um daqueles que não foram duplicados no cabeçalho da página, o dano não é detectado.

CheckSum: Opção padrão desde o SQL Server 2005 SP3, a partir do momento que esta opção é selecionado, o Microsoft SQL Server estará fazendo uso do algoritmo responsável durante  operação de gravação, realizar uma soma de verificação (CheckSum) que calcula a partir da estrutura completa de uma página de dados um valor a ser armazenado diretamente em seu cabeçalho.

No momento em que a respectiva página de dados é lida a partir de um disco, CheckSum é calculado novamente e comparado com o valor no cabeçalho da página. A idéia é semelhante ao TORN_PAGE_DETECTION, podemos destacar que ambos algoritmos calculam um valor de verificação para uma página e armazenam o resultado no cabeçalho da página, mas CheckSum usa a página inteira para cálculo, ao contrário do TORN_PAGE_DETECTION que utiliza apenas um pequeno número de bits existente na página de dados.

Se compararmos a opção TORN_PAGE_DETECTION com a opção CheckSum, podemos afirmar que o CheckSum apresenta uma forma de análise e verificação de possíveis falhas e erros nas atividades de Input/Output de dados, mais confiável e inteligente, estabelecendo uma cobertura mais precisa que garante uma assertividade maior na identificação de possíveis páginas de dados incompletas, suspeitas ou quebradas.

Agora que conhecemos a propriedade Page_Verify e suas opções, vamos então conhecer de forma prática e entender o comportamento de cada uma delas, realizando assim a análise destacada no início deste post.

Chegou a hora de colocar a mão nos teclados, como de costume teremos um ambiente de testes a ser criado, o que será utilizado como cenário de estudos.

Criando o Ambiente

Em meu ambiente de estudos estou utilizando o Microsoft SQL Server 2017 Enterprise Edition – Cumulative Update 9 e Sistema Operacional Windows 10, fique a vontade para utilizar o melhor cenário possível dentro das suas necessidades.

Como já destacado anteriormente esta análise ou possível cenário de estudo não consiste em afirmar qual é a mais rápida ou melhor forma de verificação de páginas de dados, mas sim demonstrar o quanto uma determinada opção poderá impactar ou influenciar nos custos de processamento de dados nas atividades de leitura e escrita, nesta prática mais especificamente nas atividades de gravação de dados.

Para realizar nossa simples prática, começaremos pela execução do Bloco de Código 1, responsável por criar a seguinte estrutura:

  • Database: TesteDatabasePageVerify;
  • Tables: TabelaPageVerify; e PageVerifyTempoDecorrido.

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

— Acessando o Banco de Dados TesteDatabasePageVerify —
Use TesteDatabasePageVerify
Go

— Criando a Tabela TabelaPageVerify —
Create Table TabelaPageVerify
(Codigo Int Identity(1,1) Not Null Primary Key,
Texto VarChar(10) Not Null,
Quantidade SmallInt Not Null,
ValoresNumericos Numeric(18, 2) Not Null,
DataAtual Date Not Null)
Go

— Criando a Tabela PageVerifyTempoDecorrido —
Create Table PageVerifyTempoDecorrido
(NumeroDaAnalise SmallInt Identity(1,1) Not Null,
TipoDaAnaliseRealizada Varchar(22) Not Null,
HoraInicio Time Not Null,
HoraFim Time Not Null,
HoraDiferenca As (DateDiff(Second, HoraInicio, HoraFim)))
Go

A tabela TabelaPageVerify será utilizada como repositório dos dados que estaremos aleatoriamente gerando como fonte de análise, já a tabela PageVerifyTempoDecorrido terá um papel importante que consiste basicamente em armazenar os dados relacionada a análise realizada, dentre elas o Tipo da Análise, Horário de Início e Fim e a diferença em segundo entre os respectivos horários.

Avançando mais um pouco, vamos agora realizar propriamente a análise para cada uma das opções de verificação de páginas existentes, serão realizadas um total de 10 análises para cada opção e ao fim os dados armazenados na Tabela PageVerifyTempoDecorrido será apresentados como uma fonte de resultando da nossa análise.

Para realizar esta análise utilizaremos o Bloco de Código 2 apresentado abaixo:

— Bloco de Código 2 —
— Desativando a Contagem de Linhas —
Set NoCount On
Go

— Declarando as variáveis de controle —
Declare @Counter TinyInt = 0,
@Text Char(130),
@Position TinyInt,
@RowCount Int = 100000,
@HoraInicio Time = GetDate(),
@HoraFim Time

Set @Text = ‘0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ\_abcdefghijklmnopqrstuvwxyzŽŸ¡ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ.;^’ –There are 130 characters in this text–

While @Counter <10 — Definindo a quantidade máxima de testes —
Begin

— Alterando a Propriedade Page_Verify para None —
Alter Database TesteDatabasePageVerify
Set Page_Verify None

— Inserindo a massa de dados na tabela TabelaPageVerify —
While (@RowCount >=1)
Begin

Set @Position=Rand()*130

Insert Into TabelaPageVerify (Texto, Quantidade, ValoresNumericos, DataAtual)
Values(Concat(SubString(@Text,@Position+2,2),SubString(@Text,@Position-4,4),SubString(@Text,@Position+2,4)),
Rand()*1000,
Rand()*100+5,
DATEADD(d, 1000*Rand() ,GetDate()))

Set @RowCount = @RowCount – 1
End

Set @HoraFim=GetDate()

Insert Into PageVerifyTempoDecorrido (TipoDaAnaliseRealizada , HoraInicio, HoraFim)
Values (‘None’, @HoraInicio, @HoraFim)

— Alterando a Propriedade Page_Verify para Torn_Page_Detection —
Alter Database TesteDatabasePageVerify
Set Page_Verify Torn_Page_Detection

— Inserindo a massa de dados na tabela TabelaPageVerify —
Set @RowCount = 100000
Set @HoraInicio = GetDate()

While (@RowCount >=1)
Begin

Set @Position=Rand()*130

Insert Into TabelaPageVerify (Texto, Quantidade, ValoresNumericos, DataAtual)
Values(Concat(SubString(@Text,@Position+2,2),SubString(@Text,@Position-4,4),SubString(@Text,@Position+2,4)),
Rand()*1000,
Rand()*100+5,
DATEADD(d, 1000*Rand() ,GetDate()))

Set @RowCount = @RowCount – 1
End

Set @HoraFim=GetDate()

Insert Into PageVerifyTempoDecorrido (TipoDaAnaliseRealizada , HoraInicio, HoraFim)
Values (‘Torn_Page_Detection’, @HoraInicio, @HoraFim)

— Alterando a Propriedade Page_Verify para CheckSum —
Alter Database TesteDatabasePageVerify
Set Page_Verify CheckSum

— Inserindo a massa de dados na tabela TabelaPageVerify —
Set @RowCount = 100000
Set @HoraInicio = GetDate()

While (@RowCount >=1)
Begin

Set @Position=Rand()*130

Insert Into TabelaPageVerify (Texto, Quantidade, ValoresNumericos, DataAtual)
Values(Concat(SubString(@Text,@Position+2,2),SubString(@Text,@Position-4,4),SubString(@Text,@Position+2,4)),
Rand()*1000,
Rand()*100+5,
DATEADD(d, 1000*Rand() ,GetDate()))

Set @RowCount = @RowCount – 1
End

Set @HoraFim=GetDate()

Insert Into PageVerifyTempoDecorrido (TipoDaAnaliseRealizada , HoraInicio, HoraFim)
Values (‘CheckSum’, @HoraInicio, @HoraFim)

Set @Counter = @Counter + 1
End
Go

Ótimo, após o processamento de nossa análise, gerou a hora de obter o resumo de tempo decorrido de processamento para cada opção, basta executar o Bloco de Código 3 divido em duas partes: Resumo Detalhado e Resumo Sumarizado, conforme declaro abaixo:

— Bloco de Código 3 —
— Parte 1 – Consultando o resumo detalhado —
Select NumeroDaAnalise,
TipoDaAnaliseRealizada,
HoraInicio,
HoraFim,
HoraDiferenca As ‘Segundos’
From PageVerifyTempoDecorrido
Go

A Tabela 1 apresentada a seguir, ilustra o detalhamento de dados coletados durante o processamento do Bloco de Código 2 realizado anteriormente:

Número da Análise Tipo da Análise Hora Início Hora Fim Segundos
1 None 10:45:59.1966667 10:46:51.0566667 52
2 Torn_Page_Detection 10:46:51.0566667 10:47:31.9633333 40
3 CheckSum 10:47:31.9800000 10:48:09.3566667 38
4 None 10:47:31.9800000 10:48:09.3566667 38
5 Torn_Page_Detection 10:48:09.3700000 10:48:38.6800000 29
6 CheckSum 10:48:38.6966667 10:49:13.6800000 35
7 None 10:48:38.6966667 10:49:13.6933333 35
8 Torn_Page_Detection 10:49:13.7133333 10:49:47.5100000 34
9 CheckSum 10:49:47.5100000 10:50:17.3433333 30
10 None 10:49:47.5100000 10:50:17.3600000 30
11 Torn_Page_Detection 10:50:17.3766667 10:50:49.7066667 32
12 CheckSum 10:50:49.7233333 10:51:23.3566667 34
13 None 10:50:49.7233333 10:51:23.3733333 34
14 Torn_Page_Detection 10:51:23.3733333 10:51:54.4200000 31
15 CheckSum 10:51:54.4200000 10:52:29.0466667 35
16 None 10:51:54.4200000 10:52:29.0500000 35
17 Torn_Page_Detection 10:52:29.0666667 10:53:00.8300000 31
18 CheckSum 10:53:00.8466667 10:53:32.1433333 32
19 None 10:53:00.8466667 10:53:32.1600000 32
20 Torn_Page_Detection 10:53:32.1766667 10:54:06.6466667 34
21 CheckSum 10:54:06.6633333 10:54:36.9400000 30
22 None 10:54:06.6633333 10:54:36.9400000 30
23 Torn_Page_Detection 10:54:36.9566667 10:55:09.7533333 33
24 CheckSum 10:55:09.7700000 10:55:41.8866667 32
25 None 10:55:09.7700000 10:55:41.8866667 32
26 Torn_Page_Detection 10:55:41.9033333 10:56:15.0166667 34
27 CheckSum 10:56:15.0166667 10:56:45.6966667 30
28 None 10:56:15.0166667 10:56:45.7133333 30
29 Torn_Page_Detection 10:56:45.7133333 10:57:21.7900000 36
30 CheckSum 10:57:21.7933333 10:57:54.8433333 33

Tabela 1 – Detalhamento de dados coletados após o processamento do Bloco de Código 2.

— Parte 2 – Consultando o resumo sumarizado —
Select TipoDaAnaliseRealizada,
Avg(HoraDiferenca) As ‘Média em segundos’
From PageVerifyTempoDecorrido
Group By TipoDaAnaliseRealizada
Order By ‘Média em segundos’ Desc
Go

A Tabela 2 apresentada a seguir, ilustra o dados coletados durante o processamento do Bloco de Código 2 realizado anteriormente de forma sumarizada com o cálculo da média de segundos gastos para o processamento de cada opção de verificação de páginas:

Tipo da Análise Média em segundos
None 34
Torn_Page_Detection 33
CheckSum 32

Tabela 2 – Dados sumarizados após o processamento do Bloco de Código 2.

Falta só um pouco, o último passo que iremos realizar, consiste na apresentação do Sumário de processamento em segundos demandado por cada algoritmo de verificação de páginas, através da execução do Bloco de Código 4, sendo que o mesmo apresentará os seguintes resultados:

  • Média de processamento em segundos;
  • Menor tempo de processamento em segundos;
  • Maior tempo de processamento em segundos; e
  • Somatória total do tempo de processamento.

— Bloco de Código 4 —
— Pivot —
Select ‘Média de processamento…..’ As ‘Sumário por segundos’, [None],[Torn_Page_Detection],[CheckSum]
From (Select TipoDaAnaliseRealizada,
HoraDiferenca
From PageVerifyTempoDecorrido
) As A
Pivot (Avg(HoraDiferenca) For TipoDaAnaliseRealizada In ([None],[Torn_Page_Detection],[CheckSum])) As Pvt
Union All
Select ‘Menor tempo de processamento…..’, [None],[Torn_Page_Detection],[CheckSum]
From (Select TipoDaAnaliseRealizada,
HoraDiferenca
From PageVerifyTempoDecorrido
) As A
Pivot (Min(HoraDiferenca) For TipoDaAnaliseRealizada In ([None],[Torn_Page_Detection],[CheckSum])) As Pvt
Union All
Select ‘Maior tempo de processamento…..’, [None],[Torn_Page_Detection],[CheckSum]
From (Select TipoDaAnaliseRealizada,
HoraDiferenca
From PageVerifyTempoDecorrido
) As A
Pivot (Max(HoraDiferenca) For TipoDaAnaliseRealizada In ([None],[Torn_Page_Detection],[CheckSum])) As Pvt
Union All
Select ‘Somatória do tempo de processamento…..’, [None],[Torn_Page_Detection],[CheckSum]
From (Select TipoDaAnaliseRealizada,
HoraDiferenca
From PageVerifyTempoDecorrido
) As A
Pivot (Sum(HoraDiferenca) For TipoDaAnaliseRealizada In ([None],[Torn_Page_Detection],[CheckSum])) As Pvt
Go

A Tabela 3 apresentada a seguir, ilustra o dados coletados durante o processamento do Bloco de Código 4, sumarizados e estruturados através do uso de Pivot:

Sumário por segundos None Torn_Page_Detection CheckSum
Média de processamento….. 34 33 32
Menor tempo de processamento….. 30 29 30
Maior tempo de processamento….. 52 40 38
Somatória do tempo de processamento….. 348 334 329

Tabela 3 – Dados sumarizados e apresentados em formato de Pivot após o processamento do Bloco de Código 4.

Agora sim, chegamos ao final. Ufa deu um pouco de trabalho este post, como de costume, mesmo assim sempre vale a pena poder compartilhar um pouco do conhecimento e experiências adquiridas ao longo dos anos de trabalho como DBA e Professor.

Espero que você tenha gostado, eu posso dizer que sim, mas sua opinião é muito importante.


Referências

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-database-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/policy-based-management/set-the-page-verify-database-option-to-checksum?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-properties-options-page?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/manage-the-suspect-pages-table-sql-server?view=sql-server-2017

Links

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

https://pedrogalvaojunior.wordpress.com/2018/05/28/21-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2018/04/12/20-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2018/01/02/19-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/12/15/18-para-que-serve/

Conclusão

Pensar na melhor forma para se armazenar um dado em uma respectiva tabela, vai muito além de escolher o tipo de dados mais indicado, temos também que procurar conhecer cada vez mais as propriedades de definem a estrutura e comportamento de um banco de dados, visando sempre garantir a melhor forma de armazenar, coletar e garantir que nossos servidores, aplicações e usuários possam fazer uso desta tão importante matéria prima utilizada pelas organizações, os dados que estão guardados em nossos bancos dados.

Neste post, você pode conhecer uma mais sobre a propriedade de banco de dados Page_Verify e suas opções: None, Torn_Page_Detection e CheckSum. Propriedade que desempenha um papel de extrema importância no que diz respeita a garantir que nossos dados estão armazenados de forma integra e confiável.

Realizamos uma simples análise para elucidar como estas opções podem influenciar no comportamento do Database Engine e também no Storage Engine, conhecemos também como cada opção desempenha o papel de verificar a estrutura física e lógica das páginas de dados que formam nossas tabelas, fazendo uso de algoritmos que gravam diretamente bits nos cabeçalhos destas mesma páginas, como fonte de identificação para tentar garantir que sua estrutura esta integra e confiável.

Mais uma vez destaco que este o estudo realizado no cenário apresentando neste post, não tem a finalidade de mostrar qual opção é mais rápida, mas sim demonstrar como em alguns momento a opção Torn_Page_Detection em comparação com a CheckSum pode ser mais vantajosa ou não, sabendo que a opção None não é recomendada para fiz corporativos.

Este é o fantástico Microsoft SQL Server, que desde suas primeiras versões nos apresenta inúmeras possibilidade de se aprender, possibilitando usar o passado como fonte de inspiração para construção de um futuro melhor, por isso que a cada dia eu me apaixono ainda mais por este produto…

Vai SQL Server, Vai SQL Server….

Agradecimentos

Mais uma vez obrigado por sua ilustre visita, sinto-me honrado com sua presença, espero que este conteúdo possa lhe ajudar e ser útil em suas atividades profissionais e acadêmicas.

Um forte abraço, até o próximo post da sessão Para que serve a ser publicado no mês novembro.

Um grande abraço e ótima semana.

Valeu.

Dica do Mês – Ocultando uma instância em execução do Microsoft SQL Server


Muito boa noite, você que esta aqui fazendo mais uma visita ao meu blog.

Seja mais uma vez, bem vindo, que prazer enorme contar com a sua presença, em mais um post da sessão Dica do Mêssessão dedicada a compartilhar bimestralmente dicas, novidades, curiosidades e demais informações relacionadas ao Microsoft SQL Server, Banco de Dados e Tecnologias de Banco de Dados.

Neste post, quero dividir com você uma funcionalidade que utilizei no decorrer deste mês de julho para um dos meus clientes, não posso dizer que é uma funcionalidade ou recurso do Microsoft SQL Server, na verdade é uma propriedade que podemos aplicar as nossas instâncias ou servidores em execução em nossos ambientes para tentar aplicar mais uma camada de segurança sem ter a necessidade do uso de ferramentas de terceiros ou configurações avançadas, pensamento sempre em minimizar e dificultar possíveis tentativas de invasão.

Você pode ter ficado um pouco confuso ou até mesmo curioso com o título desta dica, mas é justamente isso que vamos conhecer e aprender da Dica do Mês que estou compartilhando, uma possibilidade de fazer com que ferramentas invasoras ou até mesmo o próprio SQLCMD ferramenta nativa do Microsoft SQL Server utilizada em linha de comando não consiga identificar quais instâncias estão em execução localmente ou remotamente.

Além disso, esta funcionalidade, também omite a visibilidade de identificação de nossas instâncias para o SQL Server Browser, serviço utilizado pelo Microsoft SQL Server para realizar troca de mensagens afim de identificar e possibilitar comunicação entre instâncias em execução locais ou remotas.

E ai, esta curioso em saber um pouco mais sobre esta nova forma de apresentar seus dados? Eu estou, e não vejo a hora de poder dividir com você um pouco deste recurso.

Então, vamos em frente, vou tentar mitigar a sua curiosidade e ao mesmo também satisfazer os meus objetivos. Sendo assim, seja bem vindo ao post – Dica do Mês – Ocultando uma instância em execução do Microsoft SQL Server.


Introdução

Atualmente o número de incidentes relacionados com tentativas de invasões, falhas de segurança, vulnerabilidades e vírus tem sofrido um aumento de forma assustadora no Brasil segundo os estudos e análises de estatísticas realizadas pelo CERT.BR – Centro de Estudos, Resposta e Tratamento de Incidentes de Segurança no Brasil.

Tendo como base a Figura 1 apresentado abaixo, que representa gráfico de estatísticas de incidentes reportados ao CERT.BR em 2017, temos uma real dimensão do quando nossos dados processados diariamente podem em algum momento cair em mãos erradas, situação de extrema preocupação para qualquer indivíduo que atualmente utiliza os recursos de tecnologia ligados a internet.
Figura 1 – Gráfico de Estatísticas de Incidentes Reportados ao CERT.BR.

Caminhando mais um pouco, o foco deste post não é falar sobre invasões, muito menos análises de ameaças, mas a funcionalidade que vou apresentar como já destacado esta relacionada com medidas de segurança.

Analisando os números

Abordando um pouco do gráfico apresentado anteriormente, vou fazer uma rápida análise para justificar o porque se tornou tão importante a preocupação com ações de segurança. Esta análise será aplicada através dos números apresentados pelo gráfico do CERT.BR para os últimos quatro anos: 2017, 2016, 2015 e 2014, números que nos permitiram ter a real noção do que esta acontecendo no Brasil, servindo como suporte para nos ajudar e dimensionar os riscos que estamos diariamente correndo.

Para suportar e fortalecer nosso entendimento, elaborei uma simples Tabela denominada Tabela 1 que apresenta a diferença em números de incidentes anuais, e suas respectivas diferenças percentuais no que se relaciona aos de incidentes reportados pelo CERT.BR.

A seguir apresento a Tabela 1 – Incidentes entre os anos de 2014 até 2017:

Ano Total de Incidentes Anuais Diferença – Número de Incidentes – Ano Anterior x Ano Posterior Variação Percentual – Ano Anterior x Ano Posterior
2017 833.775 186.663 22,39%
2016 647.112 -75.093 -11,60%
2015 722.205 -324.826 -44,98%
2014 1.047.031

Tabela 1 – Análise dos números de incidentes reportados anualmente pelo CERT.BR.

Aplicando uma simples analogia, podemos dizer claramente que entre os anos de 2014 e 2017 o número de incidentes reportados pelo CERT.BR apresentou uma diminuição de 25,58%, algo de aproximadamente 213.256 (Duzentos e Treze Mil, Duzentos e Cinquenta e Seis) incidentes a menos reportados, evidência que não nos permite deixar de se preocupar.

Por outro lado se analisarmos especificamente o último ano, sendo este o ano de 2017 tivemos um aumento de 22,39% no número de incidentes em relação ao ano de 2016, mais assertivamente um crescimento de 186.339 (Cento e Oitenta de Seis Mil, Trezentos e Trinta e Nova).

Em contra partida, se iniciarmos uma outra análise a partir do no ano de 2015 tivemos uma diminuição de mais de 324.000 (Trezentos e Vinte e Quatro Mil) no número de incidentes reportados ao CERT.BR em relação ao ano anterior, no caso 2014.

E ai que fica a pergunta, esta variação pode representar que as empresas, profissionais de tecnologias e usuários comuns estão se preocupando cada vez mais com a sua segurança, ou os possíveis invasores estão perdendo força?

Esta é uma pergunta que sinceramente falando é de difícil resposta ou afirmação, no meu ponto de vista, ela representa reflexão mais profunda, não somente voltada para área de tecnologia, mas sim para o comportamento social de cada individuo e empresa.

Vamos avançar ainda mais e conhecer a funcionalidade que poderá nos ajudar a aplicar mais uma “camada de segurança” em nossas instâncias Microsoft SQL Server.

Conhecendo a Propriedade Hide Instance (Instância Oculta)

Daqui em diante não vou falar mais de incidentes, invasões e números relacionados a estes elementos, chegou a hora de conhecer esta tal “camada de segurança”, conhecida como propriedade Hide Instance existente dentro da ferramenta SQL Server Configuration Manager, a qual é instalada por padrão em conjunto com nossas instâncias Microsoft SQL Server.

Acredito que você deve conhecer a ferramenta SQL Server Configuration Manager, se ainda não conhece, fique tranquilo, basta em seu Windows através do botão iniciar começar a digitar: SQL Server 2016 ou 2017 Configurationque a ferramenta de pesquisa vai encontrar.

Para ilustrar esta ferramenta, a Figura 2 apresenta sua tela principal:

Figura 2 – Ferramenta – SQL Server Configuration Manager.

Muito bem, espero que você tenha conseguido encontrar este ferramenta em seu ambiente, o próximo passo é justamente identificar a instância que você deseja ocultar “esconder”, no meu cenário tenho duas instâncias instaladas localmente, denominadas:

  • WIN10PRO – Microsoft SQL Server 2016 Enterprise; e
  • WIN10PRO\MSSQLServer2017 – Microsoft SQL Server 2017 Enterprise.

A instância WIN10PRO\MSSQLServer2017 possui aplicada a propriedade Hide Instance, neste caso se tentarmos realizar uma pesquisa das instâncias em execução da minha máquina através da ferramenta de prompt-de-comando SQLCMD em conjunto com o parâmetro -L seu nome omitido da lista de instâncias locais, ao contrário da instância WIN10PRO a qual não possui aplicada a mesma propriedade.

Aplicando a propriedade Hide Instance

Para aplicar a propriedade Hide Instance a uma instância SQL Server, necessitamos estar com o SQL Server Configuration Manager em execução, logo após escolher no painel a esquerda a opção: SQL Server Network Configuration, conforme apresenta a Figura 3 a seguir:

Figura 3 – SQL Server Configuration Manager, opção SQL Server Network Configuration.

Observe que logo após escolher esta opção, o SQL Server Configuration Manager apresenta a relação de instância instaladas em meu ambiente conforme já destaquei anteriormente.

Nosso próximo passo será justamente encontrar a propriedade Hide Instance, para isso, vou selecionar a instância WIN10PRO\MSSQLServer2017, como já abordei a mesma possui ativada este propriedade, sendo assim, vou clicar com o botão da direita do mouse sobre a instância e escolher a opção Properties (Propriedades), conforme apresenta a Figura 4 abaixo:

Figura 4 – Menu Popup – Opção Propriedades.

Show, simples e prático, logo após clicar na opção Properties o SQL Server Configuration Manager deve ter apresentado a tela de propriedades “externas” que podemos aplicar para nossa instância, sendo elas:

  • Force Encryption; e
  • Hide Instance (Esconder, Ocultar ou Omitir).

A Figura 5 apresenta a relação de propriedades “externas”:

Figura 5 – Propriedades externas disponíveis para a instância WIN10PRO\MSSQLServer2017.

Muito bem, sem mais delongas, note que a propriedade Hide Instance possui o valor de True (Verdadeiro) aplicado, sendo assim, a capacidade de ocultar, esconder ou omitir a visibilidade desta instância tanto para o SQL Server Browser como também para o SQLCMD esta ativada.

Sequência de passos:

  1. Abrir – SQL Server Configuration Manager;
  2. Acessar o guia SQL Server Network Configuration;
  3. Clicar com o botão da direita sobre a instância WIN10PRO\MSSQLSERVER2017;
  4. Selecionar a propriedade Hide Instance e escolher o valor True;
  5. Clicar OK;
  6. Acessar a guia SQL Services;
  7. Clicar com o botão da direita sobre a instância WIN10PRO\MSSQLSERVER2017; e
  8. Selecionar a opção Restart.

Nosso último passo será justamente comprovar a veracidade do uso desta propriedade.

Estamos quase no final….

Testando a aplicação da propriedade Hide Instance

Como já destacado anteriormente, a partir do momento em que a propriedade Hide Instance encontra-se habilitada a ferramenta SQLCMD através do parâmetro -L não consegui identificar e apresentar o nome da respectiva instância, sendo assim, este será justamente nosso simples ambiente de teste.

Vou então abrir a ferramenta Prompt-de-Comando (CMD) e logo após digite a linha de comando: SQLCMD -L, conforme apresenta a Figura 6:

Figura 6 – Lista de instâncias identificadas e apresentadas pela ferramenta SQLCMD.

E ai esta o resultado a ferramenta SQLCMD não conseguiu identificar a presença da instância WIN10PRO\MSSQLSERVER2017, sendo que a mesma encontra-se em execução.

Para finalizar, vou seguir os passos apresentados anteriormente para acessar a propriedade Hide Instance e desativar a possibilidade de omitir o nome da instância, logo na sequência executar novamente a linha de comando SQLCMD -L e verificar seu resultado:

  1. Abrir – SQL Server Configuration Manager;
  2. Acessar o guia SQL Server Network Configuration;
  3. Clicar com o botão da direita sobre a instância WIN10PRO\MSSQLSERVER2017;
  4. Selecionar a propriedade Hide Instance e escolher o valor False;
  5. Clicar OK;
  6. Acessar a guia SQL Services;
  7. Clicar com o botão da direita sobre a instância WIN10PRO\MSSQLSERVER2017;
  8. Selecionar a opção Restart;
  9. Abrir o Prompt-de-Comando; e
  10. Executar a instrução: SQLCMD -L

Observação: Vale ressaltar que tanto para ativar como também para desativar a propriedade Hide Instance, é necessário realizar o procedimento de reinicialização do serviço do Microsoft SQL Server referente a instância selecionada.

Conforme prometido, após realizar os passos apresentados anteriormente, eis aqui o resultado da execução da linha de comando: SQLCMD -L, conforme apresenta a Figura 7 a seguir:

Figura 7 – Relação de instância identificadas pela ferramenta SQLCMD.

Como um passe de mágica, límpido e transparente, a ferramenta SQLCMD consegui identificar a presença da instância WIN10PRO\MSSQLSERVER2017, exibindo assim seu nome na lista de instâncias e servidores identificados.

Isso não é sensacional? Eu tenho a certeza que sim e espero que você também pense desta forma.

Com isso chegamos ao final de mais um post da sessão Dica do Mês, antes de encerrarmos, gostaria de contar com a sua participação neste post, respondendo a enquete abaixo:


Referências

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/hide-an-instance-of-sql-server-database-engine?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-database-engine-to-listen-on-multiple-tcp-ports?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-a-windows-firewall-for-database-engine-access?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/connect-to-sql-server-through-a-proxy-server-sql-server-configuration-manager?view=sql-server-2017

Posts Anteriores

https://pedrogalvaojunior.wordpress.com/2018/04/25/dica-do-mes-sql-operations-studio-view-as-chart/

https://pedrogalvaojunior.wordpress.com/2018/03/14/dica-do-mes-microsoft-sql-server-2017-sql-graph-databases/

https://pedrogalvaojunior.wordpress.com/2018/01/24/dicadomes-sqlservertoolsuiteintroduction/

https://pedrogalvaojunior.wordpress.com/2017/11/01/dicadomessql2017novascolunasinternas/

Conclusão

Pensar em manter nossos ambientes e dados seguros é um preocupação que todos devemos ter, independente da situação e importância.

Fazer uso de recursos, ferramentas, funcionalidades ou até mesmo a adoção de simples práticas podem nos ajudar a garantir cada vez mais a sobrevivência e proteção destes preciosos elementos.

Pensando justamente desta forma, o uso da propriedade Hide Instance deve ser adotada em nossas instâncias ou servidores, como uma possível “camada de segurança”, afim de dificultar a identificação e apresentação destes recursos.

Agradecimentos

Agradeço a você por sua atenção e visita ao meu blog. Fique a vontade para enviar suas críticas, sugestões, observações e comentários.

Nos encontramos no próximo post da sessão Dica do Mês a ser publicado no mês de setembro.

Valeu, bom final de noite….

Script Challenge – 2018 – Post 14


Boa tarde comunidade…

Tudo bem? Sexta – feira dia 29/06 estamos no inverno, graças a deus aquele friozinho diminui muito nos últimos dias, eu particularmente gosto do frio, principalmente acompanhado da minha família e do leite quente, chocolate e aquela sopinha no final da tarde que somente minha “pequena” Fernanda sabe fazer.

Introdução

Os posts publicados nesta sessão tem o objetivo de desafiar o visitante a descobrir o que um determinado script pode fazer ao ser executado, e não somente isso, mostrar como podemos aprender com o uso da linguagem Transact-SQL e sua vasta coleção de comandos, funções e instruções adicionadas a cada nova versão ou atualização do Microsoft SQL Server.

Se você ainda não conhecia a sessão Script Challenge, fique tranquilo vai ter a possibilidade agora mesmo, como também a cada 4 meses poder desfrutar de um novo desafio e sua respectiva resposta, por isso esta sessão é denominada Script Challenge(Script Desafio ou Desafio do Script), bom a melhor forma de traduzir eu deixo para você escolher.

Seguindo um frente….

Gostaria de destacar mais uma vez duas mudanças iniciais implementadas na sessão Script Challenge tendo como base o post publicado em outubro de 2017, sendo elas:

  1. Como maneira ou forma de dificultar ainda mais o nível de complexidade do código, o bloco de código que representa o Script Challenge selecionado para compor o post será  apresentado no formato de imagem ou figura; e
  2. Algumas partes das linhas de código, trechos, ou partes de código serão omitidas, justamente como forma de tornar este código ainda mais desafiador.

Antes de destacar o script de hoje, não custa nada saber um pouco mais sobre esta sessão, por este motivo, quero lhe contar um pouco da história que cerca os posts relacionadas a ela…

Um pouco de História

Esta é uma sessão criado no final do ano de 2010 e mantida mensalmente até meados de 2012, desde então não me dediquei mais a mesma devido principalmente em não conseguir identificar possíveis scripts dentro da minha biblioteca que poderiam ser apresentados como um scripts considerados como desafio para os profissionais da área de banco de dados.

Mas acredito que nos últimos anos com o crescimento do Microsoft SQL Server, seu nível de evolução, amadurecimento e recursos adicionais, como também, meu nível de experiência profissional e acadêmica também evolui muito, sinto-me preparado para retornar com esta sessão e poder de forma bastante técnica, didática e conceitual poder lançar um “desafio” e responder o mesmo com muito segurança.

Outro detalhe importante, esta é uma sessão que foi criada, pensando em apresentar pequenos blocos de códigos oriundos da linguagem Transact-SQL que possam apresentar um nível de dificuldade e conhecimento técnico um pouco mais elevado, exigindo assim uma análise mais profunda e até mesmo a criação um pequeno cenário de teste para seu entendimento.

Vamos então conhecer o bloco de código selecionado para ser o Script Challenge deste post.


Script Challenge – 14

O bloco de código Transact-SQL selecionado para fazer parte do Script Challenge de hoje, esta relacionado com uma das atividades diárias exercidas por Administradores de Servidores, Desenvolvedores, DBAs e Administradores de Banco de Dados.

Bom não vou dizer a qual atividade eu me refiro, mas que ela apresenta uma importância muito grande para a vida de qualquer corporação, com certeza apresenta.

O desafio deste respectivo script, esta diretamente ligado com o impacto que o resultado obtido após sua execução e antes da realização da atividade poderá nos trazer, bem como, o mesmo torna-se uma útil ferramenta no que se relacionada a sobrevivência de nossos dados em caso de uma possível falha física.

Esta curioso para saber qual é esta atividade? Mesmo assim, não vou lhe responder hoje, vou deixar que você quebre um pouco a sua cabeça, afim de tentar matar esta curiosidade, mas como não sou tão mal assim, no final do post como de costume vou deixar uma enquete para você expor sua opinião.

A seguir apresento o bloco de código:

Figura 1 – Short Script 14.

Muito bem, nosso Script Challenge esta apresentado. Você preparado para mais este desafio?

Tenho a certeza que sim!


Sua participação

Legal, agora quero conter com a sua participação, me ajudando a responder este post, outra grande novidade que estou adicionando aos post da sessão Script Challenge será uma pequena enquete com possíveis respostas para identificar qual é a correta relacionada com o desafio apresentado através do bloco de código selecionado para este post, desta forma, apresento a seguir a Enquete – Script Challenge – 14 e suas alternativas de resposta:

Seguindo em frente, já conhecemos o Script Challenge selecionado, sua enquete e relação de opções de resposta, fica faltando somente a sua participação, algo que eu tenho a certeza que vai acontecer rapidamente.

Durante quanto tempo posso participar…

Outra grande mudança na sessão Script Challenge é seu tempo de publicação “validade”, anteriormente os posts desta sessão eram publicados mensalmente ou bimestralmente, agora serão publicados em um período mais longo, ou seja, a cada 4 meses estarei compartilhando com vocês novos posts dedicados exclusivamente para esta sessão.

Desta forma, você terá mais tempo para participar e me ajudar e encontrar a resposta correta para este desafio, enviando suas possíveis sugestões, críticas e até mesmo alternativas de resposta para minha enquete.

Posts anteriores

Caso esta seja a primeira vez que você acessa um post desta sessão, fico muito feliz e aproveito para compartilhar os posts mais recentes:

https://pedrogalvaojunior.wordpress.com/2017/10/26/script-challenge-2017-o-retorno/

https://pedrogalvaojunior.wordpress.com/2018/03/01/script-challenge-13-a-resposta/


Agradecimentos

Obrigado por sua visita, espero que post apresentado como um possível “desafio” possa ser úteis e ao mesmo tempo prover conhecimento, aprendizado ou mostrar recursos e problemas existentes no Microsoft SQL Server que as vezes parecem não ter uma resposta, ou são tratados com “bichos de sete cabeças”.

Um forte abraço nos encontramos em breve nas demais sessões e especialmente em outubro de 2018 em mais um post da sessão Script Challenge.

Sucesso, mais uma vez obrigado por sua visita, espero que você tenha gostado deste post.

Fique a vontade para conhecer demais publicados até o presente momento nas demais sessões.

Abraços.

Microsoft SQL Server Management Studio 17.8 liberado


Em anuncio oficial, A Microsoft apresentou em seu blog a nova versão do Microsoft SQL Server Management Studio 17.8, conhecida por muitos profissionais de tecnologia pela sigla SSMS.

O SSMS combina um amplo grupo de ferramentas gráficas com vários editores de script avançados para fornecer acesso para desenvolvedores e administradores de todos os níveis de conhecimento ao SQL Server, além disso, através desta ferramenta você vai encontrar um ambiente totalmente integrado com os mais diversos serviços e recursos existentes no Microsoft SQL Server.

Vale ressaltar que desde a versão 2016 do Microsoft SQL Server, o time de engenheiros e desenvolvedores da Microsoft, decidiram superar a dependência do Management Studio da versão do SQL Server, sendo assim, deste então independente da versão do Microsoft SQL Server instalado é possível utilizar e instalar versões superiores ou não do Management Studio, tornando-se então um novo produto independente do SQL Server.

A partir da versão 17, o Microsoft SQL Server Management Studio apresenta um novo ícone que faz referência a esta ferramenta substituindo justamente o ícone utilizado pelas versões anteriores do Management Studio específicos de cada versão do Microsoft SQL Server.

A Figura 1 abaixo apresenta este novo ícone:

Figura 1 – Novo ícone utilizado pelo Microsoft SQL Server Management Studio a partir da versão 17.

Para realizar download do Microsoft SQL Server Management Studio 17.8, utilize um dos links apresentados abaixo:

Download SQL Server Management Studio 17.8

Download SQL Server Management Studio 17.8 Upgrade Package (upgrades 17.x to 17.8)

Após a instalação desta nova versão o Microsoft SQL Server Management Studio terá sua número de versão evoluído para: 17.8 e seu release build para: 14.0.17276.0. Dentre os bugs e melhorias implementadas nesta nova versão a Microsoft destaca correções específicas para editor de querys, nova interface para scripts e suporte a propriedade AUTOGROW_ALL_FILES, entre outras inovações.

Caso queira saber mais sobre esta versão, sua lista de correções e melhorias, acesse: https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017

Esta nova versão do SSMS 17.8 esta disponível para as versões do Mirosoft SQL Server versão 2008 até 2017, é compatível com as versões 64 bits do Windows 7, Windows 8/8.1, Windows 10, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2 e Windows Server 2016 e também suporta o SQL Analysis Service PaaS.

Fontes e Direitos Autorais: Microsoft – Docs SQL Tools SQL Server Management Studio (SSMS) – 21/06/2018.

Microsoft disponibiliza nova versão do System Center Management Pack para SQL Server


A Microsoft anunciou ontem dia 05/06 em seu blog SQL Server Release Services a nova versão do System Center Management Pack v7.0.5.0 Preview compatível com as versões: 2017, 2016, 2014, 2012, 2008 e 2008 R2 do Microsoft SQL Server.

Através do Management Pack, Profissionais de Tecnologia, Administradores de Servidores, Administradores de Bancos de Dados e DBAs, terão a possibilidade de monitorar em tempo os respectivos bancos de dados, serviços como SQL Server Agent e outros componentes que compõem o System Center Operations Manager.

See the source image

Em seu anúncio a Microsoft, informa que o System Center Management Pack v7.0.5.0 Preview para SQL Server traz correções para múltiplos bugs, mudanças em alguns scripts, mudanças na severidade de alguns alertas, suporte para monitoramento de instâncias SQL Server Cluster localmente, suporte para monitoramento de SQL Server Integration Services.

A versão 7.0.5.0 Preview encontra-se disponível para download, através dos links:

System Center Management Pack 7.0.5.0 Preview para SQL Server 2008, 2012, 2014 e 2016.

System Center Management Pack 7.0.5.0 Preview para SQL Server 2017.

Há lista completa com todas as novidades e bugs corrigidos pode ser obtida acessando: https://blogs.msdn.microsoft.com/sqlreleaseservices/released-public-preview-for-sql-server-management-packs-update-7-0-5-0-and-ssrs-management-pack-update-7-0-6-0/

Fontes e Direitos Autorais: 

Microsoft SQL Server 2016 SP1 – Atualização Cumulativa 9 disponível


A Microsoft disponibilizou para download hoje dia 30/05/2018 a Atualização Cumulativa 9 para SQL Server 2016 SP1.

As informações obtidas através do artigo KB4100997 publicado no site de suporte da Microsoft, esta atualização traz correções decorrentes dos problemas apresentados e identificados após o lançamento do SP1 e das atualizações cumulativas anteriores.

Relação de Atualizações Cumulativas disponíveis para o Microsoft SQL Server 2016 Service Pack 1:

SQL Server 2016 SP1 CU8
SQL Server 2016 SP1 CU7
SQL Server 2016 SP1 CU6
SQL Server 2016 SP1 CU5
SQL Server 2016 SP1 CU4
SQL Server 2016 SP1 CU3
SQL Server 2016 SP1 CU2
SQL Server 2016 SP1 CU1
SQL Server 2016 SP1
SQL Server 2016 all builds

Hotfixes que estão incluídos neste pacote de atualização cumulativa


Número de bug do VSTS Número de artigo do KB Descrição Corrigir a área
11814294 4099472 PFS página melhoria de algoritmo round robin no SQL Server 2016 Serviço do SQL
11231756 4133164 CORREÇÃO: Erro quando um trabalho do SQL Server Agent executa um comando do PowerShell para enumerar as permissões do banco de dados Ferramentas de gerenciamento
11701139 4086173 CORREÇÃO: Violação de acesso ocorre ao executar uma consulta DAX em um modelo tabular no SQL Server Analysis Services Serviços de análise
11814333 4131193 Problemas de desempenho ocorrem sob a forma de PAGELATCH_EX e PAGELATCH_SH espera em TempDB quando você usar o SQL Server 2016 Serviço do SQL
11829791 3028216 CORREÇÃO: Ocorre uma falha quando o cache pró-ativo é desencadeada por uma dimensão no SSAS Serviços de análise
11829056 4135113 CORREÇÃO: Registro de controle de alterações é inconsistente durante uma atualização em uma tabela que tem um índice cluster/exclusivo no SQL Server Serviço do SQL
11918578 4293839 CORREÇÃO: Banco de dados TDE fica offline durante operações de descarga de log quando problemas de conectividade com o provedor EKM tornar-se inacessível no SQL Server Segurança do SQL
11810404 4230730 CORREÇÃO: Uma condição de morto trava ocorre quando você executar uma reconstrução de índice online ou executa um comando de mesclagem no SQL Server Serviço do SQL
11793118 4163478 CORREÇÃO: Uma violação de acesso ocorre quando incrementais estatísticas são atualizadas automaticamente em uma tabela no SQL Server Desempenho de SQL
11923632 4230306 CORREÇÃO: Restauração de um backup compactado TDE é vencida quando usando o cliente VDI Serviço do SQL
11924460 4163087 CORREÇÃO: Desempenho é lento para um sempre na AG quando você processa uma leitura consulta no SQL Server Serviço do SQL
11684528 4164562 CORREÇÃO: Nome de usuário errado aparece quando dois usuários acesse a MDS em momentos diferentes no SQL Server Serviços de qualidade de dados (DQS)
11634113 4094893 CORREÇÃO: Banco de dados não pode ser descartado após seu armazenamento é desconectado e reconectado no SQL Server Serviço do SQL
11708639 4162814 CORREÇÃO: Ocorre uma violação de acesso de exceção interna e o servidor SSAS para de responder Serviços de análise
11801446 4134541 CORREÇÃO: Erro do MDS Add-in para o Excel quando você usar a versão alemã do Excel no SQL Server Serviços de qualidade de dados (DQS)
11637501 4132267 CORREÇÃO: Implantar um projeto SSAS em SSDT é frequentemente mal sucedido no SQL Server Analysis Services no modo Tabular Serviços de análise
11797887 4101554 CORREÇÃO: Paralelo refazer em uma réplica do secundária de um grupo de disponibilidade que contém tabelas heap gera um despejo de declaração de tempo de execução ou o servidor de SQL falha com um erro de violação de acesso Alta disponibilidade
11750742 4098762 CORREÇÃO: Parâmetros ocultos são incluídos nos relatórios quando o papel do navegador é usado em 2016 SSRS O Reporting Services
11830380 4134175 FIX: Um cubo com várias partições de processamento gera muitas conexões de fonte de dados simultâneos no SSAS Serviços de análise
11591371 4091245 CORREÇÃO: Violação de acesso ocorre quando você consulta uma tabela com uma coluna de inteiro em 2017 de SQL Server e SQL Server 2016 Desempenho de SQL
11714686 4094706 FIX: Um thread de trabalho parece ficar depois que outro thread de trabalho é abortado quando você executa uma consulta paralela no SQL Server Serviço do SQL
11953725 4058175 CORREÇÃO: Backup banco de dados habilitado para TDE e as operações de restauração são lentas quando a chave de criptografia é armazenada em um provedor de EKM no SQL Server Serviço do SQL
11833599 4131960 CORREÇÃO: Uma violação de acesso ocorre quando você executar uma consulta select aninhada contra um índice de columnstore no SQL Server Mecanismo do SQL
11676935 4094858 CORREÇÃO: “ocorreu um erro inesperado” quando você usa o DAX medidas em visualizações de mesa poder BI no SQL Server Serviços de análise
11791348 4101502 CORREÇÃO: Backup de banco de dados habilitada a TDE com a compactação causa corrupção de banco de dados no SQL Server 2016 Serviço do SQL

Dentre os mais diversos bugs identificados e corrigidos destaco um relacionado ao bug de número: 11923632, artigo KB: 4230306, que corresponde um erro apresentado durante a restauração de um backup de banco de dados compactado que utiliza criptografia transparente de dados TDE.

Vale ressaltar que após a atualização desta nova atualização cumulativa, o número do build utilizado pelo Microsoft SQL Server 2016 SP1 será alterado para compilação: 13.0.4502.0.

Para realizar o download clique na imagem abaixo:

Fontes e Direitos Autorais: Suporte da Microsoft – https://support.microsoft.com/pt-br/help/4100997/cumulative-update-9-for-sql-server-2016-sp1 – 30/05/2018.

Microsoft SQL Server 2016 SP1 – Atualização Cumulativa 8 disponível


A Microsoft disponibilizou para download recentemente a Atualização Cumulativa 8 para SQL Server 2016 SP1.

As informações obtidas através do artigo KB4077064 publicado no site de suporte da Microsoft, esta atualização traz correções decorrentes dos problemas apresentados e identificados após o lançamento do SP1 e das atualizações cumulativas anteriores.

Relação de Atualizações Cumulativas disponíveis para o Microsoft SQL Server 2016 Service Pack 1:

SQL Server 2016 SP1 CU7
SQL Server 2016 SP1 CU6
SQL Server 2016 SP1 CU5
SQL Server 2016 SP1 CU4
SQL Server 2016 SP1 CU3
SQL Server 2016 SP1 CU2
SQL Server 2016 SP1 CU1
SQL Server 2016 SP1
SQL Server 2016 all builds

Hotfixes que estão incluídos neste pacote de atualização cumulativa


Número do bug do VSTS Número do artigo KB Descrição Área de correção
11190572 4074696 CORREÇÃO: Operação de análise falha e retorna um erro de nível de linha não-administradores no SSAS 2016 (modelo de tabela) Serviços de análise
11403782 4058565 CORREÇÃO: Erro de asserção ao executar um procedimento armazenado que faz referência a um objeto grande no SQL Server de 2014, 2016 e 2017 Desempenho de SQL
11455726 4074862 CORREÇÃO: Erro inesperado ao criar um subcubo em 2016 Analysis Services do SQL Server (modelo Multidimensional) Serviços de análise
11444126 4074881 CORREÇÃO: Erro de asserção quando os dados são inseridos em massa em uma tabela que contém índices columnstore não estão em cluster e de cluster no SQL Server 2016 Mecanismo SQL
11441098 4017445 CORREÇÃO: Um segmento de REFAZER não está disponível na réplica secundária depois que um banco de dados de disponibilidade é descartado no SQL Server Alta disponibilidade
10988062 4038932 CORREÇÃO: Change Data Capture funcionalidade não funciona no SQL Server Serviços de integração
11405602 4046745 CORREÇÃO: Declaração UPDATE falha silenciosamente quando você faz referência a uma função de partição inexistente na cláusula WHERE no SQL Server de 2014 2016 ou 2017 Mecanismo SQL
11405606 4048967 CORREÇÃO: Não é possível habilitar ou desabilitar a captura de dados de alteração para um banco de dados depois de anexar no SQL Server de 2014 2016 ou 2017 Mecanismo SQL
11405621 4054398 CORREÇÃO: Varejo “Comparação inválida devido a nenhum AGRUPAMENTO” assert ocorre no SQL Server de 2014, 2016 e 2017 Mecanismo SQL
11297169 4013247 CORREÇÃO: Assinaturas do SSRS falham na execução de um relatório que se conecta a uma lista do SharePoint externo O Reporting Services
11396933 2932559 CORREÇÃO: Totais estão errados depois de filtrar em um item de tabela dinâmica e remover o filtro no SSAS Serviços de análise
11511975 4077105 CORREÇÃO: Erro de falta de memória quando o espaço de endereço virtual do processo do SQL Server é muito baixo em SQL Server Mecanismo SQL
11455724 4082865 CORREÇÃO: O SSAS falha quando uma consulta é executada em uma grande tabela particionada no SQL Server 2016 Serviços de análise
11456360 4083949 CORREÇÃO: SSAS pode apresentar falha quando você executa uma consulta DAX usando-se um usuário não-administrador do Windows no SQL Server 2016 Serviços de análise
11511973 4057307 CORREÇÃO: Modo Multidimensional trava aleatoriamente e uma violação de acesso ocorre no SSAS 2016 ou no SSAS 2014 Serviços de análise
11509590 4086136 CORREÇÃO: O SSAS para de responder quando você executa uma consulta MDX no SQL Server 2016 Analysis Services (modelo Multidimensional) Serviços de análise
11426456 4087358 CORREÇÃO: Sequência de caracteres de conexão baseada em expressão é limpo quando você configurar fontes de dados para o relatório de 2016 SSRS O Reporting Services
11508542 4088901 CORREÇÃO: Falha de afirmação ao sys.dm_db_log_space_usage instrução é executada em um instantâneo de banco de dados no SQL Server 2016 Alta disponibilidade
11183472 4089324 CORREÇÃO: Erro 15665 quando você chamar sp_set_session_context repetidamente com o valor da chave nula no SQL Server 2016 Mecanismo SQL
11565899 4089099 CORREÇÃO: Leva muito tempo para restaurar um banco de dados criptografado TDE backup no SQL Server Mecanismo SQL
11529110 4089623 CORREÇÃO: Memória insuficiente ocorre e consulta falhar quando você executa a consulta MDX com opção não vazios no SSAS 2016 e SSAS 2014 Serviços de análise
11053682 4089950 Atualização para dar suporte à eliminação de partições em planos de consulta que têm índices espaciais no SQL Server 2016 Desempenho de SQL
11323371 4090025 CORREÇÃO: Mascaramento aleatório não colocar máscara em valores BIGINT corretamente no SQL Server Segurança do SQL
11456072 4090032 CORREÇÃO: Memória obtém esgotada ao executar o relatório de BI de energia que executa a consulta DAX no modo multidimensional do SSAS 2016 Serviços de análise
11569422 4089948 CORREÇÃO: Bloqueio de consulta Intra quando os valores são inseridos em um índice particionado columnstore em cluster no SQL Server 2016 Mecanismo SQL
11281514 4052131 CORREÇÃO: DMV sys.dm_os_windows_info retorna valores errados para 10 do Windows e Windows Server 2016 Mecanismo SQL
11301441 4058700 CORREÇÃO: Erro de 9004 intermitente quando um backup é restaurado por meio do modo de espera no SQL Server 2014 Mecanismo SQL
11336087 4057615 CORREÇÃO: Erro de “Sintaxe incorreta próximo a palavra-chave ‘KEY'” quando você adiciona uma tabela Oracle com coluna principal chamada ‘KEY’ no SQL Server 2016 Serviços de integração
11339410 4058289 CORREÇÃO: A instrução ALTER procedimento com criptografia falha quando você criptografa um procedimento armazenado não publicados no SQL Server 2016 Mecanismo SQL
11420793 4058747 CORREÇÃO: Erro ao atualizar o banco de dados do SSIS catálogo na Standard Edition do SQL Server 2016 Serviços de integração
11457917 4077683 CORREÇÃO: Sp_execute_external_script de procedimento armazenado do sistema e memória do DMV sys.dm_exec_cached_plans causa vazamento no SQL Server 2016 e 2017 Mecanismo SQL
11447600 4038881 CORREÇÃO: Exceção inesperada ocorre quando você processar dimensões usando o processo de atualização no SSAS 2016 Serviços de análise
11309597 4073393 CORREÇÃO: erro “área de dados passada para uma chamada do sistema é muito pequena” ao iniciar um aplicativo de área de trabalho de ponte em um SQL Server de 2014 2016 e 2017 Mecanismo SQL
11446129 3192154 Uma opção de plano de consulta não ideal faz com que o desempenho ruim quando valores fora do intervalo representado nas estatísticas serão pesquisados em SQL Server 2016 e 2017 Desempenho de SQL
11548517 3147012 CORREÇÃO: Uso de pontos de verificação de disco grandes ocorre para um grupo de arquivos de memória otimizada durante cargas de trabalho pesadas de memória OLTP de memória
11559191 4058174 CORREÇÃO: Contenção de tempdb pesada ocorre no SQL Server 2016 Mecanismo SQL
11516257 4087406 CORREÇÃO: Erro 9002 quando não houver nenhum espaço em disco suficiente para o crescimento de log crítica no SQL Server 2014 e 2016 Mecanismo SQL
11444654 4090486 CORREÇÃO: Backup gerenciado não processa renomear nome de banco de dados para um novo nome com espaços no SQL Server 2016 à direita Ferramentas de gerenciamento
11704293 4078596 CORREÇÃO: Violações de acesso aleatórias ocorrem quando você executa o procedimento armazenado no SQL Server 2016 de monitoramento Mecanismo SQL
11545426 4089276 Melhora o desempenho de consulta quando um filtro de bitmap otimizado é aplicado a um plano de consulta no SQL Server 2016 e 2017 Mecanismo SQL
11532381 4089819 CORREÇÃO: erro “esgotado durante a espera de registrador de divisão de buffer – tipo 4” quando você usa grupos de disponibilidade no SQL Server 2016 ou 2017 Alta disponibilidade

Resoluções adicionais

Soluções para os seguintes problemas também estão incluídas no SQL Server 2016 SP1 CU8.

Número do bug do VSTS Descrição
11701162 Um erro de declaração ocorre quando você parar a propagação automática de um grupo de disponibilidade.
11704344 DAX consultas são executadas mais lentamente que antes após você fazer backup de um banco de dados do SSAS tabular.
11704240 PolyBase falha se PolyBase contadores estão ausentes ou corrompidos no Monitor de desempenho do Windows.
11704339 Melhora o desempenho de consulta quando for aplicado um filtro de bitmap otimizado para o plano de consulta.
11704329 Recuperação paralela falha com um tempo limite trava de buffer em uma réplica de um grupo de disponibilidade sempre no secundário.
11701219 A linha de tendência do KPI não é atualizada quando o conjunto de dados é atualizado.
11704269 Adiciona o suporte do uso de um banco de dados do SQL Server 2017 como uma fonte de dados de um modelo de DirectQuery tabular no SSAS 2016.
11704293 Violações de acesso aleatórias ocorrem quando você executa [dbo]. [usp_CollectWhoIsActiveData] no SQL Server 2016.
11704335 Replicação de dados da Oracle para SQL falha quando você atualizar o CU7 para o SQL Server 2016 SP1.

Dentre os mais diversos bugs identificados e corrigidos destaco um bem específico relacionado a backups de bancos de dados criptografados através do recurso TDE que apresentavam um longo de restauração, sendo este o bug de número: 11565899, artigo KB: 4089099.

Vale ressaltar que após a atualização desta nova atualização cumulativa, o número do build utilizado pelo Microsoft SQL Server 2016 SP1 será alterado para compilação: 13.0.4474.0.

Para realizar o download clique na imagem abaixo:

Fontes e Direitos Autorais: Suporte da Microsoft – https://support.microsoft.com/pt-br/help/4077064.

#21 – Para que serve


Olá, pessoal, bom dia.

Tudo bem? E a i como esta a loucura na sua cidade, devido a esta paralisação dos caminhoneiros em todo Brasil? Posso dizer que aqui em São Roque, interior do estado de São Paulo não esta nada fácil.

Independente da falta de combustível, gás de cozinha, entre outras coisas, não me pode faltar força de vontade e disposição para estar aqui no meu blog, publicando mais um post da sessão Para que serve, sendo este o post de número 21.

É a vida de um DBA e MVP não é fácil, mesmo com o Brasil muito prejudicado e praticamente parado, tenho alguns afazeres para hoje, por este e outros motivos, acordei bem cedo para compartilhar com vocês um dos novos recursos adicionados ao Microsoft SQL Server 2017.

Como todos nós já sabemos, a cada nova versão que a Microsoft disponibilizado do SQL Server, uma nova avalanche de conceitos, funcionalidades, comandos e diversidade de possibilidades são adicionadas ao produto, no post de hoje vou apresentar propriamente uma nova funcionalidade deste fascinante Sistema Gerenciador de Banco de Dados, que veio justamente para ser um divisor de águas em uma das principais atividades de qualquer DBA, o tão temido processo de reindexação(reindex) ou reconstrução(rebuild) de índices em nossos ambientes de bancos de dados.

Acredito que você Administrador de Servidores, DBA ou Profissional de TI, já deve ter se deparado por algum momento em situações que necessitavam ou requeriam o processamento de atividades relacionadas aos procedimentos de manutenção de um ou mais índices existentes em um banco de dados, e ai aquela tão ingrata pergunta.

A que horas vamos realizar este procedimento sem impactar em nossos ambientes? E logicamente você já se deparava em seus pensamentos: “Meu deus, vou ter que passar mais uma noite acordado, fazendo manutenções….” Posso dizer por experiência própria que esta é uma da mais duras realidades que eu já enfrentei nesta minha longa jornada de profissional de TI desde 1994… Mas seguinte em frente, a partir do Microsoft SQL Server 2017 isso mudou, o time de engenheiros e desenvolvedores desta nova versão adicionaram um novo recurso denominado “Resumable Online Index Rebuilds”, em uma simples tradução “Reconstrução Online de Índice resumível”, ou seja, a possibilidade de reconstruir um índice de forma online de acordo com a sua necessidade, tendo a possibilidade de interromper o processo de reconstrução sem correr qualquer risco de perda.

Isso não é coisa de outro mundo? A resposta é não, isso é coisa do Microsoft SQL Server 2017.

Sendo assim, chegou a hora de conhecer um pouco mais sobre o post de número 21 da sessão Para que serve. Então seja bem vindo ao #21 – Para que serve – Resumable Online Index Rebuilds.

Espero que você goste….


Introdução

Quando decidimos trabalhar na área de tecnologia, em diversos momentos temos que saber que esta é um das diversas áreas profissionais que no decorrer da nossa carreira somos obrigados a praticamente abrir mão de nossa vida sociais, familiar e até mesmo pessoal.

Trabalhar na área de tecnologia da informação, nos dias de hoje tem mudado muito se comparado ao início dos anos 80, 90 e provavelmente a partir dos anos 2000 isso mudou mais ainda, principalmente para aqueles que optaram assim como eu para trabalhar com banco de dados, quem nunca teve que passar horas e horas madrugada a dentro realizando manutenções em seus ambientes de bancos de dados, com a “simples” missão de tudo estar funcionando a partir de um determinado horário, é parece fácil, parece ser algo simples, parece ser algo suportável, mas não é, e pensando nisso(demorou) que a partir da versão 2017 do Microsoft SQL Server, nós Administradores de Bancos de Dados e Profissionais de Tecnologia, temos a possibilidade de realizar algumas das mais preocupantes atividades de administração de bancos de dados de uma maneira mais usual, simples e pode-se dizer “humana” que é a atividade de reconstrução de índice.

As atividades relacionadas a manutenções de bancos de dados, ainda mais aquelas relacionadas diretamente a índices, são por diversas vezes as mais demoradas, atividades que dependem totalmente do uso de CPU e Disco, recursos físicos de hardwares que podem apresentar em algum momento sobrecarga de processamento, ocasionando situações de contenção “gargalos”, lentidão na leitura e escrita de dados, que nos obrigam a ter que interromper as atividades em execução ou planejadas a posterior.

Legal, acredito que você já tenha conhecido um pouco sobre este recurso de forma conceitual, vamos agora colocar a mão nos teclados e conhecer de forma prática como fazer dele, para isso vamos preparar nosso ambiente a partir de agora.

Criando o Ambiente

Para realizar nossa simples prática, começaremos pela execução do Bloco de Código 1, responsável por criar a seguinte estrutura:

  • Database: ResumableOnlineIndexRebuilds;
  • Table: ResumableOnlineIndexRebuildsTable;
  • Clustered Index: PK_ResumableOnlineIndexRebuildsTable_Codigo; e
  • Data Compression: Page.

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

— Acessando o Banco de Dados —
Use ResumableOnlineIndexRebuilds
Go

— Criando a Tabela ResumableOnlineIndexRebuildsTable —
Create TABLE ResumableOnlineIndexRebuildsTable
(Codigo int IDENTITY(1,1) NOT NULL,
Cliente int NOT NULL,
Vendedor varchar(30) NOT NULL,
Quantidade smallint NOT NULL,
Valor numeric(18, 2) NOT NULL,
Data date NOT NULL
Constraint [PK_ResumableOnlineIndexRebuildsTable_Codigo] Primary Key (Codigo))
WITH(Data_Compression=PAGE)
Go

Perfeito, ambiente criado, vamos para o próximo passo, Bloco de Código 2, responsável por inserir um massa de dados aleatória, com uma quantidade de linhas de registros que pode variar de 1 até 1.ooo.ooo(milhão de linhas), contar quantas linhas temos em nossa tabela e seu espaço de alocado:

— Bloco de Código 2 —
— Inserindo a Massa de Dados na Tabela ResumableOnlineIndexRebuildsTable —
Declare @Texto Char(130),
@Posicao TinyInt,
@ContadorLinhas Int

Set @Texto = ‘0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ\_abcdefghijklmnopqrstuvwxyzŽŸ¡ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ’ — Existem 130 caracteres neste texto —

Set @ContadorLinhas = Rand()*1000000 — Definir a quantidade de linhas para serem inseridas —

While (@ContadorLinhas >=1)
Begin

Set @Posicao=Rand()*130

If @Posicao <=125
Begin
Insert Into ResumableOnlineIndexRebuildsTable (Cliente, Vendedor, Quantidade, Valor, Data)
Values(@ContadorLinhas,
Concat(SubString(@Texto,@Posicao+2,2),SubString(@Texto,@Posicao-4,4),SubString(@Texto,@Posicao+2,4)),
Rand()*1000,
Rand()*100+5,
DATEADD(d, 1000*Rand() ,GetDate()))
End
Else
Begin
Insert Into ResumableOnlineIndexRebuildsTable (Cliente, Vendedor, Quantidade, Valor, Data)
Values(@ContadorLinhas,
Concat(SubString(@Texto,@Posicao-10,1),SubString(@Texto,@Posicao+4,6),SubString(@Texto,@Posicao-12,3)),
Rand()*1000,
Rand()*100+5,
DATEADD(d, 1000*Rand() ,GetDate()))

End

Set @ContadorLinhas = @ContadorLinhas – 1
End

Observação: A quantidade de linhas e tempo de processamento vai depender única e exclusivamente do hardware que você esta utilizando.

— Contando a quantidade de linhas da Tabela ResumableOnlineIndexRebuildsTable —
Select Count(*) From ResumableOnlineIndexRebuildsTable
Go

— Descobrindo o tamanho da Tabela Pedidos —
Exec sp_spaceused ‘ResumableOnlineIndexRebuildsTable’
Go

Por enquanto nenhuma novidade, acredito que você deve ter conseguido executar os blocos de código de forma simples e tranquilo, nosso próximo passo é conhecer e aplicar o processo de rebuild de índice através deste novo recurso, para isso vamos começar utilizando o Bloco de Código 3 apresentado abaixo:

— Bloco de Código 3 —
Alter Index [PK_ResumableOnlineIndexRebuildsTable_Codigo] ON ResumableOnlineIndexRebuildsTable
Rebuild With(ONLINE=ON, RESUMABLE=ON)
Go

Note que estamos fazendo uso neste procedimento de rebuild de dois novos parâmetros adicionados ao comando Alter Index, sendo eles:

  • OnLine: Determina que o processo de rebuild será feito de forma online (por páginas) ou não. Vale ressaltar que o Resumable index rebuild tem suporte somente para o rebuild online, sendo assim, este parâmetro é obrigatório e   devemos sempre utilizar o parâmetro ONLINE=ON.
  • Resumable: Orienta o Database Engine a definir se o rebuild será feito permitindo ou não o uso da opção de Pause/Resume.

Além destes dois principais parâmetros, foram também adicionados outros três como complementares:

  • Max_Duration: Permite definir em minutos, a quantidade de tempo que o rebuild irá executar antes de ser suspenso automaticamente. Esse valor deve ser maior que 0 e menor ou igual a 10080 (1 semana), algo que poderá lhe permitir estabelecer um janela de trabalho e aplicar o procedimento de rebuild de forma programada.
  • Pause: Utilizando esse parâmetro, a operação de rebuild será pausada e ficará aguardando uma nova instrução Alter Index para este índice dar continuidade ao processo ou então o comando ABORT, para interromper o rebuild.
  • Abort: Parâmetro utilizado para interromper o rebuild do índice.

Importante

Dependendo do conjunto de parâmetros utilizados e seus respectivos valores, o Database Engine poderá apresentar algumas mensagens de erros dentre elas:

Mensagem 1 – Informa que você fez uso do parâmetro Resumable=On, mas o parâmetro Online=Off.

Msg 11438, Level 15, State 1, Line 2
The RESUMABLE option cannot be set to ‘ON’ when the ONLINE option is set to ‘OFF’

Mensagem 2 Orienta e informa caso o tempo limite informado acima seja atingido e processo de rebuild ainda não foi concluído e mesmo será interrompido:

Msg 3643, Level 16, State 1, Line 20
The operation elapsed time exceeded the maximum time specified for this operation. The execution has been stopped.
Msg 596, Level 21, State 1, Line 19
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 19
A severe error occurred on the current command. The results, if any, should be discarded.

Seguindo em frente, vamos agora similar um processo de resumo (resume) do nosso índice. Vamos então realizar o processo de resume através do Bloco de Código 4:

— Bloco de Código 4 —
Alter Index [PK_ResumableOnlineIndexRebuildsTable_Codigo] ON ResumableOnlineIndexRebuildsTable
Resume
Go

Nota: Uma forma simples e prática de simular um processo de interrupção do Resumable Index é interromper a execução da query clicando no botão Cancel Executing Query.

Outro detalhe importante, estamos fazendo uso do parâmetro Resume o qual deverá informar ao Database Engine que o procedimento de alteração do nosso índice deverá ser resumido. Quando o comando resume for utilizado e no respectivo momento não existir um procedimento de resumable index aplicado, será retornada a seguinte mensagem de erro:

Msg 10638, Level 16, State 1, Line 70
ALTER INDEX ‘RESUME’ failed. There is no pending resumable index operation for the index ‘PK_ResumableOnlineIndexRebuildsTable_Codigo’ on ‘ResumableOnlineIndexRebuildsTable’.

Monitorando através da sys.index_resumable_operations

Cada alteração aplicada aos nossos índices pode ser monitorada em tempo real através do uso da visão de sistema: sys.index_resumable_operations, a qual teve o acréscimo de uma nova coluna denominada is_resumable, que apresenta a função de informar se o respectivo índice possui o procedimento de resumable aplicado.

O próximo passo consiste no procedimento de pausa (pause), ou seja, realizar uma pausa na execução do resumable index aplicado ao nosso índice, para tal vamos utilizar o Bloco de Código 5 abaixo:

— Bloco de Código 5 —
Alter Index [PK_ResumableOnlineIndexRebuildsTable_Codigo] ON ResumableOnlineIndexRebuildsTable
Pause
Go

Ao realizar o procedimento de pause interrompendo o rebuild de um índice, a sessão responsável pela execução da operação de rebuild irá receber a mesma mensagem de erro de quando o rebuild é pausado:

Msg 1219, Level 16, State 1, Line 17
Your session has been disconnected because of a high priority DDL operation.
Msg 1219, Level 16, State 1, Line 17
Your session has been disconnected because of a high priority DDL operation.
Msg 596, Level 21, State 1, Line 16
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 16
A severe error occurred on the current command. The results, if any, should be discarded.

 

Vale ressaltar que ao realizar o procedimento de pausa (Pause) a um determinado índice, o mesmo será adicionado na visão sys.index_resumable_operations, tendo a coluna state_desc preenchida com o PAUSED, sendo assim, este rótulo será mantido até que uma outra instrução de Resume ou Abort venha a ser aplicado ao mesmo.

Por fim, nosso último passo consiste em similar o processo de interrupção do procedimento de resumable index, fazendo com que o mesmo deixe de ser mantido como um índice resumível de forma online, através da parâmetro Abort, para isso vamos utilizar o Bloco de Código 6 a seguir:

— Bloco de Código 6 —
Alter Index [PK_ResumableOnlineIndexRebuildsTable_Codigo] ON ResumableOnlineIndexRebuildsTable
Abort
Go

De forma idêntica realizada pelo parâmetro Pause, ao realizar o procedimento de Abort, interrompendo o rebuild de um índice, a sessão responsável pela execução da operação de rebuild irá receber a mesma mensagem de erro de quando o rebuild é pausado:

Msg 1219, Level 16, State 1, Line 17
Your session has been disconnected because of a high priority DDL operation.
Msg 1219, Level 16, State 1, Line 17
Your session has been disconnected because of a high priority DDL operation.
Msg 596, Level 21, State 1, Line 16
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 16
A severe error occurred on the current command. The results, if any, should be discarded.

Mas que beleza, conseguimos realizar o procedimento de abort, neste momento nosso índice não esta mais sendo reconhecido como resumable index, desta forma, o mesmo não poderá ser utilizado com um índice online resumível a qualquer momento.

Praticamente chegamos ao final deste post, falta um pouquinho para encerrar, pois, ainda tenho um último detalhe importante para compartilhar com você a seguir.

Limitações

Pois bem, como tudo em nossas vidas, sempre nos deparamos com situações ou condições que podem nos limitar de fazer uso ou realizar determinadas ações e isso não é diferente com o Resumable Online Index Rebuilds:

  • Suporta somente índices no formato Row Store;
  • Não possui suporte nativo para indexação online aplicada ao system database TEMPDB, ou seja, SORT_IN_TEMPDB do Alter Index não é aplicável;
  • Não possui suporte nativo para colunas do tipo TimeStamp;
  • Não possui suporte nativo com colunas calculadas (computadas);
  • Não é possível utilizar esse recurso em índices desativados; e
  • O Resumable OnLine Index Rebuil não pode ser utilizada dentro de uma transação de usuário, somente em transações relacionadas a atividades de manutenção de índices aplicadas diretamente ao escopo de banco de dados.

Agora sim, chegamos ao final, mas que trabalheira danada deu este post.

Espero que você tenha gostado, eu acredito que sim.


Referências

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-index-resumable-operations

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-file-space-usage-transact-sql

https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-index-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-index-transact-sql

Links

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

https://pedrogalvaojunior.wordpress.com/2018/04/12/20-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2018/01/02/19-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/12/15/18-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/11/24/17-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/10/01/16-para-que-serve/

Conclusão

Em algum momentos, a otimização de desempenho do banco de dados é sempre uma tarefa chave para o DBA. A manutenção de índice desempenha um papel vital na otimização do desempenho do banco de dados.

Às vezes, em ambientes OLTP (Online Transaction Processing ou Processamento de Transações em Tempo Real) que apresentam um longo tempo de processamentos, temos janelas de manutenção muito limitada e se um índice é grande, pode não ter tempo suficiente para reconstruir o índice.

Analisando estas situações, o Resumable Online Index Rebuilds se apresenta como uma solução de extrema importância e grande aliada na vida do DBA SQL Server, a sua adoção e aplicabilidade pode melhorar drasticamente as rotinas de reconstrução (rebuild) de índices, no que diz respeito ao seu volume de dados, por consequência seu tamanho e claro o quanto este elemento representa nas tarefas de pesquisa de dados realizadas pelas aplicações que fazem acesso a ele.

Realizar uma boa manutenção em qualquer ambiente de banco de dados, é algo que nos traz tranquilidade, saber que estamos adotando soluções para manter nossos ambientes protegidos, íntegros e organizados e papel fundamental para qualquer profissional responsável direta ou indiretamente por esta área.

Neste post, você pode conhecer este novo recurso adicionado a partir do Microsoft SQL Server 2017, o Resumable Online Index Rebuilds, uma importante melhoria adicionada ao produto, que com certeza vai permitir que muitos profissionais de tecnologia e DBAs possam passar noites de mais tranquilas.

E isso ai, este é o fantástico Microsoft SQL Server, que a cada versão ou atualização também esta preocupado com a qualidade de vida daqueles que assim como eu são apaixonados por este produtos…

Vai SQL Server, Vai SQL Server….

Agradecimentos

Mais uma vez obrigado por sua ilustre visita, sinto-me honrado com sua presença, espero que este conteúdo possa lhe ajudar e ser útil em suas atividades profissionais e acadêmicas.

Um forte abraço, até o próximo post da sessão Para que serve…..

Uma ótima segunda – feira e boa semana.

Valeu.

Microsoft disponibiliza atualização cumulativa 7 para o Microsoft SQL Server 2017


A Microsoft disponibilizou ontem dia 24/05 uma nova  Atualização Cumulativa para o Microsoft SQL Server 2017, denominada (Cumulative Update 7 – Build number: 14.0.3026.27), disponível para todas as edições existentes para Windows e Linux.

Com base no artigo KB4229789 publicado no site de suporte da Microsoft, a atualização apresenta correções para múltiplos bugs descobertos após o lançamento do SQL Server 2017 e atualizações cumulativas anteriores, dentre as quais ao final do artigo bloco de código que de ser realizado por aqueles que já tenham instalado as Cumulative Updates 2 ou 3 e necessitam trabalhar com o Query Store.

Outro bug corrigido destaca-se um bem conhecido relacionado ao Analysis Services após a execução de uma função DAX e um que faz com que o SQL Server não seja inicializado quando uma imagem de contêiner do Linux é usada no Docker para Windows.

A seguir destaco a lista de hotfixes incluídos nesta nova atualização:

VSTS bug number KB article number Description Fix area Platform
11701171 2932559 FIX: Totals are wrong after you filter on a pivot table item and remove the filter in SSAS Analysis Services Windows
11701194 4090032 FIX: Memory gets exhausted when you run Power BI report that executes DAX query on SSAS 2016 and 2017 Multidimensional mode Analysis Services Windows
11751257 4096258 FIX: An unexpected exception occurs and SSAS crashes when you run a particular DAX function in SQL Server 2017 Analysis Services Windows
11919582 4090004 Improvement: Configure SESSION_TIMEOUT value for a Distributed Availability Group replica in SQL Server 2016 and 2017 High Availability Windows
11919583 4099919 Transparent Data Encryption added for Log Shipping in SQL Server 2016 and 2017 High Availability Windows
11708399 4135045 FIX: DROP_ASYMMETRIC_KEY causes an instance of SQL Server to crash if it’s rolled back from a trigger SQL service All
11953218 4212960 FIX: SQL Server will not start when you run a SQL Server 2017 Linux container image on Docker for Windows SQL service Linux
11701193 4074862 FIX: Unexpected error when you create a subcube in SQL Server 2016 and 2017 Analysis Services (Multidimensional model) Analysis Services Windows
11701196 4083949 FIX: SSAS may crash when you run a DAX query by using a non-admin Windows user in SQL Server 2016 and 2017 Analysis Services Windows
11701201 4086136 FIX: SSAS stops responding when you run an MDX query in SQL Server 2016 and 2017 Analysis Services (Multidimensional model) Analysis Services Windows
11701140 4086173 FIX: Access violation occurs when executing a DAX query on a tabular model in SQL Server Analysis Services Analysis Services Windows
11701208 4089623 FIX: Out of memory occurs and query fails when you run MDX query with NON EMPTY option in SSAS Analysis Services Windows
11578523 4089718 Improvement: Performance issue when upgrading MDS from SQL Server 2012 to 2016 Data Quality Services (DQS) Windows
11701179 4093226 FIX: “DirectQuery may not be used with this data source” error when you browse a Direct Query model in SQL Server Analysis Services Windows
11814297 4099472 PFS page round robin algorithm improvement in SQL Server 2016 SQL service Windows
11870176 4136912 Multiple device VDI backup can hang on Linux SQL service Linux
11634330 4092554 FIX: “Cannot use SAVE TRANSACTION within a distributed transaction” error when you execute a stored procedure in SQL Server SQL service Windows
11922305 4157948 FIX: Floating point overflow error occurs when you execute a nested natively compiled module that uses EXP functions in SQL Server In-Memory OLTP All
11642085 4098732 FIX: A calculation error occurs when a secured measure is queried in SSAS 2017 Analysis Services Windows
11923799 4230306 FIX: Restore of a TDE compressed backup is unsuccessful when using the VDI client SQL service All
11823305 4101502 FIX: TDE enabled database backup with compression causes database corruption in SQL Server 2016 SQL service All
11971856 4230516 FIX: A memory assertion failure occurs and the server is unable to make any new connections in SQL Server SQL service Windows
11952929 4163087 FIX: Performance is slow for an Always On AG when you process a read query in SQL Server SQL service All
11951171 4230465 FIX: An unexpected communication link error occurs when using datetime2 fields accessing a database in SQL Server 2017 SQL service All
11974640 4230542 FIX: Pacemaker promotes local replica to primary may fail when you use AlwaysOn AG in SQL Server 2017 High Availability Linux
11974802 4293576 FIX: “Non-yielding” error when you try to recover an In-Memory database in SQL Server In-Memory OLTP All
11853504 4134601 FIX: “Could not load file or assembly ‘Microsoft.AnalysisServices.AdomdClientUI” error when a “Process Full” operation is run in SQL Server Analysis Services Windows
11967438 4230730 FIX: A dead latch condition occurs when you perform an online index rebuild or execute a merge command in SQL Server SQL service Windows

Para realizar o download clique na imagem abaixo:

Fontes e Direitos Autorais: Microsoft Support – 24/05/2018 – https://support.microsoft.com/en-us/help/4229789/cumulative-update-7-for-sql-server-2017

Material de Apoio – Abril 2018


Muito, mas, muito bom dia!

São exatamente 08:00 horas da manhã e você já esta dando uma passadinha por aqui, que legal, obrigado por mais esta visita.

E ai tudo bem com você? Espero que sim. Estou aqui mais uma vez procurando colaborar e compartilhar com a comunidade técnica em mais um post da sessão Material de Apoio dedicado exclusivamente ao meu blog.

Espero que você esteja gostando do conteúdo aqui disponibilizado, como também, possa me ajudar a cada vez mais melhorar ainda.

O post de hoje

Seja bem-vindo a mais um post da sessão Material de Apoio, sendo o segundo do ano de 2018 e de número 156 no total desta sessão.

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 atualmente como Professor de Banco de Dados.

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

  • @@TranCount;
  • Claúsula Where;
  • Comando Declare;
  • Comando Kill;
  • Comando Order By;
  • Comando Rollback;
  • Comando While;
  • Conversão implícita de dados;
  • Cursor;
  • Database Level Events;
  • Dynamic Management Function sys.dm_exec_query_plan;
  • Dynamic Management Function sys.dm_exec_sql_text;
  • Dynamic Management View sys.dm_exec_query_stats;
  • Dynamic Management View sys.dm_os_tasks;
  • Dynamic Management View sys.dm_os_threads;
  • Error Code 3609;
  • Função Cast;
  • Função EventData();
  • Função Raiserror();
  • Função Top();
  • Loop de processamento infinito;
  • Opção Recompile;
  • Operador Cross Apply;
  • OS Threads;
  • Processos em execução;
  • Sessions;
  • Set RowCount;
  • Stored Procedure Exec;
  • System Table sys.sysprocesses;
  • Tratamento de Erros;
  • Trigger DDL; e
  • Variáveis.

Espero que este conteúdo possa lhe ajudar em seus atividades profissionais e acadêmicas. 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.

Material de Apoio

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

1 – Material de Apoio – Abril 2018 – Encerramento processos que apresentam várias horas ou longo tempo de execução.sql

2 – Material de Apoio – Abril 2018 – Trigger DDL DATABASE LEVEL EVENTS – Bloqueando a criação de tabelas com um determinado nome.sql

3 – Material de Apoio – Abril 2018 – Identificando a SessionID e suas respectivas OS Threads.sql

4 – Material de Apoio – Abril 2018 – Relação de Querys – Apresentam conversão implícita de dados.sql

5 – Material de Apoio – Abril 2018 – Criando um loop infinito utilizando SET ROWCOUNT com Variable Table.sql

6 – Material de Apoio – Abril 2018 – Utilizando Rollback Transaction dentro de Trigger com tratamento de erro 3609.sql

7 – Material de Apoio – Abril 2018 – Utilizando Rollback Transaction dentro de Trigger decrementando o valor de @@Trancount.sql

Fique a vontade para copiar, editar, compartilhar e distribuir estes arquivos com seus contatos, aproveite se possível deixe seu comentário, críticas, sugestões e observações.

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:

https://pedrogalvaojunior.wordpress.com/2018/02/13/material-de-apoio-fevereiro-2018/

https://pedrogalvaojunior.wordpress.com/2017/11/04/material-de-apoio-novembro-2017/

https://pedrogalvaojunior.wordpress.com/2017/08/08/material-de-apoio-agosto-2017/

https://pedrogalvaojunior.wordpress.com/2017/05/09/material-de-apoio-maio-2017/

Agradecimento

Quero agradecer imensamente a sua visita, sinto-me honrado e orgulhoso de contar com a sua presença.

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

Um forte abraço, muita saúde, sucesso e vamos em frente…

#19 – Para que serve


Salve galera, boa tarde.

Feliz Ano Novo, Feliz 2018, o tempo passou e hoje dia 02/01 nos encontramos no primeiro dia útil para grande maioria da população mundial, mas que dureza pensar que temos mais 365 dias pela frente para superarmos, por outro lado que bom pensar assim.

Neste primeiro post de 2018 não vou trazer nenhuma novidade relacionada ao Microsoft SQL Server ou banco de dados, mas sim compartilhar como faço em alguns momentos, conceitos já conhecidos da grande maioria.

Hoje quero trazer para vocês um dos assuntos mais discutidos quando estamos trabalhando com nossos servidores de banco de dados, estou me referindo ao período de processamento do comando select dentro de um bloco de transação conhecido como Ciclo de Vida de Query através do comando Select.

Sendo assim, chegou a hora de conhecer um pouco mais sobre o primeiro post de 2018, post de número 19 da sessão Para que serve. Então seja bem vindo ao #19 – Para que serve – Ciclo de Vida de Query através do comando Select.


Introdução

Um dos comandos mais utilizados em qualquer Sistema Gerenciador de Banco de Dados ou propriamente um Banco de Dados é o comando Select, sendo este responsável em recuperar linhas do banco de dados e permite a seleção de uma ou várias linhas ou colunas de uma ou várias tabelas, no Microsoft SQL Server isso não é diferente.

Basicamente ao se executar um comando Select podemos estar trabalhando com uma simples query ou conjunto de querys que podem formar uma ou mais transações, é com base neste cenário que o comando Select composto por sua conjunto de argumentos e opções permite estabelecer um ciclo de vida dedicado exclusivamente ao seu período de compilação, execução e encerramento.

Desta forma, algumas perguntas podem surgir decorrentes do seu processo de processamento, dentre as quais destaco:

  1. Quais são as etapas para o processamento de um select? 
  2. Onde inicia e onde termina cada processo?

De uma maneira bastante simples e direta vou tentar responder estas questões, iniciando pela organização da estrutura de componentes utilizadas pelo comando Select, conhecidos como:

  • Relation Engine;
  • Storage Engine; e
  • Buffer Pool.
  1. Relational Engine é responsável pelos processos de Query Optmizer, Query Executor e Parse entre outros, avaliando toda a parte algébrica, sintaxe e plano de execução da Query.
  2. Storage Engine é o cara do I/O, responsável pelo gerenciamento e requisições de disco, alocações, Access Methods Code, Buffer Manager e Transaction MGR.
  3. Buffer Pool tem vários papeis, mas, um dos mais importantes é o gerenciamento de memória para o plano de execução e alocação de páginas no data cache.

A Figura 1 apresentada abaixo ilustra um modelo básico da estrutura de relação entre estes componentes:

Figura 1 – Estrutura dos componentes utilizados pelo comando select.

Logicamente, dentro de cada componente podemos encontrar diversos subcomponentes que formam sua estrutura, responsáveis por diversas ações e procedimentos, formando um ecossistema único para cada elemento, dentre eles destaco o Query Optimizer com suas diversas fases de otimização para gerar o plano de execução mais assertivo.

O Ciclo (Select)

O primeiro passo é estabelecer a conexão entre aplicação (ERP, CRM, Web, etc…) e o SQL Server. Para isso, é utilizado um protocolo chamado Network Interface (SNI). No fundo o SNI utiliza um outro protocolo, na verdade, podem existir vários protocolos e o mais conhecido é o famoso TCP/IP.

A Figura 2 abaixo ilustra o inicio do ciclo de vida do comando select através do acesso feito por uma aplicação:

Figura 2 – Representação do inicio do ciclo de vida do comando select.

Ao realizar a conexão através da comanda e do protocolo (TCP/IP), os pacotes TDS (Tabular Data Stream Endpoints) são encaminhados ao Protocolo Layer, que tem como papel “reconhecer e interpretar” o pacote e validar a informação, assim como sua origem (client). Após isso o conteúdo (SQL Command) do pacote é enviado ao Command Parse.

A Figura 3 apresenta o comportamento do Command Parse após o processo de reconhecimento e interpretação do pacote contendo o comando select ser realizado:

Figura 3 – Comportamento do Command Parse após o processo de reconhecimento dos pacotes.

Neste cenário o CMD Parser vai fazer o seu trabalho, primeiro validando o T-SQL, checando sintaxe, nomes de objetos, parâmetros, palavras chaves. A segunda parte é procurar no Buffer Pool se já existe um plano de execução compatível para está query, se sim, ele recupera este plano e executa (Query Executor), caso contrário, passa o result da análise (Query Tree) para o Query Optmizer que é o responsável por gerar o Execution Plan (plano de execução) que será usado na execução (próxima etapa) do ciclo.

Ao receber as instruções o Query Optimizer,  identifica a query realizando diversas etapas (fases 0,1,2) de otimização, afim de encontrar o plano mais eficiente, com base no “cost-based” (I/O, CPU). Nesta etapa as estatísticas são utilizadas servindo como Input de informação para tomada de decisão do Query Optimizer. Após o termino desta etapa, o plano de execução está pronto, passando o bastão para o Query Executor

O Query Executor é quem executa a Query, na verdade ele executa o plano de execução, colocando os operadores para trabalhar. É neste ponto também que ocorre a interação com a Storage Engine via interface Access Methods (OLE DB).

Seguindo em frente, Access Methods passa a solicitação para o Buffer Manager recuperar a página de dados, se a página especifica estiver em memória, o Buffer Pool solicita ao Data Cache que recupere a pagina, e retorna ao Access Methods (leituras logicas). Ao contrário, os dados são recuperados do disco (leituras físicas), colocados em cache e devolvendo o controle para o Access Methods. 

De posse dos dados, o Access Methods devolve a informação para o Relational Engine que será enviada ao Client que a solicitou, assim o resultando do comando select é apresentado na tela da aplicação exibindo assim os dados solicitados pelo usuário. Desta maneira, nosso ciclo ou melhor o ciclo de vida do comando select esta concluído, conforme a Figura 4 apresenta abaixo:

Figura 4 – Ciclo de vida do comando select concluído e dados apresentados para o usuário.

Com isso chegamos ao final do primeiro post de 2018 e post de número 19 da sessão Para que serve.


Referências

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql

https://technet.microsoft.com/en-us/library/ms189559(v=sql.90).aspx

http://www.sqlservergeeks.com/sql-server-architecture-part-2-the-relational-engine/

https://blogs.msdn.microsoft.com/tcaserta/2016/01/04/sql-server-fundamentos-storage-engine-parte-i/

https://blogs.msdn.microsoft.com/tcaserta/2016/01/04/sql-server-fundamentos-storage-engine-parte-i/

Links

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

https://pedrogalvaojunior.wordpress.com/2017/12/15/18-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/11/24/17-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/10/01/16-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/06/28/15-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/04/30/14-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/03/25/13-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/01/23/12-para-que-serve/

Conclusão

Como sempre a Microsoft e toda sua equipe nos surpreende com sua capacidade de trabalho, fortalecendo cada vez mais o Microsoft SQL Server não somente com um SGBD ou ferramenta de banco de dados, mas sim um ambiente completo para qualquer tipo de análise, desenvolvimento e administração que esteja relacionada com dados.

Este é o fantástico Microsoft SQL Server, surpreendente em todos os sentidos…

Agradecimentos

Mais uma vez obrigado por sua ilustre visita, sinto-me honrado com sua presença, espero que este conteúdo possa lhe ajudar e ser útil em suas atividades profissionais e acadêmicas.

Um forte abraço, até o próximo post da sessão Para que serve…..

Valeu.