Microsoft Dynamics CRM MVP²

Parabéns novamente a um dos profissionais mais competentes que já conheci.

Tiago Michelini Cardoso

Pessoal,

Venho mais uma vez agradecer…

A Deus, minha esposa, familiares, amigos, colegas de trabalho e principalmente a comunidade de Dynamics CRM que mais uma vez me proporcionou a premiação de Most Valuable Professional (MVP) para o produto Microsoft Dynamics CRM, ao qual dedico grande parte do meu tempo e trabalho.

Posso dizer novamente que trata-se do dia mais importante e feliz de minha vida profissional, visto que por mais uma tive a felicidade de receber o prêmio e ter a mesma alegria ao saber.

Ações como esta nos fazem cada vez mais crescer e querer ajudar mais e mais, eu realmente estou muito feliz e só tenho a agradecer.

Que venham os próximos anos, espero que continue contribuindo e merecendo participar deste grupo, formado por excelentes profissionais que só mostram o tamanho de sua importância.

MVP2

Não é preciso ser os melhores e sim os que mais querem ajudar!

Go…

Ver o post original 13 mais palavras

Anúncios

Arquitetura de componentes SQL Server

Neste post rapido apresento a arquitetura de componentes em um servidor SQL. Uma das duvidas mais comuns que vejo é a confusão entre o que é base de dados, o que é instancia e como elas estão conectadas. Alem do schema, que muitas pessoas não conhecem.

Arquitetura SQL Server

De forma rapida…

– Um servidor pode possui uma ou mais instancias. Mas uma instancia pertence exclusivamente a um servidor.
– Uma instancia pode ter uma ou mais bases de dados. Mas uma base de dados pertence exclusivamente a uma instancia.
– Uma base de dados pode ter um ou mais schema. Mas um schema pertence exclusivamente a uma base de dados.
– Um schema pode ter um ou mais objetos. Mas um objeto pertence exclusivamente a um schema.
– As instancias pode ser default (Limite de uma por servidor) ou nomeadas.
– Ainda que voce não trabalhe com schemas, o SQL trabalha com o schema padrão: DBO
– Voce possui ao menos 4 bases visiveis: Master, Model, MSDB e TEMPDB.

Erro FileStream .FilePath()

Resolvi escrever este forum rapido ao pegar um problema no forum de um outro usuario, ao pesquisar na internet não encontrei muitas referencias portanto deixo aqui a solução.
No SQL Server, na maioria dos casos os comandos não são CASE_SENSITIVE, ou seja, um “CREATE TABLE” funciona normalmente assim como um “create table” porem para toda regra há sua exceção e o PathName do FileStream é uma delas:

O erro gerado foi o seguinte:
Msg 4121, Level 16, State 1, Line 1
Cannot find either column “FS_ARQUIVO” or the user-defined function or aggregate “FS_ARQUIVO.pathname”, or the name is ambiguous.

O Script utilizado foi:

CREATE DATABASE FileStreamDB ON PRIMARY  (

 NAME = FileStreamDB_data,

    FILENAME = 'D:\Filestream\FileStreamDB_data.mdf'),

FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM

  ( NAME = FileStreamDB_FILE,

    FILENAME = 'D:\Filestream\arquivos')

LOG ON

  ( NAME = 'FileStreamDB_log',

    FILENAME = 'D:\Filestream\FileStreamDB_log.ldf');
GO
    
USE FileStreamDB;
GO
CREATE TABLE FSDESC (
IDFSDESC INT IDENTITY NOT NULL,
DESCRICAO VARCHAR(50) NOT NULL
)
GO
ALTER TABLE FSDESC ADD CONSTRAINT PK_FSDESC PRIMARY KEY (IDFSDESC)
GO

USE FileStreamDB;
GO
CREATE TABLE FSFILE (
ID_FSARQUIVO INT IDENTITY NOT NULL,
ID_DESC INT NOT NULL,
ID_GUID UNIQUEIDENTIFIER ROWGUIDCOL UNIQUE NOT NULL,
FS_ARQUIVO VARBINARY(MAX) FILESTREAM NULL
)
FILESTREAM_ON FileStreamGroup1;

ALTER TABLE FSFILE ADD CONSTRAINT PK_IDFSARQUIVO PRIMARY KEY (ID_FSARQUIVO)
GO
ALTER TABLE FSFILE ADD CONSTRAINT FK_DESC_ARQUIVO FOREIGN KEY (ID_DESC) REFERENCES FSDESC(IDFSDESC);
GO

--insere descrição
INSERT INTO FSDESC (DESCRICAO)
VALUES('IMAGEM .JPG'),('E-BOOK .PDF'),('OFFICE .DOC')
GO

--insere documento jpg, pdf, doc etc...
INSERT INTO FSFILE (ID_DESC,ID_GUID,FS_ARQUIVO)
SELECT 1,NEWID(),*
FROM OPENROWSET (BULK 'D:\FileStream\Elo_Perdido.jpg',SINGLE_BLOB) AS Document
GO
INSERT INTO FSFILE (ID_DESC,ID_GUID,FS_ARQUIVO)
SELECT 3,NEWID(),*
FROM OPENROWSET (BULK 'D:\FileStream\ArquivoWord.docx',SINGLE_BLOB) AS Document
GO

SELECT [FS_ARQUIVO].PathName()  FROM dbo.FSFILE --> Executado com sucesso
SELECT [FS_ARQUIVO].pathname()  FROM dbo.FSFILE --> Erro

Resumo:
Sem erro:

SELECT [FS_ARQUIVO].PathName()  FROM dbo.FSFILE

Com erro:

SELECT [FS_ARQUIVO].pathname()  FROM dbo.FSFILE

Compressão de dados – Row/Linha

Neste artigo irei comentar um pouco sobre a compressão de dados a nivel de linha disponivel no SQL Server.

Primeiramente o script utilizado para testes e abaixo as explicações:

--Cria a tabela
IF(OBJECT_ID('Vendas') IS NOT NULL)
	DROP TABLE Vendas

CREATE TABLE Vendas
(
	Id INT IDENTITY(1,1) PRIMARY KEY,
	Id_Funcionario INT,
	Id_Cliente INT,
	Id_Venda INT
)
GO

INSERT INTO Vendas(Id_Funcionario, Id_Cliente, Id_Venda)
SELECT CHECKSUM(NEWID()), CHECKSUM(NEWID()), CHECKSUM(NEWID())
GO 5000

--Vendo espaço sem compressao
EXEC sp_spaceused 'Vendas'

--Seta compressao a nivel de linha
ALTER TABLE Vendas REBUILD WITH (DATA_COMPRESSION = ROW)

--Vendo espaço com compressao
EXEC sp_spaceused 'Vendas'

/*
				name	rows	reserved	data	index_size	unused
Sem compressão: Vendas	5000    208 KB		128 KB	24 KB		56 KB
Com compressão: Vendas	5000    144 KB		104 KB	24 KB		16 KB
*/

Podemos ver claramente que houve uma redução do espaço utilizado pela tabela sem uma redução do numero de linhas.

O que aconteceu?
O SQL Server identificou todos os valores presentes na tabela e passou a ocupar apenas o numero de bytes necessarios para o armazenamento daquele valor. Por padrão o tipo de dados INT ocupa 4 bytes, porem, caso o valor a ser guardado seja inferior a 255 por exemplo, apenas 1 byte será necessario para seu armazenamento, fazendo com que seja economizado 3 bytes de espaço em disco para aquela pagina.

Todos os tipos de dados podem ser utilizados na compressão?
Sim e não! Sim pelo fato de que voce não terá erros na execução do script de compressão independente dos tipos de dados existentes na tabela, porem alguns deles simplismente não surtirão efeitos nenhum, como é o caso dos datatypes de textos (Varchar por exemplo). Veja o script abaixo:

--Cria a tabela
IF(OBJECT_ID('Vendas') IS NOT NULL)
	DROP TABLE Vendas

CREATE TABLE Vendas
(
	Id INT IDENTITY(1,1) PRIMARY KEY,
	Funcionario VARCHAR(100),
	Cliente VARCHAR(100),
	Venda VARCHAR(100)
)
GO

INSERT INTO Vendas(Funcionario, Cliente, Venda)
SELECT REPLICATE('a', 100), REPLICATE('a', 100), REPLICATE('a', 100)
GO 5000

--Vendo espaço sem compressao
EXEC sp_spaceused 'Vendas'

--Seta compressao a nivel de linha
ALTER TABLE Vendas REBUILD WITH (DATA_COMPRESSION = ROW)

--Vendo espaço com compressao
EXEC sp_spaceused 'Vendas'

/*
				name	rows	reserved	data	index_size	unused
Sem compressão: Vendas	5000    1680 KB		1600 KB	24 KB		56 KB
Com compressão: Vendas	5000    1616 KB		1600 KB	16 KB		0 KB
*/

Vejam que o tamanho dos dados não houve redução mesmo com a compressão de linha ativada, portanto é necessario avaliar muito bem cada tabela antes de efetivamente sair ativando a compressão de linha em todas as tabelas.

Para maiores informações visite o link oficial BOL: http://msdn.microsoft.com/en-us/library/cc280576.aspx

Procedure sp_configure “Affinity Mask”

Uma das configurações que podemos setar pela procedure de sistema “EXEC sp_configure” é a opção “Affinity Mask”. Neste post descrevo um pouco sua usabilidade alem de alguns testes praticos mostrando o efeito da mesma.

O que é a procedure de sistema “sp_configure”?
É uma procedure aonde é possivel setar N configurações em relação a instancia como por exemplo processadores, memorias, conexões dentre outras.

E a opção “Affinity Mask”?
Esta opção se diz respeito a qual processador fisico (Ou logico, HyperThreading) o SQL Server irá trabalhar.
Mas, como setar um valor para ele mapeando os processadores sendo que é possivel apenas passar um numero?
Simples! Essa configuração fica em uma regua de potencia de 2. mais ou menos da seguinte forma:
Se temos 8 processadores, temos então a seguinte situação

Foto01

Portanto, se quisermos utilizar os processadores parem (P2, P4, P6 e P8) devemos somar seus valores da regua, ficando 2 + 8 + 32 + 128 = 170,

então o valor a ser passado para o parametro de “Affinity Mask” é 170.

Caso voces olhem agora essa configuração é muito provavel que ela esteja como 0, fazendo com que o proprio SQL Server gerencie isso, e este valor não deve ser alterado a não ser que seja solicitado pelo time de suporte da Microsoft ou então voce não terá suporte.

Alguns testes praticos:

1 – Primeiramente eu baixei a ferramenta coreinfo.exe para poder visualisar algumas informações sobre os processadores da maquina cuja qual estou escrevendo este post.
a. Link para download: http://technet.microsoft.com/en-us/sysinternals/cc835722.aspx
b. Como executar: Extraia o .exe para uma pasta (D:\ por exemplo) e execute: d:\coreinfo.exe pelo command prompt (Executar -> CMD)

Uma das informações relevantes é que os processadores apontados pelo task manager são fisicos ou hyperthereading, mas, qual é qual? E qual o SQL Server priorizará?
O SQL Server tende a utilizar mais os fisicos e isso pode facilmente ser visto, basta deixar um looping em execução, conforme script abaixo

WHILE (1=1)
	SELECT 1+1

Que voce verá os processadores fisicos sendo mais utilizados. Veja o print dos processadores com o looping em execução.

Foto02

Todo caso, é interessante esta analise pelo coreinfo.exe, aonde é possivel ver tais informações na seguinte parte:

Foto03

Ou seja, o que é fisico, o que é logico e como eles estão agrupados.

Agora, fazendo uma alteração no meu “Affinity Mask” para 2, ou seja, utilizar apenas um processador fisico, pelo script:

EXEC sp_configure 'affinity mask', 1
RECONFIGURE WITH OVERRIDE

E executando o mesmo looping anterior, podemos ver claramente a utilização da primeira CPU (HyperThreading) sendo priorizada, os outros tambem são claro por outros processos tanto da maquina quanto do proprio SQL Server.

Foto04

Overlaping de dados – QO

O Query optimizer (QO) vem evoluindo ao londo dos anos e das versões do SQL Server. Dentre algumas melhorias feitas esta a identificação de Overlaping de valores.

O que é o OverLaping?
Overlaping ocorre quando em um predicado de uma query há sobreposição de valores.

Exemplo:
001_Overlaping

No QO é possivel visualizar pelo plano de execução da query que tal situação é tratada pelo SQL Server criando apenas um Seek Predicate, conforme imagem abaixo:
002_Overlaping

Abaixo o script utilizado para a demonstração:

USE tempdb
GO

IF(EXISTS(SELECT TOP 1 1 FROM sys.tables WHERE name LIKE 'DemonstracaoQO'))
	DROP TABLE DemonstracaoQO

CREATE TABLE DemonstracaoQO
(
	Numero BIGINT
)
GO

INSERT INTO DemonstracaoQO(Numero)
SELECT (CHECKSUM(NEWID()))/10000000
GO 100

SELECT MIN(Numero) As Minimo, MAX(Numero) As Maximo
FROM DemonstracaoQO
GO

SELECT Numero
FROM DemonstracaoQO
WHERE
	Numero BETWEEN -206 AND 100 --Menor valor AND algum numero no meio entre menor e maior
	OR Numero BETWEEN 50 AND 208 -- Algum numero entre os 2 do between acima e o maior valor

Então podemos afirmar que o Query Optimizer é inteligente o sulficiente para identificar sobreposição de predicados e reduzilos ao maximo melhorando assim a performance de sua consulta, aonde no exemplo acima duas condições foram transformadas em apenas uma.

Como criar um LinkedServer para uma porta especifica

Esses dias, na empresa aonde trabalho, temos uma conexão via Linked Server com uma outra empresa para a execução remota de um procedure, porem, essa empresa remota iria bloquear a sua porta 1433 do SQL Server e colocar a instancia em outra porta, o que causaria uma quebra em nossa comunicação.

Pensei em algumas alternativas mais simples como simplismente abstrair tal alteração e deixar o SQL Server Browser se virar do outro lado, porem, obviamente o mesmo não funciona devido ao meio de acesso, o que acaba com essa possibilidade, então, depois de algumas pesquisas, consegui criar um linked server para uma porta especifica.

Tentei varias coisas, até uma unica string de conexão configurando todo o linked server em apenas um parametro, porem de forma alguma funcionou, não consegui tambem criar um linked server com tal caracteristica pela ferramenta grafica (SSMS 2008/2012), então, executei o comando:

EXEC sp_addlinkedserver
@server=’NomeDoLinkedServer’,
@srvproduct=”,
@provider=’SQLNCLI’,
@datasrc=’tcp:ip1.ip2.ip3.ip4,Porta’

Funcionou perfeitamente e acabou sendo mais facil que todas as outras tentativas rs..Enfim, espero que possa ajuda quem esteja precisando.

Como minha query chega ao servidor?…

Todos sabemos que o SQL Server aceita varios protocolos de conexão, como Shared Memory, VIA e TCP/IP por exemplo, porem, a partir do momento em que uma conexão é feita com uma base SQL Server, toda sua comunicação sera feita atravez de pacotes TDE (Tabela Data Stream), ou seja, quando enviamos um select de nosso Client (Maquina local por exemplo…) para o servidor, na rede, estamos enviando-o via protocolo TDS.

No SQL Server, existe um protocolo TDS para cada meio de conexão alem de uma especifica para a conexão DAC.

Existem algumas versões que foram desenvolvidas com o passar do tempo deste protocolo, abaixo uma tabela com os diferentes tipos e algumas explicações (Não de minha autoria….).

Grupos no SSRS (SQL Server Reporting Services)

Uma duvida que vejo bastante em foruns e nos emails com duvidas que recebo sobre SSRS (SQL Server Reporting
Services) é em relação a agrupamento, ok, porem, o que é agrupamento…?

Sabe quando uma linha se repete varias vezes, sendo o topo maximo de uma hierarquia, e as diferencas da linha estão em niveis mais baixo, como por exemplo: Estado e cidade, teriamos algo assim…

SP São Paulo
SP Campinas
SP …
RJ …
RJ …

Ou seja, podemos observar que o estado esta aparecendo varias vezes!, o que obviamente fica bem feio, e ruim de ser lido em um relatorio, portanto, a tecnica de agrupamento não só é extremamente pratica e simples de ser aplicada, como em muito casos, simbolo de boa pratica e higienização visual em seu relatorio.

Como curiosidade, ao criarmos um grupo, estamos falando de hierarquia, a mesma que pode ser feita no SSAS (Que sera assunto de posts futuros…).

Abaixo, segue uma breve explicação de como se criar estes grupos (Hierarquias no SQL Server Reporting Services).

OBS: Estou utilizando BIDS 2008, com SQL Server 2008, e uma base chamada AdventureWorksLT, é basicamente a base AdventureWorks que ja conhecemos bem, porem em sua versão Lite, sendo mais leve, e com menos tabelas.
A tabela que utilizarei como exemplo, se chama Product, que contem informações dos produtos que são vendidos na famosa loja de bicicletas.

Passo 1: Criar a conexão com a base de dados e um novo relatorio

Neste passo, não tem segredo, se iniciarmos o BIDS no modo de contrutor de relatorio, muito provavelmente ja ira te saltar uma opção Wizard para informar uma conexão e um relatorio, como o foco deste post não é o desenvolvimento inicial de relatorios, irei abstrair este passo, qualquer duvida no mesmo, fique a vontade para me mandar email ou perguntar nos comentarios.

Passo 2: O Objeto

O objeto que utilizaremos para se criar os grupos se chama Tablix, basta arrastar da caixa de ferramenta, um deste objeto para seu relatorio.

Passo 3: Criação de um DataSet com o SELECT no banco de dados

Aqui, basta criar um novo DataSet, utilizando a conexão previamente criada, e escrever seu SELECT, no meu exemplo, estou utilizando:

SELECT ProductCategoryID, Name
FROM SalesLT.Product
WHERE ProductCategoryID IN (9, 10)

O filtro, é apenas para ficar visualmente mais limpo, tendo em vista que o ponto do post não é a analise de dados, e sim o agrupamento dos mesmos.

Feito isso, fica bem simples o agrupamento, abaixo de seu relatorio, deve ter os campos:
– Grupos de linhas
– Grupos de colunas

Como temos os dados no formato exemplificado acima, e queremos deixa-lo…

SP São Paulo
Campinas
RJ …

Iremos utilizar o agrupamento de linhas.

Então, basta voce selecionar o campo mais alto de sua hierarquia, que no nosso caso é o ProductCategoryId, e arrasta-lo para o grupo de linhas, e em seguida, ir descendo o nivel de sua hierarquia, portanto, arrastando tambem, o campo Name, como na imagem abaixo:

Com o intuito de melhor visualização e como não temos nenhum outro dados, estou setando a ultima coluna com visibilidade oculta, aqui, seria interessante colocar por exemplo, o total, um grafico por linha e afins, as possibilidades são infinitas.

Então, teriamos uma visualisação mais ou menos assim:

Cumulative Update #01 para SQL Server 2012

A microsoft ja liberou o Cumulative Update #01 para o SQL Server 2012, muitos “bugzinhos” foram corrigidos.

Segue link para Download: http://support.microsoft.com/kb/2679368/pt-br