Identity e Sequence no Hekaton

Posted on dezembro 7, 2013

1


Em uma tabela em disco no SQL Server quando necessitamos realizar a criação de um campo auto incrementável utilizamos o Identity. A partir do SQL Server 2012 um novo recurso chamado SEQUENCE foi implementado na engine para trabalhar com valores incrementais, o SEQUENCE é um objeto e pode ser utilizando por várias tabelas. Porém quando estamos trabalhando com tabelas em memória (Hekaton) não é possível utilizar identity ou seja, todas as inserções em campos ID por exemplo devem ser realizados de forma manual. Iremos entender como trabalharmos de forma eficiente quando for necessário a inserção de registros incrementáveis em memória.

Iremos primeiramente tentar realizar a criação de uma tabela em memória com IDENTITY.

USE AdventureWorks

GO

 

 

CREATE TABLE dbo.ProdutosInMemory

(

       [ID] INT IDENTITY(1,1) NOT NULL  PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000),

       [CodigoAtendimento] INT NOT NULL,

       [Nome] VARCHAR(200) COLLATE Latin1_General_100_BIN2 INDEX idxNome HASH WITH (BUCKET_COUNT = 1000000) NOT NULL,

       [Arquivado] BIT NOT NULL

)

WITH

(

       MEMORY_OPTIMIZED = ON,

       DURABILITY = SCHEMA_AND_DATA

);

–Msg 10794, Level 16, State 8, Line 15
–The feature ‘IDENTITY’ is not supported with memory optimized tables.

 

O erro apresentado é totalmente claro, não é possível realizar a criação da tabela porque o IDENTITY não é suportado para tabelas em memória. Iremos agora tentar com o SEQUENCE, primeiro iremos criar o SEQUENCE e logo após iremos realizar o vínculo com um tabela em memória.

 

USE AdventureWorks

go

 

CREATE SEQUENCE DadosSEQUENCE

       START WITH 1

       INCREMENT BY 1 ;

GO

CREATE TABLE dbo.ProdutosInMemory

(

       [IDSEQUENCE] INT DEFAULT(NEXT VALUE FOR DadosSEQUENCE) NOT NULL  PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000),

       [CodigoAtendimento] INT NOT NULL,

       [Nome] VARCHAR(200) COLLATE Latin1_General_100_BIN2 INDEX idxNome HASH WITH (BUCKET_COUNT = 1000000) NOT NULL,

       [Arquivado] BIT NOT NULL

)

WITH

(

       MEMORY_OPTIMIZED = ON,

       DURABILITY = SCHEMA_AND_DATA

);

 

–Msg 10794, Level 16, State 69, Line 42
–The operator ‘NEXT VALUE FOR’ is not supported with memory optimized tables.

 

Novamente o erro apresentado é bem claro, não é possível a utilização do operador NEXT VALUE FOR em tabelas em memória. Com isso todas as alternativas estão esgotadas ? Na verdade não, existe uma outra forma de chamar o SEQUENCE, iremos tentar na hora de um INSERT na tabela e veremos que…

CREATE TABLE dbo.ProdutosInMemory

(

       [IDSEQUENCE] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000),

       [CodigoAtendimento] INT NOT NULL,

       [Nome] VARCHAR(200) COLLATE Latin1_General_100_BIN2 INDEX idxNome HASH WITH (BUCKET_COUNT = 1000000) NOT NULL,

       [Arquivado] BIT NOT NULL

)

WITH

(

       MEMORY_OPTIMIZED = ON,

       DURABILITY = SCHEMA_AND_DATA

);

 

Realizando a inserção dos dados na tabela criada em memória.

INSERT INTO dbo.ProdutosInMemory ([IDSEQUENCE], CodigoAtendimento, Nome, Arquivado)

VALUES (NEXT VALUE FOR DadosSEQUENCE,100,‘SQLServer’,0)

 

INSERT INTO dbo.ProdutosInMemory ([IDSEQUENCE], CodigoAtendimento, Nome, Arquivado)

VALUES (NEXT VALUE FOR DadosSEQUENCE,200,‘SQLServerSSIS’,0)

INSERT INTO dbo.ProdutosInMemory ([IDSEQUENCE], CodigoAtendimento, Nome, Arquivado)

VALUES (NEXT VALUE FOR DadosSEQUENCE,300,‘SQLServerSSAS’,1)

SELECT *

FROM dbo.ProdutosInMemory

image

(Figura 1 – Dados inseridos na tabela em memória.)

 

Com esse recurso NEXT VALUE FOR NomeSequence no INSERT é possível realizar a inserção dos registros incrementais sem ser necessário que o mesmo seja tratado fora no SQL Server.