Top 10 da Semana passada!!!

Ola galera! Como de costume… segue os 10 POSTS mais acessados da semana anterior: Replicação de Dados (Passo a Passo utilizando o SQL Server 2008) Simulados para a prova 70-432 / 70-433 O Projeto do Sultão Copiar resultados com nome das colunas Exportando dados do SQL Server 2008 para Excel (.XLSX) Arredondamento de valores no SQL Server “Array” no SQL Server Importando […]

Problemas no Failover Cluster Manager do Windows Server 2012

Fala pessoal, a pouco tempo implementando uma solução do Always On Availability Groups, me deparei com um problema onde depois de ter o cluster do Windows Server configurado e funcional, quando criava o grupo de disponibilidade, depois de tudo configurado, quando entrava no Failover Cluster Manager, não conseguia acessar a role criada, e quando verificava o serviço por Powershell, o mesmo se encontrava parado e não conseguia inicia-la.


Abaixo um print da mensagem de erro quando tentava acessar a role pelo Failover Cluster Manager:


Após uma pesquisa, chegamos a um site, onde o mesmo fazia referência ao um erro gerado no Failover Cluster Manager após a instalação do KB2750149 para o .Net Framework 4.5.

Depois de remover esta atualização, o Failover Cluster Manager voltou a funcionar e foi possível visualizar e verificar o grupo de disponibilidade do SQL Server 2012 online e funcional.

Não satisfeito, acabei encontrando o KB28003748, para reparar o problema gerado pelo KB2750149.

Até a próxima!



TechED 2013 – Dia 0

Viemos a Madrid ao evento TechED 2013 que é considerado por muitos como o maior evento Microsoft na Europa.

A viagem foi feita no avião "pardal" que embora pequeno, como o nome indica, compriu o seu papel na perfeição:


Após a chegada a Madrid, e ainda no aeroporto enquanto o metro não chegava, já se percebia que Madrid ia ser inundada por geeks Microsoft:


Dia Zero

O dia zero é preenchido com as pre-conferências sobre as mais diferentes tecnologias (ver agenda). Optei por assistir a PRC06 | How to Be a Successful DBA in the Changing World of Cloud and On-Premise Data que é apresentada pelos:

  • Grant Fritchey: Escreveu um excelente livro gratuito que detalha os Execution Plans (ver aqui);
  • Thomas LaRock: Excelente orador que escreveu um livro DBA Survivor: Become a Rock Star DBA excelente para quem se inicia (e não só) no mundo dos DBAs e aborda todo o tipo de questões (relacionamento interpessoal etc). Possuiu também um blog de excelente qualidade (ver blog);
  • Dandy Weyn: Entusiasta do sql que tem um blog com artigos interessantes (ver blog

Algumas fotos da apresentaçao e do ambiente TechED:






Alter table para aumento de Char em tabelas comprimidas

Uma das questões mais interessantes que tenho tido oportunidade de abordar nas sessões sobre internal storage é a alteração do tamanho de colunas de tipo de dados de tamanho fixo.

Quando temos uma tabela construída e fazemos um alter table para aumentar o tamanho de uma das colunas do tipo char, o que o SQLvai fazer é duplicar a coluna, acrescentando espaço para uma nova, até mesmo para tabelas que não têm dados.

No seguinte exemplo crio por engano uma coluna de tamanho char(8000) mas que no passo seguinte altero para char(8). Com um char(8000) só consigo colocar um registo por pagina de dados! Quando é feito o insert o SQL vai fazer isso mesmo, como mantem o espaço para a coluna antiga, vamos conseguir ter 1 registo por página.
Como temos 10000 registos, vamos ter 80MB!



Conseguimos ver isso com o sp_spaceused. Resolução, fazer um rebuil! Após o rebuild os 80MB passaram a 400KB.
 CUIDADO! Atenção a estes Alter.

A pergunta que me fizeram ontem foi: e então se a tabela estiver comprimida?
Vamos experimentar Agora vou criar duas tabelas para comparar. Na primeira faço a compressão depois do Alter na segunda a compressão é feita antes.



E cá está, a compressão é um REBUILD, e no primeiro caso “acertou” os tamanhos, no segundo caso tenho 160KB (um bocadunho maior) por causa de estar ainda a guardar espaço. Se formos olhar para a pagina de dados




Conseguimos perceber que temos nesta segunda tabela 3 colunas quando só deviam existir 2. Corrigir



E obtemos o resultado esperado



Por isso sim, a compressão apresenta o mesmo problema.
nota-estou apenas a experimentar e analisar empiricamente os resultados. Ainda não procurei  informação relativa a este assunto. Se quiserem acrescentar algo, força: bvbasto@gmail.com

In-Memory OLTP – “Hekaton” – Parte2

Como dito no post anterior – http://luanmorenodba.wordpress.com/2013/06/05/in-memory-oltp-hekaton-parte1/ o “Hekaton” é um novo recurso otimizado em memória para se trabalhar em ambientes OLTP. Nesse post irei explicar sobre seus novos mecanismos e quebra de paradigmas. A grande diferença é que agora os dados não são mais colocados em CACHE para depois serem acessados, agora todos os […]

SQL Saturday #245 – Rio de Janeiro

Teremos um grande evento da comunidade SQL no Brasil…. o SQL Saturday #245… O SQL Saturday é totalmente gratuito e focado em SQL Server, um dia inteiro de palestras técnicas. No momento o evento encontra-se com o Call for Speakers aberto, ou seja, recebendo inúmeras propostas de palestras, tendo até agora já recebido propostas de palestrantes de vários … Continuar lendo

[LEMBRETE]: XXXVI Encontro da Comunidade SQLPort

Não esquecer que é já hoje (dia 20 de Junho) que se vai realizar o XXXVI Encontro da Comunidade SQLPort

Este evento vai contar com a participação do Bruno Basto (co-autor deste blog) que irá apresentar uma sessão sobre os internals do armazenamento de dados no SQL Server (Parte II).

Relembramos que a participação neste evento é gratuita e esperamos contar com a presença de todos os entusiastas e profissionais do MSSQL.

Data Evento: 
  20 Jun 2013 - 18:30
Local do Evento: 
  Auditório Microsoft, Parque das Nações, Lisboa
Realiza-se no dia 20 de Junho o XXXVI Encontro da comunidade SQLPort, que tem como objectivo a partilha de experiências e conhecimento entre os profissionais e entusiastas de SQL Server em Portugal. O evento vai ser realizado no auditório da Microsoft Portugal, pelas 18:30, sendo a entrada livre para todos os inscritos.
Agenda:
18:30 - Abertura e recepção.
19:10 - «SQL Internal Storage – P2» - Bruno Basto (Senior Consultant - Rumos)
20:15 - Coffee break
20:30 - «GeoFlow e DataExplorer» - Manuel Dias (Application Platform Sales Specialist - Microsoft)
21:30 - Sorteio de prémios
21:50 - Fim do evento
22:00 - Jantar livre
Bruno Basto, senior consultant  and senior trainer  at Rumos. SQL certified since 6.5 version (1998). Work with MSFT tools and infrastructure since 1992 in the financial, banking and insurance areas. Responsible for several training projects for software solutions with MSFT infrastructure. Speaker at several MSFT and SQLPass events.
This session describes how SQL Server internally stores table data. Although you can use SQL without understanding the internals of data storage, a deep knowledge of how data is stored will improve the development of efficient applications. This second part of this session explores the basic of metadata that keeps track of index storage and compression.

Manuel Dias has over 15 years experience in IT, in diverse roles from Software Development, Real Time Systems, Business Intelligence, Data Warehousing, BPM, Product Management, Agile Methodologies, and Business Solutions. In 2010 he joined Microsoft as a Solution Specialist in the Application Platform area covering Business Intelligence, Data Warehousing and Information Management initiatives. Manuel has a degree in Electronics and Computer Science from Instituto Superior Técnico and a Master Degree in Information Systems from ISEG.

SQL Saturday #245 – Rio de Janeiro

A comunidade SQL Server no Brasil mais uma vez vai realizar o SQL Saturday no Rio de Janeiro. A exemplo do excelente evento que tivemos no ano passado, quando foi realizado o SQL Saturday #127, no dia 14 de abril de 2012, este ano teremos o SQL Saturday #245 que acontecerá no dia 31 de […]

Simulando – Desastre e Recuperação de Bancos de Dados – Microsoft SQL Server 2008 R2 e 2012 – Parte III.

Galera, bom dia. Tudo bem? Como prometido estou retornando com mais um post da série referente a Simulação de Desastre e Recuperação de Banco de Dados no Microsoft SQL Server 2008, R2 e 2012. Neste post, vou destacar o uso do aplicativo Hex Editor Neo, utilizado especificamente para realizar o acesso, interpretação e leitura dos […]

As interessantes Common Table Expression’s (CTE’s) Parte I

Viva,
 
Este artigo está dividido em duas partes: Na primeira irei introduzir o conceito de CTE e descrever as suas sintaxes, na segunda parte farei algumas demonstrações baseadas em situações do nosso dia-a-dia, em que as CTE's provam a sua utilidade.
 
Tendo surgido no SQL Server 2005, uma Common Table Expression (CTE) é um "resultset" temporário cujo tempo de vida se resume à execução de uma query: SELECT, INSERT, UPDATE, DELETE, na qual a própria CTE pode ser referenciada várias vezes.
 
Em certos aspectos assemelha-se a uma "Derived Table", no entanto possui características próprias e únicas que tornam a sua utilização muito interessante em certos cenários, além de melhorar (na minha opinião) a legibilidade das "queries".
 
Antes de mais, qual é a sintaxe básica de uma CTE:
 
;WITH <Nome da CTE> [nomes dos campos devolvidos separados por vírgula]
AS
(
 <Select Query que constitui o corpo da CTE>
)
<Utilização da CTE num SELECT, INSERT, UPDATE, DELETE ou MERGE>
 
Exemplo:
CREATE TABLE #MEIA_MARATONA_CLASSIFICACOES (Nome varchar(50), Tempo int, Sexo char(1))
go

INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Carlos Lopes', 50, 'M')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Rosa Mota', 50, 'F')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Bip Bip', 51, 'M')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Coiote', 60, 'M')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Etienne Lopes', 95, 'M')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Avô Cantigas', 95, 'M')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Ruca', 160, 'M')
INSERT INTO #MEIA_MARATONA_CLASSIFICACOES VALUES ('Tartaruga', 180, 'F')

;WITH a_minha_cte
AS
(
 SELECT Nome, Tempo, Sexo
 FROM #MEIA_MARATONA_CLASSIFICACOES
)
SELECT Nome + ' : ' + Sexo
FROM a_minha_cte
 
Nota:
Se a CTE não for a primeira instrução do "batch" a ser executada então a instrução imediatamente anterior tem que terminar com ";"
Por essa razão recomendo que se inicie sempre a declaração da CTE com ";" desta forma funciona sempre e é menos um potencial BUG no código com que temos que nos preocupar...
 
Já me perguntaram várias vezes se é possível ter várias CTE's na mesma query e a resposta é... SIM!
 
Eis um exemplo de como isso pode ser feito:
;WITH CTE1
AS
(
 SELECT Nome, Tempo, Sexo
 FROM #MEIA_MARATONA_CLASSIFICACOES
),
CTE2
AS
(
 SELECT Nome, Tempo, Sexo
 FROM CTE1
 WHERE Sexo = 'F'
)
SELECT *
FROM CTE1 INNER JOIN CTE2 ON CTE1.Nome = CTE2.Nome
 
CTE's Recursivas:
Uma das características das CTE's é que podem ser declaradas de forma recursiva.

Uma situação típica desse tipo de declaração é quando se pretende trabalhar com hierarquias ao nível de uma tabela, por exemplo imagine uma tabela de empregados, em que cada empregado possui um código (entre outros atributos) e também o código do seu chefe (ou superior hierárquico).
 

A definição de uma CTE recursiva é constituída por duas partes:
1. Âncora(s): ponto de partida para a execução.
2. Membro(s) recursivo(s): A CTE referencia-se a si própria, provocando a recursividade até que não haja mais linhas devolvidas pela invocação anterior.
A(s) âncora(s) e o(s) membro(s) recursivo(s) juntam-se através da instrução UNION ALL no corpo da CTE.

Notas: No que diz respeito à "performance", as CTE's nem sempre são a melhor solução, por exemplo as CTE's recursivas têm um óptimo desempenho nos casos em que cada "filho" tem um único "pai" (ex: cada empregado tem apenas um chefe). Se esse não for o caso então é possível encontrar outras soluções que apresentem um melhor desempenho.
Outro aspecto importante a ter em conta ao nível do impacto na "performance" das CTE's é a utilização adequada e criteriosa de índices, que pode fazer com que a respectiva execução passe de várias horas a apenas alguns segundos.

Na segunda parte deste artigo  poderá encontrar vários exemplos práticos de utilização de CTE's... Até lá!
Go to Top