Material de Apoio – Outubro 2018


Bom dia, bom dia, bom dia…

Tudo bem? Estamos no mês de outubro, as eleições terminaram, e os brasileiros escolheram os seus representantes, passado estes últimos acontecimentos, começamos a direcionar nossos esforços e pensamentos nos acontecimentos de final de ano, aquele momento tão esperado por todos esta mais uma vez se aproximando e nossos sonhos de um futuro melhor começam novamente a serem renovados.

Como de costume, 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 quarto do ano de 2018 e de número 159 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 exclusivamente ao recurso de Linked Server, sendo este, uma funcionalidade existente a muitos anos no Microsoft SQL Server, que nos permite de uma forma bastante simples, mas não muito prática e performática estabelecer um canal de acesso entre fontes de dados distintas, possibilitando em tempo real que o próprio SQL Server possa acessar e manipular dados entre estas fontes, bem como, armazenar estes mesmos dados internamente.

Segue abaixo a relação de temas relacionados ao uso Linked Server:

  • Access;
  • Active Directory;
  • Excel;
  • Query Dinâmica;
  • Remote Servers;
  • Senhas;
  • sp_addlinkedserver;
  • sp_addlinkedsrvlogin;
  • sp_droplinkedsrvlogin;
  • sp_dropserver;
  • Stored Procedure;
  • sys.linked_logins;
  • sys.server_principals;
  • sys.servers;
  • Transações; 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 .docx 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 – Outubro 2018 – Linked Server – Acessando – Active Directory via Linked Server.sql

2 – Material de Apoio – Outubro 2018 – Linked Server – Configurando – Linked Server entre Access 2010 e SQL Server 2008.sql

3 – Material de Apoio – Outubro 2018 – Linked Server – Criando – Linked Server entre Access e Banco de Dados com Senha.sql

4 – Material de Apoio – Outubro 2018 – Linked Server – Criando – Linked Server para acesso ao Excel.sql

5 – Material de Apoio – Outubro 2018 – Linked Server – Trabalhando com Transaçoes no Linked Server.sql

6 – Material de Apoio – Outubro 2018 – Linked Server – Obtendo informacoes sobre o Linked Server.sql

7 – Material de Apoio – Outubro 2018 – Linked Server – Trabalhando com Query Dinâmica em conjunto com Linked Server e Variável.sql

8 – Material de Apoio – Outubro 2018 – Linked Server – Trabalhando com Linked Server e seus recursos básicos.sql

9 – Material de Apoio – Outubro 2018 – Linked Server – Realizando um update através de uma conexão via Linked Server.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/08/14/material-de-apoio-agosto-2018/

https://pedrogalvaojunior.wordpress.com/2018/06/19/material-de-apoio-junho-2018/

https://pedrogalvaojunior.wordpress.com/2018/04/05/material-de-apoio-abril-2018/

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

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 dezembro, até lá, continue aproveitando cada momento da sua vida, desfrutando com muita sabedoria os momentos de galeria e também os desafios que são colocada ao nosso redor.

Um forte abraço, muita saúde, sucesso e nos encontramos no final do ano (que na verdade já chegou)….

Anúncios

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

Short Scripts – Março 2017


Hoje é sexta – feira, sexta – feira…

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

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

O post de hoje

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

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

Então mãos no teclado, a seguir apresento os códigos e exemplos selecionados para o Short Script – Março 2017. Vale ressaltar que todos os scripts publicados nesta sessão são devidamente testados antes de serem publicados, mas isso não significa que você pode fazer uso dos mesmo em seu ambiente de produção, vale sim todo cuidado possível para evitar maiores problemas. Fique a vontade para compartilhar, comentar, melhorar cada um destes códigos.

Short Scripts

— Short Script 1 – Realizando Auditoria in Live —

SELECT [Spid] = session_Id
, ecid
, [Database] = DB_NAME(sp.dbid)
, [User] = nt_username
, [Status] = er.status
, [Wait] = wait_type
, [Individual Query] = SUBSTRING (qt.text,
er.statement_start_offset/2,
(CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE er.statement_end_offset END –
er.statement_start_offset)/2)
,[Parent Query] = qt.text
, Program = program_name
, Hostname
, nt_domain
, start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50              — Ignore system spids.
AND session_Id NOT IN (@@SPID)     — Ignore this current statement.
ORDER BY 1, 2
Go

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

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

Go

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

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

Muito bem, mais uma relação de short scripts acaba de ser compartilhada, mesmo sendo denominados short entre aspas “pequenos”, posso garantir que todos estes exemplos são de grande importância e apresentam um valor e conhecimento do mais alto nível.


Chegamos ao final de mais um Short Scripts, espero que este material possa lhe ajudar, ilustrando o uso de alguns recursos e funcionalidades do Microsoft SQL Server.

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

Boa parte deste material é fruto de um trabalho dedicado exclusivamente a colaboração com a comunidade, visando sempre encontrar algo que possa ser a solução de um determinado problema, bem como, a demonstração de como se pode fazer uso de um determinado recurso.

Links

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

Agradecimento

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

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

#13 – Para que serve


Muito boa noite galera, tudo bem?

Noite de sábado, temperatura agradável, galera curtindo uma pizza, balada entre outras coisas e eu estou aqui para compartilhar com você mais um post da minha sessão Para que serve, hoje o post de número 13. Você esta pensando, post de número 13 não é nada muito “ospicioso” como diária um personagem de novela (kkkkk).

Que nada vamos em frente não se preocupe com este número, tenho a certeza que este post será muito legal e apresentará informações de alto astral relacionada ao novo Microsoft SQL Server 2016.

Como você já deve ter percebido os posts relacionados a esta sessão tem o objetivo de apresentar ou demonstrar como  códigos de exemplo, aplicativos, utilitários, enfim recursos relacionados diretamente á banco de dados ou gerenciadores de bancos de dados podem ser utilizados como uma possível solução de problemas, bem como, orientar na sua forma de utilização.

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

No post de hoje, vou a destacar uma das mais aguardados melhorias relacionadas ao SQL Server, estou me referindo a capacidade de consultor os histogramas de estatísticas de processamento de forma programada, isso mesmo, agora a partir da nova atualização cumulativa do SQL Server 2016 SP1, conhecida como Cumulative Update 2, temos duas novas DMF – Dynamic Management Function – Função de Gerenciamento Dinâmico que nos permitem de forma direta através do uso do comando Select obter informações sobre os histogramas e dados estatísticos.

Vou fazer um pequeno suspense, não vou revelar o nome de ambas as DMFs, somente no decorrer deste post você vai conhece-las.

Muito bem, após deixar este gostinho de quero mais, chegou a hora de conhecer estas novas funcionalidades e ver como podemos aplicar isso no nosso ambiente.

Como aqui o #13 – Para que serve – Uma nova e mais fácil maneira de obter informações sobre o histograma de estatísticas no Microsoft SQL Server 2016 SP1 –

Introdução

Quando se referimos a estatísticas de bancos de dados, estatísticas de processamento ou estatísticas de consumo de operadores do plano de execução, estamos na verdade se referindo ao bom e velho conceito de estatísticas, o qual devemos voltar no tempo para entender melhor se realmente quisermos saber a importância deste assunto, para este post este não é o foco, na verdade o que eu quero é mostrar que a partir da nova atualização cumulativa aplicada para o Service Pack 1 do SQL Server 2016 os times de engenheiros e desenvolvedores do SQL Server introduziram no produto duas novas DMF denominadas sys.dm_db_stats_histogram e sys.dm_db_stats_properties, onde através do uso destas novas DMFs podemos obter todas as informações relacionadas as estatísticas de processamento de nossas querys e principalmente o histograma de maneira mais rápida, fácil e principalmente legível, pois particularmente falando ler o histograma através do comando DBCC Show_Statistics não era nada fácil(kkkkk).

Vamos conhecer um pouco mais sobre cada DMF para entender melhor seu funcionamento:

sys.dm_db_stats_histogram: Retorna o histograma de estatísticas para o objeto de banco de dados especificado (tabela ou exibição indexada) no atual SQL Server banco de dados. Semelhante ao DBCC SHOW_STATISTICS WITH HISTOGRAM.

Ao executar esta nova DMF o Microsoft SQL Server 2016 apresentará uma tabela de resultado contendo o seguinte conjunto de colunas, conforme a Tabela 1 ilustra:

Nome da coluna

Column name
Tipo de dados Description
object_id int ID do objeto (tabela ou exibição indexada) para o qual as propriedades do objeto de estatísticas serão retornadas.
stats_id int ID do objeto de estatísticas. É exclusiva na tabela ou exibição indexada. Para obter mais informações, veja sys.stats.
step_number int O número da etapa do histograma.
range_high_key sql_variant Valor da coluna associada superior de uma etapa do histograma. O valor da coluna também será denominado um valor de chave.
range_rows real Número estimado de linhas cujo valor de coluna fica dentro de uma etapa do histograma, excluindo-se o limite superior.
equal_rows real Número estimado de linhas cujo valor de coluna é igual ao limite superior da etapa do histograma.
distict_range_rows bigint Número estimado de linhas com um valor de coluna distinto dentro de uma etapa do histograma, excluindo-se o limite superior.
average_range_rows real Número médio de linhas com valores de colunas duplicados em uma etapa de histograma, exceto o limite superior (RANGE_ROWS / DISTINCT_RANGE_ROWS para DISTINCT_RANGE_ROWS > 0).

sys.dm_db_stats_properties: Retorna propriedades de estatísticas para o objeto de banco de dados especificado (tabela ou exibição indexada) no banco de dados do SQL Server atual. Para tabelas particionadas, consulte a DMF sys.dm_db_incremental_stats_properties.

Ao executar esta nova DMF o Microsoft SQL Server 2016 apresentará uma tabela de resultado contendo o seguinte conjunto de colunas, conforme a Tabela 2 ilustra:

Nome da coluna Tipo de dados Description
object_id int ID do objeto (tabela ou exibição indexada) para o qual as propriedades do objeto de estatísticas serão retornadas.
stats_id int ID do objeto de estatísticas. É exclusiva na tabela ou exibição indexada. Para obter mais informações, veja sys.stats.
last_updated datetime2 Data e hora da última atualização do objeto de estatísticas.
rows bigint O número total de linhas da tabela ou exibição indexada na última atualização das estatísticas. Se as estatísticas forem filtradas ou corresponderem a um índice filtrado, o número de linhas talvez seja menor do que o número de linhas na tabela.
rows_sampled bigint O número total de linhas amostradas para cálculos de estatísticas.
etapas int O número de etapas no histograma. Para obter mais informações, veja DBCC SHOW_STATISTICS.
unfiltered_rows bigint O número total de linhas da tabela antes da aplicação da expressão de filtro (para estatísticas filtradas). Se as estatísticas não forem filtradas, unfiltered_rows será igual ao valor retornado na coluna de linhas.
modification_counter bigint Número total de modificações da coluna de estatísticas principal (a coluna em que o histograma é criado) desde que as últimas estatísticas de tempo foram atualizadas.

Essa coluna não mantém informações para tabelas com otimização de memória.

Agora que o segredo foi revelado, podemos começar a pensar na maneira que estas novas DMFs podem ser utilizadas, para tal vamos fazer uso do banco de dados analítico: AdventureworksDW2016CTP3 disponível para download através do link: http://www.microsoft.com/en-us/download/details.aspx?id=49502

Utilizando as novas DMFs

Seguindo em frente vamos começar nossa prática, para tal a primeira coisa a fazer é executar o bloco de código 1 declarado abaixo, antes clique no botão Include Actual Execution Plan em seu Management Studio, pois vamos realizar uma análise após a execução.

— Bloco de Código 1 —

Figura 1 – Instrução select declarada para o bloco de código 1.

Após a execução deste bloco de código obtemos o seguinte conjunto de dados relacionados ao operador Clustered Index Scan, conforme a Figura 2 apresentada abaixo:

Figura 2 – Dados relacionadas ao operador Clustered Index Scan.

Note que estou destacando na figura os dados referentes aos seguintes elementos:

  • Number of Rows Read;
  • Actual Number of Rows;
  • Estimated Number of Rows; e
  • Estimated Number of Rows to be Read.

Você pode estar se perguntando, o porque o Junior Galvão acabou destacados estes valores na Figura 2? A resposta é muito simples, uma das maneiras para tentar entender o comportamento do SQL Server no processamento de seus operadores e procurar ter uma ideia de estatísticas de processamento é justamente através da leitura e entendimento destes quatro conjunto de dados, o que posso dizer que não é a melhor forma para se encontrar informações sobre processamento e estatísticas.

Agora imagine que todas as vezes que você desejar obter informações sobre as estatísticas de processamento e como elas estão armazenadas e seus status, pois bem, é justamente neste ponto que agora no novo SQL Server 2016 SP1 CU 2 você terá facilmente a capacidade de fazer isso acontecer, para tal vamos executar o bloco de código 2 fazendo uso da nova DMF, sys.dm_db_status_histogram.

— Bloco de Código 2 —

Figura 3 – Bloco de código 2.

Observe que estamos fazendo uso da nova DMF sys.dm_db_status_histogram e neste momento nosso Management Studio deverá ter retornado um conjunto de linhas conforme a Figura 4 abaixo ilustra:

Figura 4 – Conjunto de dados estatísticas referentes ao processamento do bloco de código 2.

Ao analisarmos a Figura 4 podemos notar facilmente o conjunto de linhas de retornado contendo todas as informações relacionadas ao histograma da estatísticas de número 2 para a tabela [dbo].[FactResellerSales]. Tenho a certeza que você tão surpreso quanto eu quando executei pela primeira vez este mesmo bloco de código, realmente é assustador a facilidade que temos agora em entender o histograma.

Sensacional, mas como o SQL Server consegui apresentar estes dados desta maneira? Como de costume a resposta é simples, através da capacidade de utilizar em tempo de execução uma Table Valued Function denominada DM_DB_STATS_HISTOGRAM, ou seja, uma função que armazena valores em uma determinada tabela utilizada especificamente para esta nova DMF, a comprovação disso esta na Figura 5 que ilustra o plano de execução utilizado para o processamento do bloco de código 2.

Figura 5 – Plano de execução gerado para o processamento do bloco de código 2.

Continuando nossa jornada, o próximo passo é fazer uso da outra DMF, no caso a sys.dm_db_stats_properties, onde a qual vamos nos permitir obter o mesmo conjunto de valores referente ao cabeçalho da estatística o mesmo realizado através do comando DBCC SHOW_STATISTICS com a opção WITH STATS_HEADER.

Vamos então executar o bloco de código 3 apresentado a seguir:

Figura 7 – Bloco de código 3.

E qual será o resultado obtido após o processamento do bloco de código 3? A resposta é apresentada na Figura 7 a seguir:

Figura 7 – Resultado do processamento do bloco de código 3.

Show de bola, temos exatamente o mesmo conjunto de dados retornados pela DMF sys.dm_db_stats_properties da mesma forma que teríamos se estivéssemos utilizando do bom e velho DBCC SHOW_STATISTICS, não é realmente fantástico, só de imaginar a capacidade de possibilidades que teremos de utilizar estes dados a partir de agora realmente é algo surreal.

Da mesma forma que o SQL Server 2016 SP1 CU2 utiliza uma Table Valued Function para armazenar e apresentar os consumidos e coletados pelo processamento da sys.dm_db_status_histogram, também é utilizada uma outra Table Valued Function para o processamento da sys.dm_db_stats_properties denominada DM_DB_STATS_PROPERTIES.

Para finalizar nossa brincadeira e mostrar como estas novas funcionalidades podem nos ajudar, vamos utilizar o bloco de código 4 para através dele conseguir especificar uma determinada range_key existe em nossas estatísticas. Poxa vida especificar em um comando select qual determinada faixa de valores estatísticas nós queremos obter dados realmente é acima do que estávamos pensando, por incrível que isso possa parecer, é totalmente possível de ser feito a partir de agora.

— Bloco de Código 4 —

Figura 8 – Retorno de dados referentes ao filtro da faixa de valores.

Putz, que coisa louco, meu deus, temos com base no bloco de código 4 a comprovação que podemos através do uso de outras DMFs inline retornado dados estatísticos com base em filtros ou predicados declarados na cláusula where existente na linha 26 onde, a coluna sh.range_high_key é justamente uma coluna pertencente a nova DMF sys.dm_db_stats_histogram.

Que loucura isso, fora de série esta nova capacidade do SQL Server, fantástico, inimaginável, fora do comum o que o time de engenheiros do SQL Server fizeram desta vez, show.

Referências

https://msdn.microsoft.com/library/mt794645.aspx

https://blogs.msdn.microsoft.com/sql_server_team/easy-way-to-get-statistics-histogram-programmatically/

https://support.microsoft.com/en-us/help/4013106/cumulative-update-2-for-sql-server-2016-sp1

http://msdn.microsoft.com/library/jj553546.aspx

http://msdn.microsoft.com/library/ms174384.aspx

https://msdn.microsoft.com/pt-br/library/mt761751.aspx

https://msdn.microsoft.com/pt-br/library/ms177623.aspx

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/01/23/12-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2016/12/16/11-para-que-serve/

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

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

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

Conclusão

A maneira como nossos dados estão constantemente sendo processados é algo que a cada dia um DBA ou profissional de banco de dados se pergunta. Saber em qual momento uma determinada query, transação ou simplesmente um comando select pode ocasionar algo tipo de impacto em nosso ambiente ainda é mais preocupante. Foi justamente pensando nisso que a Microsoft e seu time de profissionais que trabalham com o SQL Server buscaram responder a partir da disponibilidade das duas novas DMFs: sys.dm_db_stats_histogram e sys.dm_db_stats_properties recursos adicionados na versão 2016 SP1 e disponível também para próximas versão do SQL Server, dentre elas a SQL Server vNext.
Esta nova maneira de acessar e consultar os dados coletados e armazenados no histograma poderá ajudar em muito os profissionais de banco de dados e desenvolvedores a entender como seus estatísticas de processamento de dados estão sendo afetadas com base nos processos de manipulação.
Neste post você pode mais uma vez observar que o Microsoft SQL Server esta em constante evolução, um dos produtos mais prestigiados pela Microsoft, buscando sempre trazer melhorais e inovações, algo de extrema importância para qualquer profissional que trabalha com esta tecnologia.

Agradecimentos

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

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

#10 – Para que serve


O louco meu, pleno feriadão e você esta passando por aqui no meu blog……

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

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

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


Introdução

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

Para o post de hoje vou destacar um script que utilizei recentemente e posso dizer que foi de grande ajuda, mas antes de apresentar este recurso vou destacar um pouco sobre alguns elementos relacionados a ele, dentre os quais destaco File Growth.

File Growth

E ai você já ouviu falar file growth, ou simplesmente crescimento de arquivo de dados ou log? Se você é um administrador de banco de dados, ou um profissional que já trabalha a algum tempo com o banco de dados, tenho a certeza que já deve ter ouvido falar sobre a importância de se saber como esta configurado o fator de crescimento de um banco de dados e seu arquivos de transações.

Trata-se de uma configuração que pode ser aplicada durante a criação de um banco de dados ou posteriormente, sua importância esta totalmente relacionada ao espaço de armazenamento de dados durante sua utilização, o que poderá impactar na capacidade física de uma unidade de disco em gerenciar o quanto estes arquivos podem consumir e alocar espaço em disco no decorrer do seu tempo de vida.

Ao definir a forma de crescimento ou até mesmo o quanto este arquivo poderá ou não crescer de forma ilimitado o Microsoft SQL Server vai trabalhar no processo de alocação, escrita e manipulação da estrutura física e lógica tanto para os arquivos de dados, como principalmente para os arquivos de log.

Justamente sendo estes os arquivos que normalmente consomem um grande espaço física das unidades de disco para catalogar todas as operações processadas em um banco de dados que devem ser registradas em sua estrutura.

Para este tipo de cenário os gerenciadores de banco de dados através de seu mecanismo de Storage Engine observam e monitoram o que esta sendo processado e armazenado dentro de cada arquivo, caso o mesmo tenho que crescer para alocar uma nova área é com base nas configurações de File Growth definidas para o respectivo arquivo que este crescimento poderá ser realizado em fatores de Kilobytes, Megabytes, Gigabytes ou até mesmo em valores de porcentagem.

#10 Para que serve – Obtendo informações sobre database filegrowth —

Agora que conhecemos um pouco que esta relacionada com este post, vamos então conhecer este script que poderá nos ajudar a obter todas as possíveis informações relacionadas ao fator de crescimento de nossos bancos de dados e suas respectivas estruturas de dados e log.

— Bloco de Código —

filegrowth

Muito bem, observe que este código é bastante simples, estamos basicamente fazendo uso das catalogs views existentes no Microsoft SQL Server desdes suas primeiras versões o que nos permite dizer que este bloco de código pode ser aplicado facilmente a partir da versão 2005 em qualquer nível de edição, além disso, o mesmo já foi testado e aprovado nas últimos duas edições 2014 e 2016.

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

filegrowth1Figura 1 – Relação de bancos de dados e informações sobre o filegrowth.

Podemos notar a existência das colunas AutoGrowthStatus, GrowthValue e GrowthIncrement, são justamentes estas as colunas que nos permitem encontrar as informações relacionadas aos fatores de crescimento configurados para cada banco de dados armazenado em nosso servidor ou instância de bancos de dados Microsoft SQL Server.

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

AutoGrowthStatus: Esta coluna apresenta o status da propriedade Auto Growth, sendo esta definida para informar e o arquivo deverá ou não crescer de forma automática.

GrowthValue: Apresenta que pode ser informado a partir de 0 (zero) que indica ao Microsoft SQL Server que o determinado banco de dados não deverá crescer. Os demais valores podem representar uma indicação de crescimento em tamanho fixo ou até mesmo em porcentagem.

GrowthIncrement: Mostra a forma de incremento do fator de crescimento do banco de dados, sendo orientado e calculado através do número de páginas de dados, se o valor apresentado for igual á 0 (zero) significa que este banco de dados não terá seu crescimento realizado, qualquer outro valor acima de 0 (zero) significa que este banco de dados será impactado em algum momento pelo valor definido nas configurações do crescimento do banco de dados. Vale ressaltar que este valor esta relacionado ao tamanho de 8Kb (Kilobytes) para cada página de dados.

Após esta análise posso dizer que fica mais fácil descobrir qual banco de dados poderá apresentar problemas de crescimento acima no normal ou simplesmente aquele banco de dados que necessita crescer além do estimado.

Referências

https://technet.microsoft.com/pt-br/library/ms181338(v=sql.110).aspx

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

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

Links

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

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

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

Conclusão

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

Foi pensando neste tipo de situação que compartilhei com vocês hoje este script no #10 – Para que serve, que apresenta como podemos de maneira fácil, rápida, segura e muito prática encontrar informações relacionadas ao file growth, ou simplesmente fator de crescimento.

Considerada uma das configurações mais importantes de um qualquer banco de dados alocado em uma instância ou servidor Microsoft SQL Server.

Agradecimentos

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

Até mais.

#09 – Para que serve


Boa noite pessoal!!! Salve galera….

 

Tudo bem? Como passaram os últimos dias?

Graças a deus continuo forte na minha batalha profissional e acadêmica, como eu sempre falo para meus alunos, a vida é uma roda gigante e não podemos deixar ela parar muito menos perder a chance de curtir e aprender com cada momento.

Seguindo esta onda de oportunidades, estou retornando com mais uma post dedicado a sessão Para que serve, e conforme prometido hoje vamos finalizar o assunto de índices hipotéticos apresentado inicialmente no post: https://pedrogalvaojunior.wordpress.com/2016/08/06/07-para-que-serve/

Neste post vamos entender como o comando DBCC Autopilot pode influenciar o database engine e seus elementos execution plan e query optimizer na execução de nossas consultas, então vamos nessa galera…..


Começa agora o #09 – Para que serve – Índices Hipotéticos – Final.

 

Conforme apresentado nos posts anteriores o conceito de índices hipotéticos é uma técnica antiga, mas pouco conhecida na área de banco de dados. Para muitos profissionais da área este tipo de recurso acaba sendo algo obscuro e de pouco compreensão, por outro lado outros profissionais destacam como sendo como um recurso que permite simular a existência de um índice de forma lógica. Como em qualquer área profissional ou acadêmica sempre vai existir os dois lados da moeda e cabe a cada um de nós procurar entender, respeitar e conhecer estas opiniões.

Seguindo em frente, vamos dar continuidade em nosso estudo, fazendo uso da estrutura criada anteriormente no post: https://pedrogalvaojunior.wordpress.com/2016/09/03/08-para-que-serve/

Como você pode ter verificado, criamos o banco de dados HypotheticalDB e dentro dele os seguintes objetos apresentados na Figura 1:

hypotheticaldb-figura1

Figura 1 – Relação de objetos criados no banco de dados HypotheticalDB.

Podemos observar a existência dos três índices hipotéticos criados anteriormente para tabela ClientesCategorias, bem como, o código da tabela ClientesCategorias definido no valor: 597577167. Anote bem este código post nos próximos passos vamos fazer uso do mesmo.

Agora que já relembramos um pouco do que foi feito anteriormente em relação ao nosso ambiente, podemos continuar a fazer uso dos índices hipotéticos em nosso ambiente, onde neste momento vamos fazer com que o Microsoft SQL Server realize o uso deste recurso de forma empírica na execução da nossa query, para tal iremos utilizar o comando DBCC AutoPilot, caso você ainda não conheça ou não se lembre deste comando o mesmo foi apresentada de maneira detalhada no post: https://pedrogalvaojunior.wordpress.com/2016/08/06/07-para-que-serve/

Então mãos no teclado, chegou a hora de utilizarmos o comando DBCC AutoPilot fazendo uso do bloco de código 1, mas antes de teclar F5, clique no botão “Include Actual Execution Plan” ou tecle Ctrl+M para ativar o mesmo. Para que você possa entender o que será executado neste bloco de código e qual será o resultado apresentado é obrigatório que o plano de execução se encontre ativado.

Agora que você já realizou este procedimento, pode dar continuidade e executar o bloco de código 1 apresentado abaixo:

— Bloco de Código – Utilizando o DBCC AutoPilot forçando o uso do índice clusterizado IND_ClientesCategorias_Clusterizado_CodigoComEstatisticas –

Use HypotheticalDB

Go

 

DBCC AUTOPILOT (5, 5, 0, 0, 0) – Ativando o commando DBCC AutoPilot para iniciar uma nova sessão limpando o buffer de comando executados anteriormente —

 

DBCC AUTOPILOT (6,5,597577167,4) – Utilizando o commando DBCC AutoPilot orientado no uso exclusive de índices clusterizado —

GO

 

SET AUTOPILOT ON — Ativando a diretiva —

Go

 

Select C.Codigo,

Cc.Codigo As ‘Categoria do Cliente’,

C.Nome,

C.Endereco,

C.Estado,

C.DataUltimaCompra

From Clientes C Inner Join ClientesCategorias CC

On C.CodigoCategoria = CC.Codigo

Where C.Estado = ‘SP’

Go

 

SET AUTOPILOT OFF — Desativando a diretiva —

GO

 

Acredito que tudo deva ter ocorrido normalmente e você tenha conseguido realizar a execução do bloco de código 1 apresentado acima, neste momento o Management Studio apresentou em sua guia denominada execution plan o conjunto de operadores similares aos apresentados na Figura 2 a seguir:

hypotheticaldb-figura2

Figura 2 – Resultado da execução do bloco de código 1.

 

Note que o plano de execução nos apresenta dois operados do tipo Clustered Index Seek, respeitando a ordem de execução, temos o segundo operador com o custo de 51% de processamento apontando para o nosso índice clusterizado IND_ClientesCategorias_Clusterizado_CodigoComEstatisticas, neste momento você pode estar se perguntando.

Como o Database Engine em conjunto com o Query Optimizer e Execution Plan identificou a existência deste recurso sendo que o mesmo é algo hipotético, algo que somente existe de forma lógica, a resposta pode ser encontrada justamente na maneira que o comando DBCC AutoPilot foi declarado e posteriormente executado, onde temos o seguinte conjunto de valores passados como parâmetros de entrada:

PARÂMETRO DESCRIÇÃO VALOR DECLARADO
TypeID TypeID = 6: Usar apenas índices clusterizados 6
DbID ID do Banco de Dados 6 – HypotheticalDB
TabID Id da Tabela a ser utilizada 597577167
Indid Id do índice a ser utilizado 4

Foi através deste conjunto de valores apresentado no DBCC AutoPilot e posteriormente reconhecido e interpretados pelo database engine que o Query Optimizer e Execution Plan fizeram uso do nosso índice clusterizado.

Não é algo fantástico, realmente uma capacidade de análise e reconhecimento de recursos fora do comum, realmente o Microsoft SQL Server é um produto acima de qualquer suspeita, um software surpreendente.

Para finalizar vamos agora forçar o uso do nosso índice nonclustered IND_ClientesCategorias_NaoClusterizado_CodigoSemEstatisticas e observar qual será o comportamento e resultado apresentado pelo Management Studio após a execução do bloco de código 2 apresentando na sequência:

— Bloco de Código 2 – Forçando o uso do índice não clusterizado IND_ClientesCategorias_NaoClusterizado_CodigoSemEstatisticas –

DBCC AUTOPILOT (5, 5, 0, 0, 0)

DBCC AUTOPILOT (0,5,597577167,2)

GO

 

SET AUTOPILOT ON — Ativando a diretiva —

Go

 

Select C.Codigo,

Cc.Codigo As ‘Categoria do Cliente’,

C.Nome,

C.Endereco,

C.Estado,

C.DataUltimaCompra

From Clientes C Inner Join ClientesCategorias CC

On C.CodigoCategoria = CC.Codigo

Where C.Estado = ‘SP’

Go

 

SET AUTOPILOT OFF — Desativando a diretiva —

GO

 

Verificando o resultado apresentado na Figura 3 abaixo, tendo como base a guia Execution Plan, podemos notar a presença do operador Index Seek apontando para nosso índice não clusterizado: IND_ClientesCategorias_Clusterizado_CodigoComEstatisticas.

hypotheticaldb-figura3
Figura 3 – Resultado da execução do bloco de código 2.

Analisando com mais calma o resultado apresentado na Figura 3, fica fácil identificar a presença do operador Index Seek como já havia destacado, quando o comando DBCC AutoPilot foi executado com o seguinte conjunto de valores:

PARÂMETRO DESCRIÇÃO VALOR DECLARADO
TypeID TypeID = 0: Usar apenas índices não clusterizados 0
DbID ID do Banco de Dados 6 – HypotheticalDB
TabID Id da Tabela a ser utilizada 597577167
Indid Id do índice a ser utilizado 2

Não é algo surpreendente e simples, esse é o Microsoft SQL Server, mais uma vez dando show, mais uma vez com um grande exibição, monstrando toda sua elegância, simplicidade e capacidade de nos supreender no processamento de transações e apresentação de resultados.

Desta forma, chegamos ao final de mais post da sessão Para que serve!


 

Espero que você tenha gostado, que as informações compartilhadas aqui possam lhe ajudar a se tornar cada vez um profissional de banco de dados reconhecido e valorizado, um dos papéis na área de tecnologia mais importantes para qualquer empresa.

Reconher o verdadeiro papel de um DBA dentro de sua estrutura, é reconhecer o verdadeiro valor de seus dados e como eles podem se tornar uma infomação valiosa para sua tomada de decisão.

Caso deseje acessar os posts anteriores desta sessão, utilize os links listados abaixo:

Mais uma vez obrigado por sua visita, um forte abraço, nos encontramos em breve.

Até mais.

Dica do Mês – Identificando pressão de memória interna e externa no Microsoft SQL Server


Olá comunidade, muito boa tarde.

Tudo bem? Mais um mês que chega ao final, graças a deus este mês de Julho foi complicado, espero que toda a correria que passei mesmo em período de férias não se repita por um longo tempo. Estamos no sétimo post desta nova sessão lançada no início de 2016, muito legal, já temos um pouco de história para contar em relação a aceitação dos visitantes do meu blog em relação a esta sessão.

Como você já deve estar acostumado quando visita o meu blog, todo final de mês é dedicado a post exclusivos das sessões Dica do Mês e Para que Serve. No último post publicado no mês de Junho, apresentei um conteúdo mais focado para área acadêmica, destaquei um dos conceitos mais importantes quando estamos falando de Modelagem de Banco de Dados, a tão temida e misteriosa Normalização(kkkkk), algo que para muitos é um bicho de sete cabeças, mas na verdade não se passa de um gatinho lindo e manhoço.

Como diria aquela boa e velha “Amanheceu pequeno a viola botei na sacola e fui viajar”, no meu caso seria mais ou menos assim: “Amanheceu entrei no meu carro peguei minha mochila e fui trabalhar, anoiteceu entre no meu carro peguei minha apostila e fui lecionar……”.

Deixando a brincadeira de lado no post de hoje vou falar um pouco sobre como podemos identificar o consumo de memória por parte do SQL Server ou Windows através do Management Studio ou Scripts, estou me referindo a chamada pressão de memória interna ou externa.

Então, seja bem vindo a mais uma dica do mês, começa aqui a Dica do Mês – Identificando pressão de memória interna e externa no SQL Server.


Introdução

Uma das maiores preocupação de qualquer profissional de infraestrutura ou administrador de banco de dados é saber se seus recursos de hardware estão atendendo as demandas solicitadas por suas aplicações e usuários.

Quando se referimos a consumo de memória por parte de um servidor de banco de dados, existem pontos que podem nos direcionar a uma pequena confusão, dentre elas destaco:

  • Identificar o quanto uma sessão ou transação esta consumindo de memória;
  • Identificar o quanto um ou mais bancos de dados estão consumindo de memória; ou
  • Identificar o quanto um servidor ou instância de sql server esta consumindo de memória.

Você pode fazer isso, bom identificar o quanto o SQL Server esta consumindo de memória é fácil, basta eu utilizar as ferramentas Task Manager ou Resource Monitor para obter estes dados, na verdade não é bem assim, ambas as ferramentas podem ajudar a encontra vestígios deste possível consumo, o que particularmente não pode ser considerada uma tarefa complexa nem tão simples.

Mas quando se referimos a pressão de memória, o cenário muda totalmente, trata-se de uma situação onde nosso servidor pode por diversos motivos estar sofrendo uma sobrecarga de processamento interno ou externo que gera um consumo elevado ou até mesmo falta de memória para atender todas as requisições que estão sendo disparadas para ele. Seguindo nesta linha de raciocínio a Microsoft disponibilizou a partir da versão do Microsoft SQL Server 2008 e 2008 R2 duas DMVs – Dynamic Management Views (Visões de Gerenciamento Dinâmico):

  • sys_dm_os_ring_buffers: Retorna um conjunto de rings “anéis” de dados que nos permitem relacionar com outras dmv afim de identificarmos problemas de erros de conectividade, faixa exceções, além disso, utilizada também como mecanismo para identificar a saúde de nosso ambiente de banco de dados, sem proporcionar qualquer tipo de pressão de memória, deadlocked ou mudança no comportamento dos agendadores de tarefas em execução.
  • sys_dm_os_sys_info: Retorna um conjunto de informações relacionadas as recursos de hardware utilizados pelo SQL Server, como por exemplo:
    • CPU_TICKS;
    • CPU_COUNT; e
    • Physical_Memory_KB.

Você pode estar pensando, bom já que a sys_dm_os__sys_info apresenta um conjunto de informações relacionadas a hardware que esta em uso pelo SQL Server, é através dela que eu poderei identificar o consumo de memória. Bom se você me pergunta-se isso neste momento a minha resposta seria NÃO.

Porque não, porque estes dados do que esta sendo consumido de maneira interna pelo SQL Server ou até mesmo externamente pelo Windows que possui relação são para muitos conhecidos como ring_buffers ou melhor dizendo ring “anéis”, e são através destes anéis ou basicamente falando com base nestes neles que temos como através da DMV sys.dm_os_ring_buffers coletar os ring_buffers que estão consumindo recursos de memória.

Então se você me perguntar se através da dmv sys.dm_os_ring_buffers podemos obter informações sobre pressão interna ou externa de memória a resposta será SIM. Pois bem, o segredo foi revelado o pulo do gato para saber detalhes escondidos de como o SQL Server coleta e armazena estes anéis é relavado pela sys.dm_os_ring_buffers.

Agora que sabemos os recuros que vamos utilizar para coletar estes dados e identificar os recursos  que estão consumindo memória em nosso ambiente, para tal utilizaremos o bloco de código 1 apresentado a seguir:

— Bloco de Código 1 – Identificando pressão de memória interna e externa —

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] – tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value(‘(//Record/ResourceMonitor/Notification)[1]’, ‘varchar(30)’) AS [Notification_type],
cast(record as xml).value(‘(//Record/MemoryRecord/MemoryUtilization)[1]’, ‘bigint’) AS [MemoryUtilization %],
cast(record as xml).value(‘(//Record/MemoryNode/@id)[1]’, ‘bigint’) AS [Node Id],
cast(record as xml).value(‘(//Record/ResourceMonitor/IndicatorsProcess)[1]’, ‘int’) AS [Process_Indicator],
cast(record as xml).value(‘(//Record/ResourceMonitor/IndicatorsSystem)[1]’, ‘int’) AS [System_Indicator],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect/@type)[1]’, ‘varchar(30)’) AS [type],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect/@state)[1]’, ‘varchar(30)’) AS [state],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect/@reversed)[1]’, ‘int’) AS [reserved],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect)[1]’, ‘bigint’) AS [Effect],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect[2]/@type)[1]’, ‘varchar(30)’) AS [type],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect[2]/@state)[1]’, ‘varchar(30)’) AS [state],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect[2]/@reversed)[1]’, ‘int’) AS [reserved],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect)[2]’, ‘bigint’) AS [Effect],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect[3]/@type)[1]’, ‘varchar(30)’) AS [type],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect[3]/@state)[1]’, ‘varchar(30)’) AS [state],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect[3]/@reversed)[1]’, ‘int’) AS [reserved],
cast(record as xml).value(‘(//Record/ResourceMonitor/Effect)[3]’, ‘bigint’) AS [Effect],
cast(record as xml).value(‘(//Record/MemoryNode/ReservedMemory)[1]’, ‘bigint’) AS [SQL_ReservedMemory_KB],
cast(record as xml).value(‘(//Record/MemoryNode/CommittedMemory)[1]’, ‘bigint’) AS [SQL_CommittedMemory_KB],
cast(record as xml).value(‘(//Record/MemoryNode/AWEMemory)[1]’, ‘bigint’) AS [SQL_AWEMemory],
cast(record as xml).value(‘(//Record/MemoryNode/SinglePagesMemory)[1]’, ‘bigint’) AS [SinglePagesMemory],
cast(record as xml).value(‘(//Record/MemoryNode/MultiplePagesMemory)[1]’, ‘bigint’) AS [MultiplePagesMemory],
cast(record as xml).value(‘(//Record/MemoryRecord/TotalPhysicalMemory)[1]’, ‘bigint’) AS [TotalPhysicalMemory_KB],
cast(record as xml).value(‘(//Record/MemoryRecord/AvailablePhysicalMemory)[1]’, ‘bigint’) AS [AvailablePhysicalMemory_KB],
cast(record as xml).value(‘(//Record/MemoryRecord/TotalPageFile)[1]’, ‘bigint’) AS [TotalPageFile_KB],
cast(record as xml).value(‘(//Record/MemoryRecord/AvailablePageFile)[1]’, ‘bigint’) AS [AvailablePageFile_KB],
cast(record as xml).value(‘(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]’, ‘bigint’) AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value(‘(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]’, ‘bigint’) AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value(‘(//Record/@id)[1]’, ‘bigint’) AS [Record Id],
cast(record as xml).value(‘(//Record/@type)[1]’, ‘varchar(30)’) AS [Type],
cast(record as xml).value(‘(//Record/@time)[1]’, ‘bigint’) AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = ‘RING_BUFFER_RESOURCE_MONITOR’
ORDER BY rbf.timestamp ASC

 

Perfeito, após executar este bloco de código o Management Studio vai retornar as linhas de recursos internos e externos que podem estar gerando uma possível pressão de memória para seu servidor ou instância SQL Server, isso vai variar e depender muito de cada ambiente, hardware, versão de sistema operacional e principalmente versão do SQL Server e service pack instalado.


Sendo assim chegamos ao final de mais uma dica do mês.

Espero que você tenha gostado deste post,  acredito que as informações e exemplo publicadas aqui possam de alguma maneira ajudar e colaborar em suas atividades diárias, profissionais e ou acadêmicas.

Fique ligado nos próximos meses, novas dicas relacionadas a sys.dm_os_ring_buffers serão postadas, todas voltadas para ajudar identificar como solucionar problemas que o SQL Server pode estar apresentando e você ainda não percebeu dentre eles erros de segurança.

Desejo um forte abraço, agradeço mais uma vez a sua visita.

Até mais.

#01 – Para que serve


Muito bom dia, comunidade…..Tudo bem?

Hoje com muito orgulho e bastante ansiedade estou lançando uma nova sessão no meu blog, tenho a certeza que será algo muito diferente e que poderá trazer bastante interesse de todos. Este é o post #01 da sessão “Para que serve”, uma nova sessão que estará sendo publicada mensalmente com objetivo de apresentar como um script, ferramenta, linha de comando, enfim algo que esteja relacionado ao SQL Server e Banco de Dados que você não conheça ou tenha uma leve ideia de como pode ser utilizado.

Para este primeiro post, vou apresentar um pequeno script que utilizo frequentemente no SQL Server, sempre que necessito identificar algumas informações relacionadas a índices. Segue abaixo o Script #01 – Para que serve:

— #01 – Para que serve —

SELECT OBJECT_NAME(B.object_id) AS TableName,

              B.name AS IndexName,

              A.index_type_desc AS IndexType,

             A.avg_fragmentation_in_percent

FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, ‘LIMITED’) A

            INNER JOIN sys.indexes B WITH(NOLOCK)

             ON B.object_id = A.object_id AND B.index_id = A.index_id

WHERE A.avg_fragmentation_in_percent > 30

AND OBJECT_NAME(B.object_id) NOT LIKE ‘[_]%’

AND A.index_type_desc != ‘HEAP’

ORDER BY A.avg_fragmentation_in_percent DESC


 

Então, veja, analíse e tente identificar o que este pequeno script pode fazer, e agora eu vou fazer a pergunta que leva o nome desta sessão.

Para que serve? Para que serve este script? Você já tem a resposta? Ela é muito simples e bastante útil.

Dicas: Se você analisou o código, poderá ter identificado algumas palavras chaves que podem ajudar:

  • Indexes;
  • Fragmentation;
  • AVG; e
  • Percent.

Hummm, se você juntar todas estas palavras, começamos a ter ideia do que e para que serve este script, se você chegou a conclusão que estamos falando de fragmentação de índices, acerto, consegui descobrir para que serve.

Resposta: O #01 – Para que serve faz referência e apresenta uma das maneiras mais utilizadas no SQL Server para se obter informações sobre índices fragmentados ou com indicadores de fragmentação. A primeira etapa para optar pelo método de fragmentação a ser usado é analisar o índice para determinar o grau de fragmentação.

Usando a função de sistema sys.dm_db_index_physical_stats, você pode detectar a fragmentação em um índice específico, em todos os índices de uma tabela ou exibição indexada, em todos os índices de um banco de dados ou em todos os índices de todos os bancos de dados.

Para índices particionados, sys.dm_db_index_physical_stats também fornece informações de fragmentação por partição.


Então é isso pessoal, este foi #01 – Para que serve, com certeza muito coisa será melhorada, novas ideias e formas de demonstrar como podemos usar e para que serve algo que se relaciona ao SQL Server e Banco de Dados.

Deseje suas críticas, sugestões, comentários e opiniões.

Mais uma vez o meu obrigado, um grande abraço, sucesso, nos encontramos em breve.

Valeu.

Dica do Mês – Função Next Value For


Olá, galera, bom dia.

Estamos chegando ao final do primeiro mês de 2016, nossa janeiro já esta indo embora. Como eu havia prometido no início deste ano, dentro do possível vou tentar trazer novas sessões para o meu blog e hoje falo do lançamento ou melhor o retorno de uma delas que vou batizar de “Dica do Mês“, é isso mesmo, no final de cada vez vou trazer uma simples dica relacionada a algo que utililizei em minhas atividades profissionais e acadêmicas.

O objetivo desta sessão como seu próprio nome diz, é compartilhar com você leitor ou seguidor do meu blog, uma simples dica que poderá fazer toda diferença no seu dia-á-dia ou simplesmente mostrar como utilizar um determinado recurso, funcionalidade e produto existente no SQL Server.

Neste primeiro post, quero destacar uma função muito legal que foi introduzida no Microsoft SQL Server 2012 e que recentemente em diversas dúvidas nos fóruns brasileiros de SQL Server acabou sendo destaque como solução. Estou me referindo ao função Next Valeu For fazendo uma tradução ao pé da letra podemos dizer: Próximo Valor para.

 

Sobre Next Value For –  Função que possui a característica possibilitar a geração de uma sequência de números para uma objeto específico, neste caso, o objeto que refiro é Sequence Object, funcionalidade também introduzida a partir do Microsoft SQL Server 2012, em conjunto com diversas novidades relacionadas a geração de sequência de valores numéricos.

A Next Value For é reconhecida como uma função não-determinística, desta maneira o sua utilização é somente permitida em conjunto com o objeto sequence, sendo este responsável pela geração da sequência numérica repassada para a função.

 

Sintaxe – A função Next Value For possui uma forma de uso bastante simples, uma das suas particularidades é permitir o uso da função Over como opção para geração de valores dentro da sequência.

  • Exemplo da Sintaxe: NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name
    [ OVER (<over_order_by_clause>) ]

 

Argumentos – Com base em sua sintaxe podemos identificar quatro argumentos que formam sua estrutura de código, sendo eles:

  • database_name – Representa o nome do banco de dados que possui o objeto sequence;
  • schema_name –  Representa o nome do schema que contém o objeto sequence;
  • sequence_name – Representa o nome do objeto sequence responsável em armazenar e garantir a sequência numérica
  • Over_order_by_clause – Determina a ordem de organização e apresentação dos valores das linhas dentro de uma faixa de valores gerados pelo objeto sequence.

 

Exemplos: Vou destacar algumas maneiras de como utilizar a função Next Value For:

— Exemplo 1- Utilizando a função Next Valeu For para mostrar dois valores em sequência —

CREATE SCHEMA Test;
GO

CREATE SEQUENCE Test.Contador
START WITH 1
INCREMENT BY 1 ;
GO

SELECT NEXT VALUE FOR Test.Contador AS FirstUse;
SELECT NEXT VALUE FOR Test.Contador AS SecondUse;

Go

 

— Exemplo 2 – Utilizando a função Next Valeu For em conjunto com variável —

DECLARE @var1 bigint = NEXT VALUE FOR Test.Contador
DECLARE @var2 bigint ;
DECLARE @var3 bigint ;

SET @var2 = NEXT VALUE FOR Test.Contador ;

SELECT @var3 = NEXT VALUE FOR Test.Contador;
SELECT @var1 AS myvar1, @var2 AS myvar2, @var3 AS myvar3 ;
GO

 

— Exemplo 3 – Utilizando a função Next Valeu For em conjunto com constraint Default —

CREATE TABLE Test.MyTable
(
IDColumn nvarchar(25) PRIMARY KEY,
name varchar(25) NOT NULL) ;
GO

CREATE SEQUENCE Test.CounterSeq
AS int
START WITH 1
INCREMENT BY 1 ;
GO

ALTER TABLE Test.MyTable
ADD DEFAULT N’AdvWorks_’ + CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20)) FOR IDColumn;
GO

INSERT Test.MyTable (name) VALUES (‘Junior’) ;
INSERT Test.MyTable (name) VALUES (‘Galvão’) ;

INSERT Test.MyTable (name) VALUES (‘SQL’) ;
INSERT Test.MyTable (name) VALUES (‘Server’) ;
SELECT * FROM Test.MyTable;
GO

 

— Exemplo 4 – Utilizando a função Next Value For com ranking windows function —

Use AdventureWorks2012

Go

SELECT NEXT VALUE FOR Test.Contador OVER (ORDER BY LastName) AS ListNumber,
FirstName, LastName
FROM Person.Contact ;
GO


 

Muito bem galera, é isso, este é o primeiro post da nova sessão Dica do Mês, simples, direto, rápido e prático, espero que você tenha gostado.

Não deixe de me visitar, amanhã vou retornar com mais uma novidade, uma nova sessão chamada “Para que serve“, por enquanto uma surpresa.

Mais uma vez obrigado, nos encontramos novamente nos próximos posts.

Até mais.

Windows 10: 6 dicas para usar melhor o Menu Iniciar e a Barra de Tarefas


Alardeado como a versão definitiva do sistema operacional da Microsoft — que a partir de agora passa a receber apenas atualizações constantes em vez de uma mudança grande e drástica —, o Windows 10 trouxe alguns novos recursos e outros velhos conhecidos e repaginados para o público.

Porém, como é comum a cada atualização, alguns detalhes nem sempre ficam evidentes e há muita coisa “escondida” dentro dos cantinhos do sistema operacional. E é justamente para trazer à luz algumas dessas possibilidades que preparamos este texto. Aqui, você vai conhecer alguns truques para usar melhor dois recursos básicos do Windows 10: o Menu Iniciar e a Barra de Tarefas.

Dicas para você acessar alguns recursos de forma mais ágil ou então para obter ainda mais de cada um desses itens: tudo isso estará em nossa lista. Então, confira agora todas as nossas dicas.

1. Reativando a tela Iniciar (igual ao Windows 8)

Além dos novos detalhes gráficos, visualmente falando, o retorno do Menu Iniciar é a grande novidade do Windows 10. O espaço se apresenta agora como uma mistura bem interessante do Menu Iniciar clássico, presente até o Windows 7, e da tela Iniciar, disponível nas versões 8 e 8.1 do sistema operacional.

Porém, o Windows 10 permite que você use tanto o Menu Iniciar quanto a tela Iniciar, igual a do Windows 8. Para isso, abra o Menu Iniciar e clique em “Configurações”. Na janela que abriu em seu computador, clique em “Personalização” e depois vá até a seção “Iniciar”.

Dicas Windows 10

Lá, ative a opção “Usar tela inteira de Iniciar”.

Dicas Windows 10

Depois, é só clicar sobre o ícone do Windows no canto da tela ou então usar a tecla do Windows presente em seu teclado para abrir a tela Iniciar tradicional, igual à do Windows 8. Obviamente, é possível restaurar esta função para o modo padrão do Windows 10 a qualquer momento.

Dicas Windows 10

2. Redimensione a barra de pesquisa

Uma das principais novidades da Barra de Tarefas do Windows 10 é a presença de um menu de pesquisa por meio do qual você pode pesquisar por itens na web e também em seu computador. Por padrão, este menu vem expandido, ocupando um bom espaço, porém, caso isso seja um problema, é possível resolvê-lo de maneira bem simples.

Basta clicar com o botão direito do mouse em qualquer ponto da Barra de Tarefas e ir até o menu “Pesquisar”. Lá, selecione a opção “Mostrar ícone de pesquisa” para diminuir o tamanho da barra de pesquisa. Se quiser deixá-lo grande novamente, opte por “Mostrar caixa de pesquisa”.

Dicas Windows 10

Caso deseje, você pode ocultar este recurso clicando sobre a opção “Oculto”.

3. Fazer logon em sua conta rapidamente

Tradicionalmente, para sair de sua conta no Windows você abria o Menu Iniciar e escolhia a opção “Logout”. Ou então poderia usar o atalho Ctrl + L para tal, o que torna bastante ágil este processo. Porém, para quem não é adepto dos atalhos do teclado, fazer isso no Windows 10 ainda continua simples.

Tudo o que você precisa fazer é abrir o Menu Iniciar e clicar com o botão direito do mouse sobre a foto de sua conta. Ao fazer isso, surge ali uma pequena aba com três opções, entre elas a opção “Sair”, que faz logout instantaneamente.

Dicas Windows 10

4. Personalizar a área de notificação

A tradicional área de notificação do Windows também ganhou novidades no Windows 10. Agora, você pode personalizá-la de forma avançada, selecionando quais botões de ações rápidas devem ser exibidos ali e também gerenciar individualmente os ícones de notificações de cada aplicativo.

Para isso, clique com o botão direito do mouse em qualquer ponto da Barra de Tarefas e vá em “Propriedades”. Depois, na janela que surgiu na tela, clique em “Personalizar”.

Dicas Windows 10

Na tela de personalização, você conta com várias opções, então leia com atenção cada uma delas e ative ou desative alguns recursos conforme julgar necessário.

Dicas Windows 10

Outra forma de personalizar a área de notificação é clicando e arrastando qualquer ícone que é exibido ali. Assim, você define se um ícone deve ser sempre exibido ou deve ficar presente apenas no menu oculto deste espaço.

5. Personalizar cores e transparência do Windows

Talvez algumas pessoas estejam um pouco perdidas quanto à personalização do visual do Windows 10. Este recurso funciona de forma semelhante às versões anteriores do sistema operacional (W7 e W8/8.1), porém há alguns detalhes novos que podem estar confundindo usuários pelo mundo.

Atualmente, para alterar a cor e o nível de transparência das barras do Windows é preciso acessar um menu especificamente desenvolvido para isso. Abra o Menu Iniciar e clique sobre o botão “Configurações”. Depois, clique em “Personalização”.

Dicas Windows 10

Agora, acesse o menu “Cores” e então será possível personalizar este aspecto do sistema operacional. Role a página até o final para visualizar todas as opções disponíveis e customize o visual do Windows 10 do seu jeito.

Dicas Windows 10

6. Visão de Tarefas e múltiplas áreas de trabalho

No Windows 10, você pode acessar a Visão de Tarefas, uma espécie de visualização panorâmica do sistema na qual é possível pré-visualizar todas as janelas abertas naquele momento. Para acessar esta modalidade, utilize o atalho Tecla do Windows + Tab.

Ao acessar este menu, você pode adicionar novas áreas de trabalho virtuais ao sistema. Ou seja, é possível ter diversas Áreas de trabalho funcionando simultaneamente dentro do Windows 10, ideal para organizar melhor o seu conteúdo quando muitas coisas precisam ficar abertas ao mesmo tempo.

Dicas Windows 10

Se preferir, você pode utilizar o atalho Tecla do Windows + Ctrl + D para criar um novo ambiente. Depois, utilize Tecla do Windows + Ctrl + Setas direcionais da esquerda ou da direita para navegar rapidamente entre todos os ambientes abertos em seu computador.

Matéria completa: http://canaltech.com.br/tutorial/windows/windows-10-dicas-para-usar-melhor-o-menu-iniciar-e-a-barra-de-tarefas/#ixzz3jCCAROkU
O conteúdo do Canaltech é protegido sob a licença Creative Commons (CC BY-NC-ND). Você pode reproduzi-lo, desde que insira créditos COM O LINK para o conteúdo original e não faça uso comercial de nossa produção.

Fontes e Direitos Autorais: Canaltech.com – Douglas Ciriaco | 18.08.2015 às 10h33 

DICAS DA MICROSOFT PARA A SEMANA DA INTERNET SEGURA


Na última terça-feira, foi celebrado em todo o mundo o Dia da Internet Segura (Internet Safer Day). A data, criada há oito anos, tem o objetivo de alertar para os riscos na vida digital, tanto de usuários domésticos quanto nas empresas. Com mais de três bilhões de pessoas conectadas no mundo todo, a internet se tornou o grande elo da sociedade e também um ambiente que pode apresentar vulnerabilidades. Confira neste artigo algumas dicas da Microsoft para a Semana da Internet Segura. Estas dicas vão ajudar usuários de todos a perfis a utilizar a rede com o máximo de segurança.

Dicas da Microsoft para a Semana da Internet Segura

Cada vez mais presente – seja pelas tecnologias 3G, 4G ou pelo sinal do Wi-Fi – a conectividade está cada vez mais presente na vida das pessoas, seja para acessar os e-mails, enviar mensagens, fotos e vídeos pelo celular, utilizar as redes sociais e até realizar transações bancárias. Com o aumento da oferta de serviços de download e transmissão de dados, a Internet deixou de ser exclusividade do computador, do smartphone ou tablet e chegou a outros dispositivos, como a TV, o videogame e até eletrodomésticos.

CONFIRA ABAIXO ALGUMAS DICAS DA MICROSOFT PARA A SEMANA DA INTERNET SEGURA:

PROTEJA A SUA PRIVACIDADE

Privacidade não é uma opção, é uma premissa. E não deve ser vista como preço a ser pago pela utilização da Internet. As pessoas e as empresas devem ver os serviços de internet como meios para satisfazer suas necessidades, mas que devem estar obrigatoriamente agregado aos aspectos de segurança, privacidade e conformidade.

Cuidado ao preencher formulários digitais! Certifique-se de é um site ou serviço é confiável antes de fornecer as suas informações pessoais ou da sua empresa, como senhas, dados bancários entre outros. Serviços on-line devem ter políticas claras e transparentes de privacidade e fornecer aos usuários informações sobre como os dados de seus clientes serão utilizados e quem terá acesso a eles. Lembre-se que um fornecedor pode hospedar os seus dados, mas só você, cliente, é o dono dessas informações.

SOFTWARES ORIGINAIS SEMPRE

Os cibercriminosos são uma ameaça real e é importante saber de quem está recebendo, e a quem está fornecendo informações antes de compartilhá-las. As pessoas e as empresas devem optar por soluções e programas que disponibilizam atualizações de segurança regularmente, o que não é oferecido em cópias não originais. Além disso, no caso de uma empresa, é importante verificar se todas as unidades – inclusive o datacenter – estão devidamente protegidos. Lembre-se que uma única máquina vulnerável pode ser a porta de entrada para o ataque de um hacker.

CUIDADO AO INSTALAR PROGRAMAS

Uma prática comum dos cibercriminosos é tentar comprometer a sua identidade ou informações bancárias solicitando a instalação de softwares infectados, através de downloads aparentemente inocentes como fotos, músicas, links, e-mails, também nas redes sociais ou em jogos online. Na dúvida, não arrisque.

Os serviços e plataformas utilizados devem oferecer experiências seguras e confiáveis para minimizar o impacto que os malwares (softwares maliciosos), e outros riscos podem causar na vida digital. Essas ameaças podem ser reduzidas ao máximo quando utilizado um software original que possa se manter atualizado.

MOBILIDADE E SEGURANÇA ANDAM JUNTAS

Um dos termos que mais têm chamado atenção no mundo da tecnologia é a “Computação em Nuvem”. Esse modelo de internet permite que as pessoas estejam conectadas o tempo todo e em qualquer lugar todos os serviços online que utiliza, seja o e-mail, o canal de música, a rede de dados da empresa, além de aplicativos e ferramentas, independentemente do dispositivo (celular, tablet ou PC) ou da plataforma (sistema operacional) que esteja utilizando.

Cada vez mais os serviços e desenvolvedores de ferramentas e aplicações devem oferecer políticas de compatibilidade entre diferentes sistemas para que os usuários possam tirar o máximo proveito da tecnologia, sem qualquer limitação. Com isso, é possível manter a produtividade, sem limitar o usuário a uma única plataforma ou a funcionalidades dos dispositivos, afinal de contas o tipo de celular, do PC ou do tablet deve ser uma escolha do usuário e não uma imposição do fabricante.

MOBILIDADE, EXPERIÊNCIA SEM VOLTA

A mobilidade está transformando a ideia de que o tempo e o espaço são os únicos elementos que ditam o ritmo de produtividade. O mundo está cada vez mais móvel, no qual a tecnologia se adapta às pessoas, e não o contrário. A computação em nuvem e a mobilidade abrem uma gama de possibilidades sem precedentes e que permitem, por exemplo, continuar um trabalho que está sendo feito no computador direto no celular ou até mesmo na TV. Com todo esse universo de conexão, é fundamental estar atento aos seus hábitos no consumo de internet para não correr risco.

Para ler um pouco mais sobre privacidade, segurança, liberdade de escolha de plataformas e mobilidade, acesse também o artigo do presidente da Microsoft para América Latina, Hernán Rincon, clicando aqui.

Fontes e Direitos Autorais: Baboo.com – SID VICIOUS @ 12 FEV 2015 | 1:10 PM

Material de Apoio – Março 2014


Galera, bom dia.

Meu Deus, mais um mês que esta se encerrando e para fechar, vou compartilhar com vocês alguns dos arquivos que utilizei nos últimos dias.

Nesta relação, você vai encontrar exemplos sobre:

  • Backup de Banco de Dados;
  • Body_Format HTML;
  • Chaves Primárias;
  • Chaves Estrangeiras;
  • Colunas;
  • Formatação de Valores;
  • Índices;
  • SP_Send_DBMail;
  • Tabelas; e
  • Trigger DDL.

Como de costume os arquivos estão renomeados com a extensão .doc para manter a compatibilidade com a plataforma WordPress.com.

Fique a vontade para compartilhar este conteúdo:

Exemplo – Básico – Criação – Chave Primária Composta + Chave Estrangeira Composta.sql

Exemplo – Criando – Função – Formatação de Valores.sql

Exemplo – Enviando – Email – SP_Send_DBMail + Body_Fomat HTML.sql

Exemplo – Enviando – Email – SP_Send_DBMail.sql

Exemplo – Relacionamento – Tabelas + Colunas + Tipos de Dados.sql

Exemplo – Stored Procedure – Backup All Databases.sql

Exemplo – Trigger – DDL – Bloquear – Criação Tables.sql

Até mais.

Como aumentar a autonomia da bateria do seu notebook; veja dicas


A bateria é um dos maiores problemas na vida de qualquer usuário de eletrônicos, especialmente notebooks. Afinal, ter um trabalho interrompido no meio ou perder arquivos podem causar muita dor de cabeça aos usuários. Sendo assim, é preciso ficar atento ao consumo de energia do seu computador. Para te ajudar, o TechTudo reuniu dicas de como aumentar a autonomia da bateria do seu notebook.

Baterias de Notebook (Foto: Reprodução Acnosite.blogspot.com)Baterias de Notebook podem durar pouco e ficar desgastadas se usuário não usá-las corretamente (Foto: Reprodução/Acnosite)

Tire a bateria quando estiver carregada: apesar de dar um pouco mais de trabalho, isso prolonga muito a vida útil deste componente. Quando estiver com seu notebook na tomada, e a bateria ficar cheia, retire-a de seu computador. Isso não afetará o desempenho dele e irá poupar muito a bateria para a próxima vez que precisar usá-lo desconectado em algum lugar.

Tire a bateria quando estiver carregada: apesar de dar um pouco mais de trabalho, isso prolonga muito a vida útil deste componente. Quando estiver com seu notebook na tomada, e a bateria ficar cheia, retire-a de seu computador. Isso não afetará o desempenho dele e irá poupar muito a bateria para a próxima vez que precisar usá-lo desconectado em algum lugar.

Desative o Wi-Fi e o Bluetooth: estas duas conectividades são responsáveis por um enorme consumo de bateria. Sendo assim, a melhor opção é desligá-las quando não estiverem em uso.

Reduza o brilho da tela: outra tarefa obrigatória para quem quer poupar bateria. Quanto maior o brilho da tela, mais bateria o notebook gastará. Normalmente, é possível reduzi-lo diretamente nos botões do próprio teclado. Caso contrário, a função está presente no Painel de Controle do Windows.

Configure as suas opções de energia: todo notebook tem configurações de energia, ou seja, uma série de opções disponíveis para o usuário ajustar o comportamento do computador. Entre no Painel de Controle do Windows e ajuste essas configurações para que o computador fique menos tempo com a tela e o HD ligados fora da tomada. Dessa forma, você evitará gastos desnecessários de energia.

Evite utilizar programas pesados: muitos softwares, como jogos, editores de imagem e vídeo, podem proporcionar um aumento considerável no consumo de energia do notebook. Isso ocorre devido a enorme demanda que eles geram por processamento rápido e memória RAM, exigindo muito dos componentes internos. Sendo assim, use apenas os programas necessários enquanto estiver desconectado da tomada. Além disso, dê preferência a ferramentas mais leves e de pouca complexidade.

Lembre-se de remover os pendrives (Foto: Reprodução/Sony)Lembre-se de remover os pendrives após utilizá-los para economizar bateria (Foto: Reprodução/Sony)

Desconecte dispositivos das portas USB: qualquer coisa conectada a uma porta USB estará automaticamente puxando energia do seu computador para se manter ligada. Sendo assim, lembre-se sempre de retirar estes dispositivos dos conectores após a sua utilização.

Feche programas desnecessários: é normal o sistema operacional manter diversos programas rodando em segundo plano, que não parecem estar ativos, mas mantém processos abertos em seu computador. Cheque com atenção a barra de ferramentas do Windows e o Verificador de Tarefas para se certificar que nenhum programa desnecessário esteja funcionando.

Mantenha seu computador em local fresco: Uma das coisas que mais consome energia de um notebook é a utilização de coolers e outras técnicas de resfriamento. Para não colaborar com este esforço, lembre-se de sempre usar o seu computador em lugares frescos e nunca obstruir suas saídas de ar.

Desligue o computador quanto terminar de usar: Pode parecer óbvio, mas é importantíssimo desligar o seu notebook ao terminar de usá-lo. Muitos usuários tendem a deixar o aparelho ligado entre uma utilização e outra ou simplesmente desligar a tela, o que gera gasto desnecessário de bateria.

Pronto! Agora você já sabe como aumentar a vida útil da bateria do seu notebook e mantê-lo funcionando por mais tempo. Se tiver alguma outra dica, faça a sugestão nos comentários e não deixe de tirar suas dúvidas no Fórum do TechTudo!

Fontes e Direitos Autorais: por FELIPE VELLOSO – Para o TechTudo – 01/12/2013 08h45 – Atualizado em 01/12/2013 08h46.

Saiba como compartilhar arquivo na rede usando o Windows 8


O Windows sempre facilitou a tarefa de compartilhar arquivos na rede. Basta clicar em uma pasta ou em um drive com o botão direito do mouse e escolher Propriedades.

Depois, passar à guia Compartilhamento e clicar em Compartilhar. Na janela seguinte, abra as opções do primeiro campo, escolha Todos e pressione Adicionar.

Se você quiser que outros micros possam gravar arquivos na pasta ou disco compartilhado, abra as opções em nível de permissão no item criado e selecione Leitura/Gravação. Para completar a tarefa, pressione Compartilhar.

Fontes e Direitos Autorais: , de INFO Online • 26 de fevereiro de 2013.