Archive

Archive for the ‘Best Pratices’ Category

Implementing Microsoft Azure Infrastructure Solutions – Rumo a NUVEM !!!

Olá pessoal, quanto tempo neh!? Pois é, bastante correria. Desta vez eu vim para falar um assunto não muito técnico, mas, que com certeza vai vingar muito em breve no meu ponto de vista. Este post vai falar sobre minha experiência referente ao exame 70-533 da Microsoft que realizei na última quinta-feira (19/02/2015) e foi concluído com sucesso e uma visão que EU tenho do que está por vir com o Azure. Posso estar errado? Com certeza!!! Mas o que vale é compartilhar…rs.

Nos primeiros momentos estudando para a prova, veio na minha cabeça uma coisa que sempre conversei com o meu amigo Marcelo Fernandes e que acho que foi bastante cobrado dos DBAs quando existia o extinto título MCDBA. Pra quem não sabe, para possuir esse exame era necessário possuir DUAS provas de SQL Server 2000 e UMA de Windows Server 2003, já que o SQL Server deve ser instalado em cima de um SO é necessário que conheça um pouco dele. No meu ponto de vista existem diversos tipos de DBAs e com perfis diferentes que cada um se encaixa perfeitamente no seu dia-a-dia de trabalho, no entanto, o DBA deve conhecer um pouco de Rede, Infra, SO, Storage, Desenvolvimento, Servidores de Aplicação e algo que pode influenciar o seu SGBD indiretamente. Pois, como diz o Luti DBA significa “Default Blame Accept”. Faz sentido não é!?

No meu ponto de vista, no Microsoft Azure vejo que não existirá os rótulos: o “cara” do SO, o “cara” do SQL, o “cara” da Rede e o “cara” disso e daquilo, mas, sim o Arquiteto de Soluções pra Cloud, pois, esse é o que se espera da pessoa que se especializará nesse segmento. Por outro lado isso não isenta de se especializar, mas, torna as coisas muito mais interessantes e competitivas. Acredita que essa é a palavra que melhor define o Microsoft Azure, Competitivo.

Em uma época onde as empresas são bastante dinâmicas e precisam sempre estar à frente dos seus concorrentes e de forma que necessitem reduzir custo, o Microsoft Azure traz tudo isso de forma simples e objetiva tornando as empresas mais competitivas. Não é isso que a sua área de negócio e o seu negócio espera de você!? Por que gastar uma fortuna em Infra Estrutura, Armazenamento, Comunicação, Licenças, Renovações, Equipes “infladas”, plantões infinitos e etc. Embora, isso não significa que não precisamos de pessoas, elas ainda são e serão muito importantes nas organizações, mas, agora com o foco mais direcionado que é “Business”.

Imagine o seguinte cenário: Você precisa criar um site que venderá ingressos para o show dos Beatles. Estima-se que o local do show abrigará mais que duzentas mil pessoas. O site pode ser acessado 24X7 e apenas ficará disponível por 2 dias para quem quiser comprar. Seria um grande desafio conseguir o data center, comprar licenças, prever alta disponibilidade, monitoramento, equipe e etc. Com o Microsoft Azure essa situação muda um pouco! Se quiser saber mais, deixo no final do artigo referências sobre o assunto.

Quanto o exame 70-533 volta um pouco a ser exigido o que era exigido no exame MCDBA, não com tantos detalhes técnicos, mas, requer que o candidato tenha conceitos de Storage, Rede, Infra e etc. E com certeza uma das coisas mais importante como ter tudo isso reduzindo custo.

Vamos a lista do que é cobrado no exame:

  • Implement Web Sites
  • Implement Virtual Machines
  • Implement Cloud Services
  • Implement Storage
  • Implement Azure Active Directory
  • Implement Virtual Networks

No modulo de Web sites é importante entender como fazer a implantação de um web site, configurá-lo e monitorar. Também entender quais são as opções para restringir o acesso e forma de deixa-lo seguro com protocolos como SSL e certificados.

Em implementando máquinas virtuais são basta apenas saber o que é uma máquina virtual, mas, como utilizar de forma inteligente e o que se pode fazer com máquinas virtuais na nuvem. Uma das coisas mais fantásticas e a opção de você criar um “template” e fazer o upload da imagem para a sua galeria. Claro que outras coisas como configurar, monitorar, como separar por “subnets” e como criar maquinas para você ter disponibilidade em caso de desastres ou qualquer aplicação de patch.

Em Implementando o Cloud Services requer a exigência de entender como se pode implementar aplicações rodando na nuvem, como fazer o “scale up/down”, configurar, monitorar. Entender o que é um “Web Role” e “Worker Role”,saber como tirar proveitos desses recursos e como dimensiona-los da melhor forma reduzindo custos.

Em implementando Storage que na minha opinião é um dos assuntos com o aspecto mais importantes no Azure. Pois, lhe traz opções de como armazenar aquivos, pastas, fazer backups, sql database, blob storage, site recovery e etc. Sabendo configurações, opções de planos e alguns outros pontos chaves tenho certeza que sua vida será mais tranquila quando migrar pra nuvem.

Está o requisito que pessoas apenas acostumada com seu “quadrado” pode ter dificuldade. Para a pessoa que vem de SQL ou de qualquer tecnologia especifica pouco se preocupa de como é feito/ou deveria ser o acesso as aplicações, recursos, objetos e integrações seja ela no on-premises ou no Microsoft Azure. Esse quesito é bastante exigido, pois, no exame existem diversos cenários aonde se fala em integrar ambiente on-premises com Azure.

Finalmente implementando redes virtuais, se você é aquela pessoa que não possui bastante afinidade com redes de computadores, bem-vindo ao time. Nsse item é requerido que o candidato possua conhecimento de redes, protocolos, comunicação, subnets, vpn e algumas “coisitas” mais. Entender fases, passo-a-passo e componentes para entender como criar redes: Point-to-site, site-to-site, multi-site e fazer com que as redes hoje locais possam estender para a nuvem é um dos aspectos chaves desse módulo.

Caminho que segui para os estudos:

Utilizei o livro:  Exam Ref 70-533 Implementing Microsoft Azure Infrastructure Solutions, MSDN e TechNet e alguns links abaixo:

http://azure.microsoft.com/pt-br/

http://azure.microsoft.com/pt-br/pricing/

http://azure.microsoft.com/pt-br/overview/what-is-azure/

Também o que foi bastante importante para a consolidação do aprendizado foi criar uma conta no Microsoft Azure, que é disponibilizada free no portal.

http://azure.microsoft.com/pt-br/pricing/free-trial/

Espero que tenham gostado!!!

Até a próxima

Advertisements

Especificação de Capacidade Máxima no SQL Server

Pessoal, boa tarde.

Hoje apenas apareci para dar uma dica rápida e acredito que seja de interesse em geral…rsrs. Quem nunca se pegou pensando: Qual a capacidade máxima de colunas em uma instrução SELECT ? Qual a quantidade de linhas por tabela? Ou até mesmo tabelas por database? “Passeando” pelo BING uma pesquisa me direcionou para um link no MSDN que gostaria de compartilhar com vocês. O link se refere a Capacidade máxima de especificação do SQL Server:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

Muito Obrigado.

Abs

Dica rápida – Removendo NOT IN

Ola Galera, blz? Tô passando pra realizar um post na “velocidade da luz” devido ao curto espaço de tempo pra postar. Porém, essa duvida é meio que corriqueira no ambiente de desenvolvimento que passei. Quando temos um NOT IN, como podemos reescrever uma query? As vezes se soubermos como reescrever uma query de uma outra maneira e ela traz o mesmo resultado podemos obter ganho de performance. Mas, isso deve sempre ser testado para verificar se o ganho é verdadeiro(Esse assunto fica pra um outro post).

O Gustavo Maia escreveu um ótimo artigo sobre o assunto: http://gustavomaiaaguiar.wordpress.com/2009/01/18/piores-praticas-utilizacao-do-operador-not-in/

Evite usar o operador NOT IN para verificar inexistência de dados em tabelas. Se o uso deste operador for mesmo necessário, ele pode ser modificado por um left join, conforme Exemplo:

USE tempdb
go

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(‘[dbo].[TB_CLIENTE]’) and type=’U’)

DROP TABLE [dbo].[TB_CLIENTE]

go

CREATE TABLE [dbo].[TB_CLIENTE] (COD int identity, NOME varchar(max))

go

INSERT INTO [dbo].[TB_CLIENTE](NOME)VALUES(‘Minha CONSULTORIA’)

INSERT INTO [dbo].[TB_CLIENTE](NOME)VALUES(‘Minha’)

INSERT INTO [dbo].[TB_CLIENTE](NOME)VALUES(‘Consultoria’)

GO

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(‘[dbo].[TB_PEDIDO]’) and type=’U’)

DROP TABLE [dbo].[TB_PEDIDO]

go

CREATE TABLE [dbo].[TB_PEDIDO] (COD int identity, PRODUTO varchar(50), COD_CLI INT)

go

INSERT INTO [dbo].[TB_PEDIDO] (PRODUTO,COD_CLI)VALUES(‘NOTE BOOK’,1)

INSERT INTO [dbo].[TB_PEDIDO] (PRODUTO,COD_CLI)VALUES(‘CADERNO ESCOLAR’,1)

INSERT INTO [dbo].[TB_PEDIDO] (PRODUTO,COD_CLI)VALUES(‘REVISTA’,1)

INSERT INTO [dbo].[TB_PEDIDO] (PRODUTO,COD_CLI)VALUES(‘BICLICLETA’,2)

INSERT INTO [dbo].[TB_PEDIDO] (PRODUTO,COD_CLI)VALUES(‘TELEFONE CELULAR’,2)

INSERT INTO [dbo].[TB_PEDIDO] (PRODUTO,COD_CLI)VALUES(‘BOLA DE FUTEBOL’,2)

O script acima cria uma tabela de cliente e de pedidos. Imagine que você precisa retornar uma query que traz os clientes que NÃO tem pedidos. O pensamento inicial seria usar o NOT IN:

SELECT c.cod,c.nome FROM dbo.TB_CLIENTE c WHERE c.cod NOT IN (SELECT p.cod_cli FROM dbo.tb_pedido p)

O resultado seria:

A query poderia ser facilmente modificada para usar um left join obtendo o mesmo resultado.

 SELECT c.cod,c.nome, p.COD,p.COD_CLI FROM dbo.TB_CLIENTE c 
LEFT JOIN dbo.tb_pedido p 
on c.cod = p.cod_cli
where p.COD_CLI is null

Na velocidade da luz….rs.

Espero ter ajudado

@@IDENTITY / SCOPE_IDENTITY() / IDENT_CURRENT

Quando for necessário resgatar o valor de uma coluna auto incremento no SQL Server, é recomendado que use a opção SCOPE_IDENTITY(). Abaixo segue o comportamento das opções existem para esta função.

@@IDENTITY: Retorna o ultimo valor de identidade gerado para qualquer tabela na sessão atual dentro de qualquer escopo.

SCOPE_IDENTITY():Retorna o ultimo valor de identidade gerado para qualquer tabela na sessão atual para o comando e escopo atual.

IDENT_CURRENT: Retorna o ultimo valor de identidade gerado para uma tabela especifica em qualquer sessão e em qualquer escopo.

Ex:

USE tempdb;

GO

if exists(select name from sys.objects where object_id= OBJECT_ID(‘dbo.t6’) and type = ‘U’)

begin

DROP TABLE dbo.t6;

end

if exists(select name from sys.objects where object_id=OBJECT_ID(‘dbo.t7′) and type=’U’)

begin

DROP TABLE dbo.t7;

end

GO

CREATE TABLE dbo.t6(id int IDENTITY);

CREATE TABLE dbo.t7(id int IDENTITY(100,1));

GO

CREATE TRIGGER t6ins ON t6 FOR INSERT

AS

BEGIN

INSERT dbo.t7 DEFAULT VALUES

END;

GO

SELECT * FROM dbo.t6;

–id é branco

SELECT * FROM dbo.t7;

–id é branco

–Executar este codigo na sessao 1(janela do SSMS)

INSERT dbo.t6 DEFAULT VALUES;

SELECT @@IDENTITY;

/*Retorna o valor 100. Que foi inserido pela trigger.*/

SELECT SCOPE_IDENTITY();

/* Retorna o valor 1. Esta valor foi inserido por uma instrução INSERT duas instruções antes desta query*/

SELECT IDENT_CURRENT(‘dbo.t7’);

/* Retorna o valor dentro de t7, que foi inserido pela trigger. Fora do escopo atual.*/

SELECT IDENT_CURRENT(‘dbo.t6’);

/* Returns value inserted into t6. Esta valor foi inserido por uma instrução INSERT quatro instruções antes desta query.*/

DROP TRIGGER t6ins

— Executar este codigo na sessao 2 (uma segunda janela no SSMS)

SELECT @@IDENTITY;

/* Retorna NULO, porque nenhuma instrução de INSERT foi gerada neste ponto para esta sessão*/

SELECT SCOPE_IDENTITY();

/* Retorna NULO, porque nenhuma instrução de INSERT foi gerada neste escopo para esta sessão*/

SELECT IDENT_CURRENT(‘t7’);

/* Retorna o ultimo valor inserido dentro de t7 = 100*/

Referência:

http://msdn.microsoft.com/pt-br/library/ms190315.aspx

Espero ter ajudado!

Removendo Cursor – Dica Rápida

Ola Galera, blz? Como o tempo está um pouco corrido essa vai ser uma dica rápida que pode ser usada no dia-a-dia.
Imaginem o cenário que é necessário criar uma string com diversos ID’s. E esses ID’s estão dentro de uma tabela. A idéia inicial seria realizar um loop para incrementar uma variavel e montar a nossa string.. Vamos ao exemplo:
O script abaixo cria uma tabela com os códigos do cliente que iremos usar para montar a nossa string.
use tempdb
go
if OBJECT_ID(‘dbo.tb_cliente’) is not null
drop table dbo.tb_cliente
go
create table dbo.tb_cliente(id int identity, codigoCliente int , nome varchar(50))
go
–Bloco que popula a tabela com informações dos clientes
set nocount on
declare @i int = 1
while @i <= 100
begin
insert into dbo.tb_cliente(codigoCliente,nome)values(@i,replicate(‘Thiago’,2))
set @i = @i + 1 *(2)
end
go

Declaramos as variaveis @count, @total para realizar o nosso loop. As variáveis @idCliente e @idClienteString serão usadas para armazenar os codigos concatenados. A tabela temporaria #CodigosCliente é usada para guardar as informações pertinentes ao predicado IN. O script abaixo preenche a tabela temporária com os registros que serão montados para o loop. Após a inserção, o total de registros e colocado em uma variável para que iniciemos a montagem da string.
declare @count int , @total int
declare @idCliente varchar(max), @idClienteString varchar(max)
create table #CodigosCliente(id int identity, codigoCliente int)
–Popula a temporaria com as informacoes que sera colocadas em uma string
insert into #CodigosCliente(codigoCliente)
select codigoCliente
from dbo.tb_cliente where codigoCliente between 10 and 50

set @idCliente = ‘ ‘
set @idClienteString = ‘ ‘
select  @total =count(id) from #CodigosCliente
set @count = 1
if @total > 0
begin
set @idClienteString = ‘codigoCliente IN ( ‘
end
else
begin
set @idClienteString = ‘codigoCliente IN (0 ‘
end
while @count <= @total
begin
if  @count > 1
begin
set @idClienteString = @idClienteString + ‘, ‘
end
select @idCliente=codigoCliente from #CodigosCliente where id=@count
set @idClienteString = @idClienteString + @idCliente
set @count = @count + 1
end
set @idClienteString = @idClienteString + ‘ )’
print @idClienteString
go
Após a execução do script acima, o SQL Server irá montar o predicado in com os valores, conforme imagem:

Conforme imagem acima, temos o resultado esperado, porém, operações linha-a-linha são mais custosas para o SQL Server. Nós poderíamos obter o mesmo resultado com o script abaixo:

declare @idCliente varchar(max )
declare @idClienteString varchar(max)
SET @idCliente =
SET @idClienteString =
SET @idClienteString = ‘codigoCliente IN (‘
SELECT @idCliente=@idCliente +‘,’+CONVERT(varchar(max),codigoCliente)from#CodigosCliente
SELECT @idCliente =substring(@idCliente,2,LEN(@idCliente))
SET @idClienteString = @idClienteString + @idCliente +‘)’
PRINT @idClienteString
Como podemos ver, temos o mesmo resultado com uma menor quantidade de linhas uma instrução única evitando o uso de um loop.

Créditos: Alexandre José Malachias….Valeu Boss