In-Memory a.k.a OLTP “Hekaton” – Deep Dives [2]

Posted on julho 8, 2013

1


Como mostrado no post anterior – https://luanmorenodba.wordpress.com/2013/07/01/in-memory-a-k-a-oltp-hekaton-deep-dives-1/ a criação de um banco de dados no “Hekaton” deve estar em um filegroup especial, filegroup chamado de MEMORY_OPTIMIZED_DATA aonde está armazenado osnarquivos de data e delta que foram explicados detalhadamente no artigo anterior. Após ter criado o banco de dados e entendido a estrutura de armazenamento e criação, iremos agora compreender quais são os requisitos e melhor forma de criação de uma tabela, entender a criação da mesma e suas opções, suas limitações, tipos suportados, carga de dado, gerenciamento de espaço dentro da tabela e considerações finais.

 

GuideLine para Criação de Tabelas

Antes de realizarmos a criação das tabelas dentro do “Hekaton” é importante saber a quantidade de memória necessária e de recursos que serão utilizados, um bom guideline para isso é:

·       Quando uma tabela for criada em memória ou migrada do disco é importante possuir 2x o tamanho da tabela para gerenciamento de row versions e inserções.

·       Para a criação de hash index é importante para o cálculo multiplicar a quantidade de bucket_count x a quantidade do pointer_size.

·       Se necessário realize o gerenciamento pelo Resource Governor que está totalmente integrado com o “Hekaton”.

·       Por final gerencie as informações pelas DMV’s, iremos ver nos próximos posts.

 

Criação e Tipos de Tabelas

Antes da criação da tabela é necessário entender algumas novas opções do CREATE TABLE para o uso do mesmo. Primeiramente, na criação da tabela é necessário que na mesma seja especificado MEMORY_OPTIMIZED = ON, forma para que seja reconhecido que a mesma estará In-Memory e será gerenciado pelo “Hekaton”.  Além dessa opção há a opção DURABILITY que pode ser:

 

SCHEMA_ONLY = Quando especificado dessa forma, significa que mudanças nessa tabela não são logados com iss não são persistidas em disco, o que é persistido é somente os metadados da tabela ou seja a estrutura, quando o serviço do SQL Server for reiniciado só estará nessa tabela os metadados.

 

SCHEMA_AND_DATA = Quando especificado dessa forma os dados são persistidos em discos nos arquivos de DATA e DELTA.

 

Como dito e explicado enteriormente, todas as tabelas dentro do “Hekaton”devem possuir uma PRIMARY KEY com exceção das tabelas que forem criadas somente em SCHEMA_ONLY. Agora como já entendemos todos os requisitos para a criação de uma tabela iremos aqui criá-la.

 

USE InMemoryDB

go

 

CREATE TABLE VendasProduto

(

               ID INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1024),

               GUIDIDProduto UNIQUEIDENTIFIER NOT NULL,

               Nome VARCHAR(50),

               TipoProduto VARCHAR(50) NOT NULL,

               ValorProduto DECIMAL(12,2) NOT NULL,

               Quantidade INT NOT NULL,

               QtdEstoque INT,

               DataCadastro DATETIME NOT NULL,

               DataValidade DATETIME NOT NULL,

               UsrCadastro VARCHAR(30) NOT NULL

) WITH (MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA);

 

Com isso realizamos a criação da tabela em memória. Agora iremos inserir valores dentro dessa tabela.

 

SELECT ProductKey, NEWID() AS GUIDIDProduto, EnglishProductName, ‘AdvWorks’ AS TipoProduto, ListPrice, 3 AS A, 5 AS B, GETDATE() AS C, GETDATE()+1 AS D, ‘Administrator’ AS UsrDados

INTO InMemoryDB.dbo.DadosInsert

FROM AdventureWorksDw2012.dbo.DimProduct

 

INSERT INTO VendasProduto (ID, GUIDIDProduto, Nome, TipoProduto, ValorProduto, Quantidade, QtdEstoque, DataCadastro, DataValidade, UsrCadastro)

SELECT ProductKey, NEWID(), EnglishProductName, ‘AdvWorks’, ListPrice, 3, 5, GETDATE(), GETDATE()+1, ‘Administrator’

FROM InMemoryDB.dbo.DadosInsert

 

SELECT *

FROM VendasProduto

 

clip_image002

(Figura 1 – Registros In-Memory.)

Agora somente para exemplificação, se realizarmos a reinicialização do serviço do SQLServer veremos que quando selecionarmos novamente a tabela a mesma quantidade de registros estara presente, isso porque durante a criação dessa tabela especificamos SCHEMA_AND_DATA.

 clip_image004

 

SELECT *

FROM VendasProduto

 

clip_image005

(Figura 2 – Após serviço reinicializado os registros estão em memória.)

Uma ótima forma de gerenciar o tamanho das tabela no “Hekaton” é utilizar o novo relatório de instância chamado de – Memory Usage By Memory Optimized Objects para isso botão direito no banco de dados – reports – standard reports.

clip_image007

(Figura 3 – Divisão de armazenamento da tabela em memória.)

 

Se realizarmos a inserção de mais registros veremos que o relatório apresenta modificações

BEGIN TRANSACTION

 

DECLARE @IDInsert INT

SET @IDInsert = 607

WHILE @IDInsert < 100000

BEGIN

 

               SET @IDInsert = @IDInsert + 1

               SET NOCOUNT ON;

              

               INSERT INTO VendasProduto (ID, GUIDIDProduto, Nome, TipoProduto, ValorProduto, Quantidade, QtdEstoque, DataCadastro, DataValidade, UsrCadastro)

               SELECT TOP 1 @IDInsert, NEWID(), EnglishProductName, ‘AdvWorks’, ListPrice, 3, 5, GETDATE(), GETDATE()+1, ‘Administrator’

               FROM InMemoryDB.dbo.DadosInsert

               ORDER BY NEWID()

 

END

 

COMMIT TRANSACTION

 

SELECT *

FROM VendasProduto

clip_image009

(Figura 4 – Divisão de armazenamento da tabela em memória após mais inserções de registros.)

 

Tipos Não Suportados

Alguns tipos não são suportados no CTP1 que são:

·       Não possível a criação de DML Triggers

·       Sem Foreign Key (Chave Estrangeira) ou Check constraint

·       Identity column não é suportado ou seja é necessário tratar isso fora do “Hekaton”

·       Sem unique keys a não ser o do Primary Key

·       Quantidade máxima de índices em memória 8 incluíndo primary key

 

Limitações

Há algumas limitações no CTP1 que são:

·       TRUCANTE TABLE

·       MERGE

·       Cursor

·       Consulta chamando outro banco de dados

·       Linked Server

·       Hints como: TABLOCK, XLOCK, PAGLOCK, NOLOCK, READUNCOMMITED, READCOMMITED não são suportados

 

Vimos como realizamos a criação e gerenciamento de tabelas dentro do “Hekaton” no nosso próximo post veremos coisas interessantes sobre esse recurso.