quarta-feira, 30 de novembro de 2011

SQL Server 2012 RC0 Download

Depois de um longo período ausente, pretendo retomar
os posts escrevendo sobre a nova versão do SQL Server, definida recentemente como SQL Server 2012.

Segue abaixo alguns links para download do produto e papers:

Link para download SQL Server 2012 RC0 32 e 64 bits:
http://www.microsoft.com/betaexperience/pd/SQLDCTP3CTA/enus/default.aspx

Link para download SQL Server 2012 RC0 Express:
http://msdn.microsoft.com/en-us/evalcenter/hh230763.aspx

Site oficial da Microsoft para o SQL Server 2012:
http://www.microsoft.com/sqlserver/en/us/future-editions.aspx

Segue abaixo a lista dos pré-requisitos:
http://msdn.microsoft.com/en-us/library/ms143506(v=sql.110).aspx

Nos próximos posts vou explorar as novas
funcionalidades do SQL Server 2012, aguardem…
Landry

quinta-feira, 21 de abril de 2011

Filtered Index in SQL Server 2008

Neste post vou falar de um recurso novo no SQL Server 2008 para melhorar o desempenho das consultas: Filtered Index. A partir do SQL Server 2008 pode-se acrescentar ao comando CREATE INDEX uma cláusula WHERE, filtrando linhas da tabela e reduzindo o tamanho do índice.

Para mostrar este recurso utilizei como exemplo a tabela “Production.TransactionHistory” do banco de dados AdventureWorks2008. A consulta abaixo utiliza um “Cluster Index Scan” (leia-se “Table Scan”, pois no nível folha do índice cluster temos a própria tabela) como plano de execução.

set statistics profile on
set statistics io on

select BusinessEntityID,FirstName,MiddleName,LastName,ModifiedDate
from Person.Person where PersonType = 'VC'

-- Cluster Index Scan
-- Table 'Person'. Scan count 1, logical reads 3816

O índice ideal para atender a consulta acima seria um Nonclustered Index com a chave na coluna PersonType e Include nas demais colunas do SELECT, veja:

create index IX_Person_PersonType on Person.Person(PersonType)
include (FirstName,MiddleName,LastName,ModifiedDate)


Se executarmos a consulta acima novamente o SQL Server fará Index Seek, reduzindo consideravelmente o I/O.

-- Index Seek (IX_Person_PersonType)
-- Table 'Person'. Scan count 1, logical reads 4


A partir do SQL Server 2008 pode-se criar índices menores, especializados na cláusula WHERE de uma consulta, gerando redução do espaço ocupado. Basta acrescentar ao final de um CREATE INDEX uma cláusula WHERE:

create index IX_Person_PersonType_Filter on Person.Person(PersonType)
include (FirstName,MiddleName,LastName,ModifiedDate)
where PersonType = 'VC'


Se executarmos a consulta do início do artigo novamente o SQL Server irá gerar o mesmo plano de execução, porém utilizando o novo índice:

-- Index Seek (IX_Person_PersonType_Filter)
-- Table 'Person'. Scan count 1, logical reads 4


Comparando os dois índices com a instrução abaixo, podemos observar a redução no tamanho do índice de 137 para 4 páginas de 8k.

select i.name Indice,used_page_count,row_count
FROM sys.dm_db_partition_stats P INNER JOIN sys.indexes I
ON I.index_id = P.index_id AND I.OBJECT_ID = P.OBJECT_ID
WHERE p.OBJECT_ID = OBJECT_ID('Person.Person')


Até o próximo post,
Landry.

terça-feira, 4 de janeiro de 2011

Auto-incremento com o novo SEQUNCE no SQL Server 2011 Denali – Parte 2

Este artigo foi escrito utilizando o CTP de Novembro/2010 do SQL Server 2011 Denali.

No último post mostrei o SEQUENCE, um novo recurso para auto-incremento no SQL Server code named “Denali” (Auto-incremento com o novo SEQUENCE no SQL Server 2011 Denali – Parte 1). Neste post veremos uma comparação de desempenho entre IDENTITY e SEQUENCE.
Utilizei o script abaixo para comparar o desempenho:

USE master
go
CREATE DATABASE dbTeste
go
ALTER DATABASE dbTeste set recovery simple
go
use dbTeste
go

-- DROP TABLE dbo.tbIdentity
CREATE TABLE dbo.tbIdentity (
PK int not null identity(1,1) primary key,
Nome varchar(50) not null)
go

-- DROP SEQUENCE Contador
CREATE SEQUENCE Contador AS int
MINVALUE 1 NO MAXVALUE START WITH 1;
go

-- DROP TABLE dbo.tbSequence
CREATE TABLE dbo.tbSequence (
PK int not null DEFAULT NEXT VALUE FOR Contador primary key,
Nome varchar(50) not null)
go


-- Inclui 1 milhão de linhas na tabela com IDENTITY
DBCC DROPCLEANBUFFERS
go
declare @Nome varchar(50), @i int = 1
while @i <= 1000000 BEGIN set @Nome = 'Nome ' + LTRIM(str(@i)) INSERT dbo.tbIdentity (Nome) values (@Nome) set @i = @i + 1 END go -- Inclui 1 milhão de linhas na tabela com SEQUENCE
DBCC DROPCLEANBUFFERS
go
declare @Nome varchar(50), @i int = 1
while @i <= 1000000 BEGIN set @Nome = 'Nome ' + LTRIM(str(@i)) INSERT dbo.tbSequence (Nome) values (@Nome) set @i = @i + 1 END go


Para garantir uma comparação sem interferência do cachê, utilizei o comando DBCC DROPCLEANBUFFERS entre as execuções, pois esta instrução limpa o cache do servidor. Veja o resultado no gráfico abaixo:


Em todos os testes que fiz encontrei uma pequena diferença de desempenho na inclusão de um grande volume de linhas, na inclusão de poucas linhas não observei diferença no desempenho.

Até o próximo post,
Landry
Saudações tricolores: Fluzão Tri-Campeão Brasileiro!

quarta-feira, 1 de dezembro de 2010

Auto-incremento com o novo SEQUNCE no SQL Server 2011 Denali – Parte 1

Este artigo foi escrito utilizando o CTP de Novembro/2010 do SQL Server 2011 Denali.

O SQL Server code named “Denali” trás uma alternativa para a propriedade IDENTITY para o auto-incremento de valores, SEQUENCE. Para criar uma SEQUENCE temos o comando CREATE SEQUENCE, veja:

CREATE SEQUENCE Contador AS int
MINVALUE 1 NO MAXVALUE START WITH 1;

No comando acima foi criada uma SEQUENCE que inicia com o valor 1 e incremento de 1. Para testar execute o script abaixo:

SELECT NEXT VALUE FOR dbo.Contador as ClienteID
UNION ALL SELECT NEXT VALUE FOR dbo.Contador
UNION ALL SELECT NEXT VALUE FOR dbo.Contador

Resultado:

ClienteID
-----------
1
2
3

Para alterar o incremento para 5 basta utilizar o ALTER SEQUENCE e executar o mesmo SELECT acima para testar, veja:

ALTER SEQUENCE dbo.Contador RESTART WITH 1 INCREMENT BY 5;

SELECT NEXT VALUE FOR dbo.Contador as ClienteID
UNION ALL SELECT NEXT VALUE FOR dbo.Contador
UNION ALL SELECT NEXT VALUE FOR dbo.Contador

Resultado:

ClienteID
-----------
1
6
11

O SEQUENCE possui o mesmo comportamento do IDENTITY com relação a "gaps" na sequência de números gerados, no caso de ROLLBACK de uma transação, veja no exemplo abaixo:

ALTER SEQUENCE dbo.Contador RESTART WITH 1 INCREMENT BY 1;

BEGIN TRAN
SELECT NEXT VALUE FOR dbo.Contador as ProximoID;
ROLLBACK
SELECT ProximoID = NEXT VALUE FOR dbo.Contador;

O primeiro SELECT retorna 1 e o segundo 2, mesmo ocorrendo um ROLLBACK após o primeiro SELECT!

Quando utilizamos o IDENTITY temos a função IDENT_CURRENT() para retornar o valor corrente do IDENTITY em uma tabela, com o SEQUENCE execute o SELECT abaixo:

SELECT current_value FROM sys.sequences WHERE name = 'Contador'

Utilizar o SEQUENCE para gerar números seqüenciais automaticamente em uma tabela é muito simples veja:

CREATE SEQUENCE dbo.SEQ_Clientes AS int
MINVALUE 1 NO MAXVALUE START WITH 1;

CREATE TABLE dbo.Clientes
(ClienteID int not null DEFAULT NEXT VALUE FOR SEQ_Clientes,
Nome varchar(50) not null)
go
INSERT dbo.Clientes (Nome) VALUES ('Jose')
INSERT dbo.Clientes (Nome) VALUES ('Ana')
INSERT dbo.Clientes (Nome) VALUES ('Maria')

SELECT * FROM dbo.Clientes

Indicações de uso
- A aplicação necessita saber o número antes de o INSERT ocorrer.
- A aplicação precisa compartilhar uma única numeração sequencial entre tabelas.
- Existe a necessidade de obter números seqüenciais (sem gap) para um conjunto de linhas (utilizar a Stored Procedure sp_sequence_get_range).

No próximo post farei uma comparação de desempenho entre IDENTITY e SEQUENCE,
Landry

quarta-feira, 24 de novembro de 2010

SQL Server 2011 cod named Denali CTP1

Com este post dou início a uma sequência de posts sobre a nova versão do Microsoft SQL Server code named “Denali”, que já estão chamando pela Internet de SQL Server 2011.

Segue abaixo link para download do primeiro CTP público:
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6a04f16f-f6be-4f92-9c92-f7e5677d91f9&displaylang=en

O SQL Server Denali possui os seguintes pré-requisitos para instalação (http://msdn.microsoft.com/en-us/library/ms143506(SQL.110).aspx):

- Sistemas Operacionais: Windows 7, Windows Server 2008 R2, Windows Server 2008 SP 2, Windows Vista SP 2.
- .NET Framework 3.5 SP1
- PowerShell 2.0 (http://support.microsoft.com/kb/968929/en-us)

Nos próximos posts irei explorar as novas funcionalidades, aguardem…
Landry

quinta-feira, 5 de agosto de 2010

Importando dados do SSAS utilizando SSIS

Olá... Neste post veremos como importar dados de um Cubo no Analysis Services (SSAS) utilizando o Integration Service (SSIS).

O primeiro passo é criar uma conexão para o SSAS dentro do pacote SSIS como abaixo:


Em seguida clique em “All” (círculo azul da imagem acima) e entre com format=tabular na propriedade Extended Properties, veja na imagem abaixo:


Após configurar a conexão, utilize a tarefa Data Flow Task para extrair os dados do cubo. Importante lembrar que a linguagem utilizada para acessar Cubos é o MDX!


Você irá receber mensagens de advertência, pois o SSIS não consegue identificar os tipos de dados do SSAS, todas as colunas são retornadas como string. Em seguida utilize a transformação Data Conversion para converter os tipos de dados.
Outro problema é o Warning (símbolo de exclamação) no OLE DB Source, devido ao problema de não se identificar os tipos de dados no SSAS. Para retirar o Warning basta alterar a propriedade ValidateExternalMetadata para True.


Até o próximo post,
Landry

sexta-feira, 7 de maio de 2010

Clone de Banco de Dados para analisar plano de execução

Versões do SQL Server: 2005 e 2008.

Olá... o post de hoje é muito útil para quem trabalha com tuning de consultas, principalmente consultores!

Você é um consultor e precisa melhorar o desempenho de algumas consultas... Você terá que trabalhar no cliente porque este possui um banco de dados de 400GB de informações sigilosas! Bem, fazer Backup e levar para casa (ou escritório) é inviável devido ao tamanho do banco de dados e a necessidade de sigilo das informações. Uma alternativa é fazer um Clone do Banco de Dados levando a estrutura e as estatísticas de banco de dados, sem levar os dados. Um processo muito mais rápido que Backup e Restore, ocupa menos espaço em disco e resolve o problema do sigilo pois não leva os dados.

Para fazer um clone do Banco de dados basta entrar no Management Studio (SSMS), conectar na instância que contém o banco, expandir “Databases”, clicar com o botão direito no banco, selecionar “Tasks” e “Generate Scripts”.


Selecione o banco de dados e marque a opção “Script all objects in the selected database” como na figura abaixo:


Na próxima tela “Choose Script Options” altere algumas propriedades utilizando a tabela abaixo:


Na última tela gere o script para um arquivo qualquer, veja:


O próximo passo é editar o arquivo gerado... No início do arquivo, no comendo CREATE DATABASE altere o parâmetro SIZE do arquivo de dados e log para valores menores, pois não vamos ter os dados neste banco! Se for necessário altere a localização dos arquivos.

Agora basta executar o script (você verá alguns de GRANT para usuários inexistentes). Para conferir as estatísticas execute o DBCC SHOW_STATISTICS (,) para conferir! As tabelas estão vazias, mas as estatísticas refletem os dados da produção!

Pronto agora é só analisar as consultas, pois os planos de execução serão os mesmos da produção!

Até o próximo post,
Landry.