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.

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…

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.

Script Challenge – 13 – A resposta….


Salve pessoal, bom dia.

Tudo bem?  Seja mais uma vez muito bem vindo ao meu blog, mais especificamente ao post que apresenta a resposta para o Script Challenge – 2017, publicado em outubro de 2017 destacando o retorno da sessão 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 13, sendo assim, seja bem vindo a mais um post da sessão Script Challenge.


Script Challenge 13

Falando do desafio de número 13, o mesmo foi publicado no mês de outubro de 2017, período de data que apresenta uma das comemorações mais importantes que ocorrem anualmente em quase todos os países do mundo, mas que especialmente no Estados Unidos da América.

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 13.

Bom chegou a hora de revelar o que exatamente este pequeno bloco de código esta fazendo, chegou o momento de revelar e desvendar este desafio, a seguir apresento a resposta para o Script Challenge 13 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 de apresenta 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 datas comemorativas mais tradicionais dos Estados Unidos, neste caso o Halloween(conhecido tradicionalmente como dia das bruxas).

Mesmo assim você pode estar se perguntando, o que Script Challenge 13 tem haver com dia das bruxas, ué tudo haver, pois quando falamos de bruxas, temos também em mente a relação com magia, fantasias, medo, terror e propriamente a fantasmas, isso mesmos fantasmas, algo que também pode acontecer em nossas tabelas com o passar do tempo conforme vamos realizando as manipulações de dados, torna-se possível se deparar com a ocorrência de possíveis dados fantasmas.

Então a resposta para o Script Challenge 13 é justamente a possibilidade que o script apresenta em identificar uma possível ocorrência de dados fantasmas em nossas tabelas e bancos de dados.

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

— Script Challenge 13 – A resposta – Identificando a ocorrência de dados fantasmas —

SELECT db_name(database_id),
                object_name(object_id),
                ghost_record_count,
                version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(N’GhostDB’),
                                                                            OBJECT_ID(N’GhostTable’),
                                                                            NULL,
                                                                            NULL ,
                                                                            ‘DETAILED’)
GO

Que coisa de louco isso Galvão! Sim realmente parece ser coisa de outro mundo, mas podem acontecer tranquilamente a qualquer momento, o complicado é imaginar, que nossos bancos de dados, podem ser vítimas deste tipo de situação.

Mas isso não é o fim do mundo, muito ao contrário, para este cenário temos uma grande vantagem. Você pode estar se perguntando qual, a resposta é simples, não precisamos chamar os Casas Fantasmas, nós mesmos podemos resolver facilmente isso. Foi pensando justamente nas possibilidades da ocorrência deste tipo de situação, que além da compartilhar a resposta para este desafio, vou deixar também um cenário de simulação de como é possível ocorrência a existência de dados fantasmas, como também a possibilidade de excluir estes “dados”, a seguir:

— Simulando a ocorrência de dados fantasmas —

— Criando o Banco de Dados – GhostDB —
Create Database GhostDB
Go

— Acessando o Banco de Dados —
Use GhostDB
Go

— Criando a Tabela GhostTable —
Create Table GhostTable
(GhostRecord Int)
Go

— Criando um índice clusterizado —
Create Clustered Index Ind_GhostTable_GhostRecord On GhostTable(GhostRecord)
Go

— Inserindo Dados na Tabela GhostTable —
Insert Into GhostTable
Select 100
Go

— Obtendo informações sobre as estatísticas de alocação de dados —
Select object_id,
index_id,
index_depth,
index_level
From sys.dm_db_index_physical_stats(db_id(),
object_id(‘GhostTable’),
object_id(‘Ind_GhostTable_GhostRecord’),
null,
null)
Go

— Obtendo informações sobre o Índice IND_GhostTable_GhostRecord —
Select id, name, root, first
from sys.sysindexes
where id=565577053 — Aqui você vai colocar o ID identificado do índice apresentado na sua máquina —
Go

— Identificando a página de dados que contem os dados inseridos na GhostTable —
SELECT first_page,
(convert(varchar(2), (convert(int, substring(first_page, 6, 1)) * power(2, 8)) +
(convert(int, substring(first_page, 5, 1)))) + ‘:’ + convert(varchar(11),
(convert(int, substring(first_page, 4, 1)) * power(2, 24)) +
(convert(int, substring(first_page, 3, 1)) * power(2, 16)) +
(convert(int, substring(first_page, 2, 1)) * power(2, 8)) +
(convert(int, substring(first_page, 1, 1))))) As Page
FROM SYS.SYSTEM_INTERNALS_ALLOCATION_UNITS
Where first_page = 0x180100000100 — Valor obtido no bloco de código anterior através da coluna root —
Go

— Habilitando a Trace Flag 3604 para apresentar informações sobre as páginas de dados —
DBCC TRACEON (3604)
GO

— Consultando informações sobre as páginas de dados relacionadas o índice Ind_GhostTable_GhostRecord —
DBCC PAGE(GhostDB,1,280,1)
Go

Após obter o resultado do DBCC Page procure pela coluna m_ghostRecCnt, neste momento ela deve esta apresentando o valor m_ghostRecCnt = 0.

— Excluíndo os registros em GhostTable —
Delete from GhostTable
Where GhostRecord=100
Go

— Consultando informações sobre as páginas de dados relacionadas o índice Ind_GhostTable_GhostRecord —
DBCC PAGE(GhostDB,1,280,3)
Go

Agora verifique novamente a coluna m_ghostRecCnt que neste momento deverá apresentar o valor igual á m_ghostRecCnt = 1, este é o indicador da ocorrência de um dado fantasma em nossa tabela.

— Confirmando a existência de um registro fantasmas —
SELECT db_name(database_id),
object_name(object_id),
ghost_record_count,
version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(N’GhostDB’), OBJECT_ID(N’GhostTable’), NULL, NULL , ‘DETAILED’)
GO

— Simulando a eliminação de dados fantasmas —
Alter Table GhostTable
Rebuild — Utilize este tipo de procedimento em uma tabela com poucos registros —
Go

— Confirmando a existência de um registros fantasmas —
SELECT db_name(database_id),
object_name(object_id),
ghost_record_count,
version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(N’GhostDB’),
OBJECT_ID(N’GhostTable’),
NULL,
NULL ,
‘DETAILED’)
GO

— Liberando espaço alocado anteriormente em disco pelos registros fantasmas —
Exec sp_clean_db_free_space @dbname=N’GhostDB’
Go

Meu deus, conseguimos, chegamos ao final, esta é a resposta para o Script Challenge 13, sinceramente falando achei que não iria conseguir compartilhar este conteúdo com vocês.

Espero que tenham gostado desta da volta desta sessão, como também, a nova maneira que pretendo apresentar os desafios e seus respostas.


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 13. A seguir apresento o resultado desta enquete:

A opção mais votada com 66,67% dos votos é justamente a resposta correta para este desafio, o qual retorna ao usuário informações relacionadas a identificação de páginas de dados com fragmentação.

Referências

Agradecimentos

Obrigado por sua visita, espero que o retorno desta sessão e o conteúdo aqui apresentado como um possível “desafio” possam 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.

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

Até a próxima…

Script Challenge – 2017 – O retorno….


Olá bom dia, comunidade e amantes de bancos de dados.

Tudo bem? E ai esta chovendo neste momento na sua cidade? Aqui em São Roque estávamos desde o último dia 12/10/2017 sem chuva, mas nesta última madrugado do dia 25/10 para o dia 26/10 ela retornou com grande força.

Introdução

Você pode estar se perguntando o que o retorno da chuva tem haver com o post desta sessão, na minha opinião tem tudo haver, estou justamente hoje aproveitando a madrugada de trabalho para retornar ao meu blog um das sessões que durante 2 anos me ajudou em muito a manter o número de visitantes em alta.

Se você não conhecia, vai ter a possibilidade de a partir de agora a cada 4 meses por desfrutar da sessão Script Challenge(Script Desafio ou Desafio do Script), pois bem, a melhor forma de traduzir eu deixo para você.

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.

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 – 13

O bloco de código Transact-SQL selecionado para fazer parte do Script Challenge que representa o retorno desta sessão, esta totalmente relacionado com uma tradicional comemoração norte americana realizada no mês de Outubro.

A seguir apresento o bloco de código:


Figura 1 – Short Script 13.

Muito bem, nosso Script Challenge esta apresentado, mas não tudo será como antes.

Gostaria então de destacar duas mudanças iniciais implementadas na sessão Script Challenge a partir deste post:

  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.

E ai preparado para o 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 – 13 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.


Agradecimentos

Obrigado por sua visita, espero que o retorno desta sessão e o conteúdo aqui apresentado como um possível “desafio” possam 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.

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

Sucesso e até mais.

Script Challenge – 12


Olá pessoal, bom dia.

Tudo bem? Olha eu aqui outra vez, com mais um Desafio de SQL Server!

O Script Challenge deste mês, com certeza poderá ajudar em muito o seu ambiente na identificação de recursos que possam estar gerando consumo de processamento. Não vou ficar dando dicas ou pistas deste código, quero contar com a sua participação.

A seguir apresentado o Código – Script Challenge – 12:

–Declarando a varavel @Buffers_EmUso

Declare

@Buffers_EmUso Int;

Object_Name=Buffer Manager e Counter_Name=Total Pages*/

 

Select

@Buffers_EmUso = cntr_value From Sys.dm_os_performance_counters

Where

Rtrim(Object_name) LIKE ‘%Buffer Manager’

And

counter_name = ‘Total Pages’;

 

— Declarando a CTE Buffers_Pages para contagem de Buffers por pgina —

 

;With DB_Buffers_Pages AS

(

SELECT database_id, Contagem_Buffers_Por_Pagina  = COUNT_BIG(*)

From Sys.dm_os_buffer_descriptors

Group By database_id

)

 

Select

Case [database_id]

WHEN 32767 Then ‘Recursos de Banco de Dados’ Else DB_NAME([database_id])

End As ‘Banco de Dados’,

Contagem_Buffers_Por_Pagina,

‘Buffers em MBs por Banco’ = Contagem_Buffers_Por_Pagina / 128,

‘Porcentagem de Buffers’ = CONVERT(DECIMAL(6,3), Contagem_Buffers_Por_Pagina * 100.0 / @Buffers_EmUso)

From

DB_Buffers_Pages

Order

By ‘Buffers em MBs por Banco’ Desc;


— Parte 2: —

USE

CRIPTOGRAFIA

GO

 

;WITH DB_Buffers_Pages_Objetos AS

(

Select

SO.name As Objeto,

SO.type_desc As TipoObjeto,

COALESCE(SI.name, ) As Indice,

SI.type_desc As TipoIndice,

p.[object_id],

p.index_id,

AU.allocation_unit_id

From sys.partitions AS P INNER JOIN sys.allocation_units AS AU

ON p.hobt_id = au.container_id

INNER JOIN sys.objects AS SO

ON p.[object_id] = SO.[object_id]

INNER JOIN sys.indexes AS SI

ON SO.[object_id] = SI.[object_id]

AND p.index_id = SI.index_id

Where AU.[type] IN(1,2,3)

And SO.is_ms_shipped = 0

)

 

Select

Db.Objeto, Db.TipoObjeto  As ‘Tipo Objeto’,

Db.Indice,

Db.TipoIndice,

COUNT_BIG(b.page_id) As,

COUNT_BIG(b.page_id) / 128 As

From

DB_Buffers_Pages_Objetos Db INNER JOIN sys.dm_os_buffer_descriptors AS b

ON Db.allocation_unit_id = b.allocation_unit_id

Where

b.database_id = DB_ID()

Group

By Db.Objeto, Db.TipoObjeto, Db.Indice, Db.TipoIndice

Order

By ‘Buffers Por Pgina’ Desc, TipoIndice Desc;

 

Pois bem galera, este é o Código – Script Challenge – 12, conto com a participação de vocês, envie seus comentário, críticas, sugestões e respostas para este desafio, e agora também com uma novidade, além de você descobrir o objetivo deste código, você também deverá identificar os possíveis erros ou inconsistências que possam existir.

Por enquanto é isso, volto no final deste mês com a resposta.

Até mais.

Resposta – Script Challenge 11


Pessoal, bom dia.

Como vocês estão? Alguma novidade?

Pois bem, como promessa é dívida, estou de volta com a resposta para mais um Script Challenger, agora na versão 2012, mais agressivo e desafiador.

Para aqueles que não participaram deste novo desafio, o código utilizado no Script Challenger 11, esta apresentado abaixo:

– Script Challenger 11 – Código 1 –

SELECT  OBJECT_NAME(s.[object_id]) AS [Table Name] ,

        i.name AS [Index Name] ,

        i.index_id ,

        user_updates AS [Total Writes] ,

        user_seeks + user_scans + user_lookups AS [Total Reads] ,

        user_updates – ( user_seeks + user_scans + user_lookups ) AS [Difference]

FROM  sys.dm_db_index_usage_stats AS s WITH ( NOLOCK ) INNER JOIN sys.indexes AS i WITH ( NOLOCK )

                                                                                                     ON s.[object_id] = i.[object_id]

                                                                                                     AND i.index_id = s.index_id

WHERE   OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1

AND s.database_id = DB_ID()

AND user_updates > ( user_seeks + user_scans + user_lookups )

AND i.index_id > 1

ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC ;

Durante o período de tempo em que este desafio estava em aberto, recebi algumas observações e melhorias para o código, o que gostaria de agradecer a todos os participantes por estas sugestões.

Agora vou matar a curiosidade de todos e apresentar a resposta. Ao executar este código, o SQL Server ira realizar uma análise fazendo acesso entre a System View: sys.Indexes e a DMF sys.dm_db_index_usage_stats, a fim de identificar quais são os índices Não-Clusterizados que estão apresentando um Número de Escrita maior que o Número de Leituras, o que indica uma utilização incorreta do mesmo.

O grande segredo deste código encontra-se nestas linhas:

user_updates AS [Total Writes] ,

user_seeks + user_scans + user_lookups AS [Total Reads],

user_updates – ( user_seeks + user_scans + user_lookups ) AS [Difference]

Onde:

A coluna [Total Writes]: tem a finalidade de retornar a quantidade de escritas realizadas para cada índice identificado neste código;

A coluna [Total Reads]: tem a finalidade de retornar a quantidade de leituras realizadas para cada índice identificado neste código, com base, na soma das colunas: User_seeks + User_scans + User_lookups; e

A coluna [Difference]: tem a finalidade de apresenta a diferença entre o Total de Escritas e Totais de Leituras, com base, na subtração entre as colunas: user_updates – ( user_seeks + user_scans + user_lookups )

Esta diferença entre o Total de Escrita – o Total de Leituras, nos indica que este índice esta sendo nos Processos de Manipulação de Dados: Insert, Update e Delete, por outro lado, nos Processos de Pesquisa e Consulta: Select ele não esta envolvido em alguns casos o que pode representar que este índice é desnecessário ou esta sendo mal utilizado.

Qual é a importância deste código?

Basicamente demonstrar para o Desenvolvedor que nem sempre um índice é a melhor solução para aceleração e organizar uma pesquisa de dados, pois se o mesmo não esta sendo utilizado ele não representa um recurso que traga vantagens para o ambiente, muito pelo contrário, o mesmo pode estar somente ocupando espaço, ocasionando fragmentação e também com informações estatísticas desatualizadas por falta de uso.

Então pessoal é isso, vou encerrando aqui mais este desafio. Espero que todos possam ter gostado e que este código posso ser útil.

Agradeço mais uma vez a sua visita e participação.

Até mais.

Script Challenge – Número 11


Pessoal, boa tarde.

Tudo bem? Como foram de final de ano?

A vida não pode parar como também o conhecimento não pode deixar de ser transmitido, desta forma, estou relançando umas das principais sessões do meu Blog, que em 2011 teve muito destaque.

Ficou curioso?

Estou me referindo à sessão Script Challenger, lançada em 2011, com objetivo de fazer com que você leitor ou visitante do meu blog participa-se e ao mesmo tempo aprenda-se algo novo.

Nessa sessão o leitor, tem a possibilidade de dar a resposta deste desafio, como também apresentar uma outra possível forma de realizar a mesma rotina ou procedimento.

No ano de 2011 a Script Challenger, chegou até a edição de número 10, contando a participação de diversos colaboradores, neste ano vou manter a mesma forma de interação.

Postando novos scripts e durante um determinado período de tempo contando com a participação da comunidade na descoberta do que este script deve ou esta fazendo.

_______________________________________________________________________

Pois bem, vamos então começar o ano com o Script Challenger número 11, seguindo a número iniciado em 2011. A seguir apresento o Código 1:

— Script Challenger 11 – Código 1 —

SELECT  OBJECT_NAME(s.[object_id]) AS [Table Name] ,

        i.name AS [Index Name] ,

        i.index_id ,

        user_updates AS [Total Writes] ,

        user_seeks + user_scans + user_lookups AS [Total Reads] ,

        user_updates – ( user_seeks + user_scans + user_lookups ) AS [Difference]

FROM  sys.dm_db_index_usage_stats AS s WITH ( NOLOCK ) INNER JOIN sys.indexes AS i WITH ( NOLOCK )

                                                                                                     ON s.[object_id] = i.[object_id]

                                                                                                     AND i.index_id = s.index_id

WHERE   OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1

AND s.database_id = DB_ID()

AND user_updates > ( user_seeks + user_scans + user_lookups )

AND i.index_id > 1

ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC ;

Quero contar com a sua participação neste novo desafio, envie seus comentários, observações ou a resposta, até do dia 20 de Janeiro.

Mais uma vez obrigado por sua visita e participação, nos encontramos em breve.

Até mais.

Resposta – Script Challenge – Número 9


Salve pessoal…

Estou de volta, agora com a resposta para o Script Challenger – Número 9, postado a algumas a semanas. Bom, para aqueles que não se lembram do código postado, segue abaixo novamente o script utilizado neste desafio.

– Script Challenge – Número 9 –

Create Trigger T_Calcular_Horas
On CTProducao_Moinho
For Insert, Update
As
Declare @TotalDias VarChar(4),
@TotalHoras VarChar(3),
@TotalMinutos VarChar(4),
@NUMMO CHAR(7),
@ValorFormatado Char(5)

Set @NUMMO=(Select NUMMO from Inserted)

Set @TotalDias=(Select DateDiff(Day,DataInicio,DataFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)
Set @TotalHoras=(Select DateDiff(Hour,Convert(Char(20),DataInicio,103)+HoraInicio,Convert(Char(20),DataFinal,103)+HoraFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)
Set @TotalMinutos=(Select DateDiff(Minute,Convert(Char(20),DataInicio,103)+HoraInicio,Convert(Char(20),DataFinal,103)+HoraFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)

If @TotalDias >=2
Begin
Update CTProducao_Moinho
Set TotalHoras=@TotalHoras+’:00′
Where NUMMO=@NUMMO
End
Else
Begin
If (@TotalHoras >=1) And (@TotalHoras <=24)
Begin
If (@TotalHoras = 1) And (@TotalMinutos < 60)
Set @ValorFormatado=’00:’+@TotalMinutos

If (Len(@TotalHoras) = 1) And (@TotalMinutos > 60)
Begin
Set @ValorFormatado=Convert(Char(4),Convert(Int,@TotalMinutos)/Convert(Int,@TotalHoras))
Set @ValorFormatado=’0′+@TotalHoras+’:’+@ValorFormatado
End

If (Len(@TotalHoras) = 1)
Set @ValorFormatado=’0′+@TotalHoras+’:00′

If (Len(@TotalHoras) = 1) And (@TotalMinutos = 60)
Set @ValorFormatado=’0′+@TotalHoras+’:00′

Update CTProducao_Moinho
Set TotalHoras=@ValorFormatado
Where NUMMO=@NUMMO
End
Else
Begin
If @TotalMinutos=60
Begin
Update CTProducao_Moinho
Set TotalHoras=’01:00′
Where NUMMO=@NUMMO
End
Else
Begin
If Len(@TotalMinutos) = 1
Set @ValorFormatado=’00:0′+@TotalMinutos
Else
Set @ValorFormatado=’00:’+@TotalMinutos

Update CTProducao_Moinho
Set TotalHoras = @ValorFormatado
Where NUMMO=@NUMMO
End
End
End

Pois bem, você conseguiu encontrar a respostas para este Código? Diversos participantes me enviaram por e-mail suas respostas, alias foram diversas, eu fiquei surpreso, pois este desafio apresentou o maior número de respostas obtidas até agora. Foram aproxidamente 100 respostas, com observações, dicas, críticas e comentários sobre o código.

Para aqueles que não participaram, a resposta deste Script Challenger – Número 9 é muito simples.

Como vocês podem observar, trata-se de um Trigger chamado T_Calcular_Horas vínculado a tabel CTProducao_Moinho, disparado na ocorrências de Inserts e Updates.

A função básica deste trigger e análisar através de algumas condições uma possível diferenção entre horas, minutos e segundos para formatar o valor de preenchimento do campo TotalHoras, utilizado em um ERP para controle de qualidade na área de produção de uma indústria que trabalhei a algum tempo.

De acordo com o valores de diferença, realizo a concatenação dos valores e posteriormente, a trigger executa um Update sobre a Table CTProducao_Moinho diretamente no campo TotalHoras.

Vale ressaltar que este script respeita algumas regras de negócios da empresa e também do ERP por isso, foi necessário realizar estas análises, conversões e concatenações de valores.

Muito bem galera, esta aqui a resposta, espero que todos possam ter entendido e gostado.

Nos encontramos nos próximos Script Challenger.

Até mais.

Script Challenge – Número 9


Salve comunidade, Tudo bem?

Estou de volta com mais um Script Challenge, agora na edição de número 9. Alias a algumas semanas eu deixei de postar alguns artigos no meu fórum devido a algumas situações que estavam colocando a minha imagem e experiência em dúvida perante a comunidade Microsoft. Passados alguns dias, voltamos a vida normal e vamos em frente.

Bom, como de costume vou postar o código e contar com a participação de todos através de e-mails, comentários, twitters, entre outros.

Segue abaixo o código do Script Challenge – Número 9:

— Script Challenge – Número 9 —

Create Trigger T_Calcular_Horas
On CTProducao_Moinho
For Insert, Update
As
Declare @TotalDias VarChar(4),
@TotalHoras VarChar(3),
@TotalMinutos VarChar(4),
@NUMMO CHAR(7),
@ValorFormatado Char(5)

Set @NUMMO=(Select NUMMO from Inserted)

Set @TotalDias=(Select DateDiff(Day,DataInicio,DataFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)
Set @TotalHoras=(Select DateDiff(Hour,Convert(Char(20),DataInicio,103)+HoraInicio,Convert(Char(20),DataFinal,103)+HoraFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)
Set @TotalMinutos=(Select DateDiff(Minute,Convert(Char(20),DataInicio,103)+HoraInicio,Convert(Char(20),DataFinal,103)+HoraFinal) from CTProducao_Moinho Where NUMMO=@NUMMO)

If

@TotalDias >=2
Begin
Update CTProducao_Moinho
Set TotalHoras=@TotalHoras+’:00′
Where NUMMO=@NUMMO
End
Else
Begin
If (@TotalHoras >=1) And (@TotalHoras <=24)
Begin
If (@TotalHoras = 1) And (@TotalMinutos < 60)
Set @ValorFormatado=’00:’+@TotalMinutos

If (Len(@TotalHoras) = 1) And (@TotalMinutos > 60)
Begin
Set @ValorFormatado=Convert(Char(4),Convert(Int,@TotalMinutos)/Convert(Int,@TotalHoras))
Set @ValorFormatado=’0’+@TotalHoras+’:’+@ValorFormatado
End

If (Len(@TotalHoras) = 1)
Set @ValorFormatado=’0’+@TotalHoras+’:00′

If (Len(@TotalHoras) = 1) And (@TotalMinutos = 60)
Set @ValorFormatado=’0’+@TotalHoras+’:00′

Update CTProducao_Moinho
Set TotalHoras=@ValorFormatado
Where NUMMO=@NUMMO
End
Else
Begin
If @TotalMinutos=60
Begin
Update CTProducao_Moinho
Set TotalHoras=’01:00′
Where NUMMO=@NUMMO
End
Else
Begin
If Len(@TotalMinutos) = 1
Set @ValorFormatado=’00:0’+@TotalMinutos
Else
Set @ValorFormatado=’00:’+@TotalMinutos

Update CTProducao_Moinho
Set TotalHoras = @ValorFormatado
Where NUMMO=@NUMMO
End
End
End

Galera, pronto, esta lançado mais este desafio, conto com vocês.

Até mais.

Resposta – Script Challenge – Número 8


Pessoal, boa tarde.

Passado diversos dias, estou de volta com a resposta para o nosso Script Challenge – Número 8, alias, obtive diversas respostas sobre este código, o que me deixou muito surpreso com as análises dos colegas.

Para você que não visitou o post anterior, segue abaixo o código utilizado em mais este desafio:

— Código – Script Challenge – Número 8 —

declare @Dia int
select @Dia = DATEPART (weekday ,getdate())
if @Dia = 1
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\domingo\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 2
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\segunda\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 3
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\terca\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 4
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\quarta\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 5
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\quinta\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 6
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\sexta\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 7
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\sabado\DBQUADRANT.BAK’ with init, noformat
end

Qual então seria a finalidade deste código?

Bom como já pode ter sido percebido trata-se de um script utilizado para processos de backup, basicamente, neste código podemos configurar o nosso backup para ser realizado e armazenado conforme o dia semana em uma pasta diferente.
Através da variável @dia utilizada para receber o valor do dia da semana com base no retorno da função DatePart, o SQL Server vai analisar qual é o valor da varíavel, e fazendo uso do comando condicional IF o backup será realizado e armazenada em um local diferente.
Então foi difícil descobrir o que o código utilizado no Script Challenge – Número 8, realiza?
Bom, esta aqui mais uma pequena dica que poderá automatizar ainda mais o seu ambiente de trabalho. Espero ter ajudado e apresentado de forma simples como podemos combinar a utilização de variáveis, funções e comando de análise condicional em nossos Scripts.
Por enquanto é isso, já estou preparando nosso próximo Script Challenge – Número 9. Teremos surpresas.
Até mais.

Script Challenge – Número 8.


Salve galera, bom dia.
Estou de volta com mais um Script Challenge, agora com a edição número 8. Bom como todos sabem o Script Challenge, é um pequeno desafio com objetivo de encontrar a solução ou melhor forma de uso de um códig script. Já passamos por 7 edições e até agora diversas pessoas tem colaborado enviando seus comentários, dúvidas, respostas e outras forma de utilização do mesmo código.
Sendo assim, vou novamente postar mais um Script, e lançar mais um desafio para todos os visitantes do meu blog. Como de costume, vou dar uma pequena dica sobre este código. Trata – se um procedimento bastante utilizado e de muita importância para a sobrevivência de qualquer ramo de atividade ou negócio.
Segue abaixo o código utilizado pelo Script Challenge – Número 8:

— Código – Script Challenge – Número 8 —

declare @Dia int
select @Dia = DATEPART (weekday ,getdate())
if @Dia = 1
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\domingo\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 2
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\segunda\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 3
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\terca\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 4
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\quarta\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 5
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\quinta\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 6
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\sexta\DBQUADRANT.BAK’ with init, noformat
end
if @Dia = 7
begin
backup database DBQUADRANT_BI to disk = ‘D:\backup\sabado\DBQUADRANT.BAK’ with init, noformat
end
Pronto o código é este, fazendo uma pequena análise fica fácil descobrir qual é a sua finalidade e forma de utilização, volto com a resposta nos próximos dias. Conto com a sua participação, envie seus comentários, dicas, dúvidas, sugestões ou críticas sobre este desafio.
Até mais.

Resposta – Script Challenge – Número 7


Pessoal,

Conforme o combinado, estou voltando com a resposta para o Script Challenge – Número 7, postado no final da semana passada.

Como eu destaquei este desafio, tem como objetivo apresentar uma das alternativas existente no SQL Server, mais precisamente para as versões 2000 e 2005.

Mas qual seria esta alternativa ou o que seria este código?

Pois bem, até o SQL Server 2005 não tinhamos a possibilidade de realizar backup no SQL Server de forma compactada durante o processo de backup ou na sua configuração, ao contrário do que hoje esta presente no SQL Server 2008, conhecido como Backup Compression.

Se tivessemos a necessidade de compactar um arquivo de backup gerado pelo SQL Server, tinhamos a possibilidade de utilizar ferramentas de terceiros como por exemplo: WinRAR, WinZip, PKZip entre outros.

Para contornar este limitação e possibilitar de forma direta a compactação e descompactação de backup, foram desenvolvidas duas Extended Stored Procedure responsáveis em realizar este tipo de funcionalidade, denominadas:

  • xp_makecab –> Utilizada para compactar um arquivo de backup; e
  • xp_unpackcab –> Utilizada para descompactar um arquivo de backup.

Bom agora que já sabemos o objetivo deste desafio e qual a função destas duas Extended Stored Procedure, fica fácil entender o que este Script vai executar. Como de costume, vou postar novamente o código utilizado:

— Código – Script Challenge – Número 7 —

//Compacta o arquivo de backup DBTESTE_BKP.BAK //
EXEC master.dbo.xp_makecab
@cabfilename = ‘E:/Backup/DBTESTE_BKP.cab’,
@compression_mode = ‘mszip’,
@verbose_level = 0,
@filename1 = ‘E:/Backup/DBTESTE_BKP.BAK’

//Descompactando o arquivo DBTESTE_BKP.cab//
EXEC master.dbo.xp_unpackcab
@cabfilename = ‘E:/Backup/DBTESTE_BKP.cab’,
@destination_folder= ‘E:/Backup’,
@verbose_level=0

Então é isso pessoal, esta aqui a respostas para mais um Script Challenge, este desafio foi bem fácil. Mais uma vez gostaria de destacar que esta funcionalidade deve ser utilizada nas versão e edições do SQL Server 2000 e 2005. Todo processo de compactação e descompactação de dados e backup já esta presente no SQL Server 2008 e R2.

Por enquanto agradeço a sua visita, nos encontraremos em breve em mais um Script Challenge.

Até mais.

Script Challenge – Número 7


Pessoal,

Passados alguns dias, estou de volta com mais um desafio, estamos no Script Challenge – Número 7. Desta vez, vou apresentar mais um simples código, mas que possui uma funcionalidade bem interessante, ainda mais quando aplicado ao SQL Server 2000 e 2005.

Pois bem, segue abaixo o código:

— Script Challenge – Número 7 —

EXEC master.dbo.xp_makecab
@cabfilename = ‘E:/Backup/DBTESTE_BKP.cab’,
@compression_mode = ‘mszip’,
@verbose_level = 0,
@filename1 = ‘E:/Backup/DBTESTE_BKP.BAK’

EXEC master.dbo.xp_unpackcab
@cabfilename = ‘E:/Backup/DBTESTE_BKP.cab’,
@destination_folder= ‘E:/Backup’,
@verbose_level=0

Bem este é o código, espero que possa ser bem fácil responder este desafio, volto no dia 08/02 com a resposta.

Até mais.

Resposta – Script Challenge – Número 6


Pessoal,

Estou de volta com a respostas para uma Script Challenge, estamos na edição de número 6, com um dos mais difícies código de script já apresentados. Pois bem, para aqueles que não se lembra do código, vou postar novamente.

– Código – Script Challenge – Número 6 –
SELECT TOP ( 25 )
        p.name AS [SP Name] ,
        qs.total_logical_reads AS [TotalLogicalReads] ,
        qs.total_logical_reads / qs.execution_count AS [AvgLogicalReads] ,
        qs.execution_count ,
        ISNULL(qs.execution_count /
                 DATEDIFF(Second, qs.cached_time, GETDATE()),
               0) AS [Calls/Second] ,
        qs.total_elapsed_time ,
        qs.total_elapsed_time / qs.execution_count AS [avg_elapsed_time] ,
        qs.cached_time
FROM    sys.procedures AS p
        INNER JOIN sys.dm_exec_procedure_stats AS qs
                              ON p.[object_id] = qs.[object_id]
WHERE   qs.database_id = DB_ID()
ORDER BY qs.total_logical_reads DESC ;

Como já havia destacado este código, esta relacionado ao controle de transações processadas pelo SQL Server, essa foi a dica. Mas o que exatamente este código executa ou qual é a sua função no dia-a-dia de um DBA?

Vamos lá então começar a desmistificar este Script Challenge – Número 6. Seguindo nossa análise padrão, começamos a identificar quais recursos ou funcionalidades estão sendo utilizadas, podemos observar a presença de catalog view(visão de catálogo) sys.procedures e uma dinamic management view(visão de gerenciamento dinânimco) sys.dm_exec_procedure_stats. Qual seria a função destes recursos?

  • sys.procedures: Apresenta a relação de objetos(procedimentos) de diversos tipos em execução no SQL Server, como base na coluna Type existente view catalog sys.objects. No SQL Server 2005 e versões posteriores, a visibilidade dos metadados em exibições do catálogo é limitada aos schemas que um usuário possui ou tenha recebido alguma permissão.
  • sys.dm_exec_procedure_stats: Retorna informações agregadas sobre estatísticas de desempenho para as stored procedures armazenadas em cache. Este dmv apresenta uma linha por stored procedure, e o tempo de vida, enquanto se mantiver o enquanto a stored procedure se encontra em cache. Quando uma stored procedure é removida do cache, a linha correspondente é eliminada deste modo de exibição. Nesse momento, um evento de rastreamento SQL de estatísticas de desempenho é gerado semelhante ao exec_query_stats.

Agora que já sabemos o que estes dois recursos fazem e quais as suas formas de aplicação podemos dar continuidade nas demais particularidades deste código. O código utilizado Script Challenge – Número 6, apresetanda a claúsula TOP responsável em limitar a quantidade de linhas retornadas ao usuário, neste caso, nosso retorno será dimensionado em 25 linhas.

Até ai tudo bem, já estamos conseguindo entender que estamos trabalhando com Stored Procedures que estão sendo processadas e armazenadas em cache ou removidas, que também nosso retorno será de 25 linhas. E agora, vamos identificar outros elementos que podem apresentar características importantes.

Estes elementos são as colunas de retorno que apresentam as informações ao usuário, sendo elas:

  • Name: Apresenta o nome da Stored Procedure em execução ou cache, com base na view sys.procedures;
  • total_logical_reads: Apresenta o total de leituras lógicas processadas, com base na dmv sys.dm_exec_procedures_stats;
  • execution_count: Número de vezes que a stored procedure foi executada uma vez que foi compilado, com base na dmv sys.dm_exec_procedures_stats;
  • cached_time: Tempo em que a Stored Procedure foi adicionado ao cache, com base na dmv sys.dm_exec_procedures_stats;
  • total_elapsed_time: Tempo total decorrido, em milissegundos, para execuções concluída pela stored procedure, com base na dmv sys.dm_exec_procedures_stats;

Agora todos os recursos e principais elementos foram apresentados e descritos, que nos resta e executar o código e ver qual será o retorno apresentado. Faça isso, cole este código em seu ambiente, importante lembra mais uma vez. Este código é compatível somente com o SQL Server 2008 ou versão superior.

O que será retornado pelo SQL Server é uma relação das Stored Procedures processadas recentimente, armazenadas em cache, como podemos ver na Figura 1 apresentada a seguir:


Figura 1 – Informações apresentadas pelo Script Challenge – Número 6.

Bom, chegamos ao final de mais um Script Challenge, e acredito que este desafio do mais complexos, como também, o que trouxe mais informações e conhecimento. Espero mais uma vez ter ajudado, apresentando recursos que estão presente SQL Server em suas diversas versões e edições, mesclando o passado com o presente.

Agradeço a atenção, continue visitando o meu blog, colabore com os seus comentários, e-mails, dúvidas, críticas e sugestões.

Até mais.