Mostrando postagens com marcador SQL Server cod named Denali. Mostrar todas as postagens
Mostrando postagens com marcador SQL Server cod named Denali. Mostrar todas as postagens

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.tbIdentityCREATE TABLE dbo.tbIdentity (
PK int not null identity(1,1) primary key,
Nome varchar(50) not null)
go

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

-- DROP TABLE dbo.tbSequenceCREATE 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 IDENTITYDBCC 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 SEQUENCEDBCC 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,
LandrySaudaçõ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