Hekaton–Provando sua otimização no TLOG !

Posted on junho 26, 2014

0


Muitas pessoas me perguntam se o mecanismo do In-Memory OLTP – Hekaton é otimizado para a gravação dos registros dentro do arquivo de LOG do SQL Server, bem nesse POST irei mostrar a sua grande otimização. O Hekaton é uma nova engine criada e acoplada dentro do SQL Server. Muitas coisas foram reescritas muitas mesmo, a otimização to TLOG foi um ponto forte para a otimização.

 

Vamos a prova !

 

Primeiramente iremos criar uma tabela em disco e inseir uma quantidade de 500 mil registros e verificar a quantidade de entradas no LOG que a mesma irá registrar. Após isso iremos realizar as mesmas inserções só que dessa vez em uma tabela em memória (in-memory table)

 

–ondsk_table

CREATE TABLE [dbo].[ondsk_Atendimento_tlog]

(

            [ID] [int] NOT NULL PRIMARY KEY,

            [NumeroAtendimento] [varchar](15) NOT NULL,

            [NomePosto] [varchar](50) NOT NULL,

            [StatusPosto] [char](15) NOT NULL,

            [FormaAtendimento] [varchar](40) NOT NULL,

            [BaixaAtendimento] [varchar](80) NOT NULL,

            [StatusAtendimento] [varchar](30) NOT NULL,

            [ValorPagoCliente] [numeric](14, 2) NOT NULL,

            [ValorRecuperadoPosto] [numeric](14, 2) NOT NULL,

            [DataCadastro] [datetime] NOT NULL

)

 

CHECKPOINT

GO

DBCC DROPCLEANBUFFERS

GO

 

Agora iremos salvar o ID da transação para poder capturar essas gravações no LOG

 

DECLARE @xact_id BIGINT

BEGINTRANSACTION

 

INSERT INTO [dbo].[ondsk_Atendimento_tlog] SELECT TOP 500000 * FROM [dbo].[ondsk_DadosAtendimentoClientes]

SELECT @xact_id = transaction_id FROM sys.dm_tran_current_transaction

 

COMMIT

PRINT @xact_id

GO

Agora que possuímos o XACT ID podemos verificar a quantidade de operações realizadas.

;WITH xact_log AS

(

            SELECT

                        [Current LSN] AS LSN,

                        Operation AS [Operação],

                        Context AS Contexto,

                        [Transaction ID], 

                        [Transaction Name], 

                        [Transaction SID],

                        [Transaction Begin],

                        [Begin Time],

                        [End Time],

                        [Log Record],

                        [Minimum LSN],

                        [Checkpoint Begin],

                         [Checkpoint End],

                         Description,

                        [Page ID], 

                        [Dirty Pages] AS dirty_page_number,

                        [New Split Page],

                        [Pages Written],

                        [Lock Information],

                        [Number of Locks]

            FROM

                        sys.fn_dblog(NULL, NULL)

            WHERE [Transaction ID] =(

                                    SELECT TOP (1) [Transaction ID] FROM sys.fn_dblog(NULL, NULL) WHERE [Xact ID] = 955594 –XACTID Capturado

                        )

)

SELECT [Operação], COUNT(*)

FROM xact_log

GROUP BY [Operação]

 

 Screen Shot 2014-06-26 at 11.20.25 AM

(Figura 1 – Nome das operações realizadas e quantidade na tabela em disco.)

LOP_BEGIN_XACT – Início de uma Transação

LOP_COMMIT_XACT – Uma transação COMITADA ou seja persistida no banco de dados

LOP_INSERT_ROWS – Quantidade de inserções realizadas no arquivo de LOG (ldf)

LOP_LOCK_XACT – Quantidade de LOCKS gerados devido a quantidade de inserções

Criando uma tabela In-Memory e inserindo a mesma quantidade de registros.

–inmem_table

CREATE TABLE [dbo].[inmem_Atendimento_tlog]

(

            [ID] [bigint] NOT NULL,

            [NumeroAtendimento] [bigint] NOT NULL,

            [NomePosto] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,

            [StatusPosto] [char](15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,

            [FormaAtendimento] [varchar](40) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,

            [BaixaAtendimento] [varchar](80) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,

            [StatusAtendimento] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,

            [ValorPagoCliente] [numeric](14, 2) NOT NULL,

            [ValorRecuperadoPosto] [numeric](14, 2) NOT NULL,

            [DataCadastro] [datetime] NOT NULL,

 

INDEX [idxNCL_DataCadastro] NONCLUSTERED

(

            [DataCadastro] ASC

),

INDEX [idxNCL_NumeroAtendimento] NONCLUSTERED HASH

(

            [NumeroAtendimento]

)WITH ( BUCKET_COUNT = 1048576),

 PRIMARY KEY NONCLUSTERED HASH

(

            [ID]

)WITH ( BUCKET_COUNT = 1048576)

)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )

 

 

CHECKPOINT

GO

DBCC DROPCLEANBUFFERS

GO

Inserindo os registros no LOG

DECLARE @xact_id BIGINT

BEGINTRANSACTION

 

INSERT INTO [dbo].[inmem_Atendimento_tlog] SELECT TOP 500000 * FROM [dbo].[ondsk_DadosAtendimentoClientes]

SELECT @xact_id = transaction_id FROM sys.dm_tran_current_transaction

 

COMMIT

PRINT @xact_id

GO

Verificando as inserções no TLOG

;WITH xact_log AS

(

            SELECT

                        [Current LSN] AS LSN,

                        Operation AS [Operação],

                        Context AS Contexto,

                        [Transaction ID], 

                        [Transaction Name], 

                        [Transaction SID],

                        [Transaction Begin],

                        [Begin Time],

                        [End Time],

                        [Log Record],

                        [Minimum LSN],

                        [Checkpoint Begin],

                         [Checkpoint End],

                         Description,

                        [Page ID], 

                        [Dirty Pages] AS dirty_page_number,

                        [New Split Page],

                        [Pages Written],

                        [Lock Information],

                        [Number of Locks]

            FROM

                        sys.fn_dblog(NULL, NULL)

            WHERE [Transaction ID] =(

                                    SELECT TOP (1) [Transaction ID] FROM sys.fn_dblog(NULL, NULL) WHERE [Xact ID] = 955594 –XACTID Capturado

                        )

)

SELECT [Operação], COUNT(*)

FROM xact_log

GROUP BY [Operação]

Screen Shot 2014-06-26 at 3.22.51 PM

(Figura 2 – Nome das operações realizadas e quantidade na tabela em memória.)

Assim como podemos ver a quantidade de inserções realizada em memória é muito menor do que a quantidade realizada em disco.

Em Disco – 500.000

Em Memória – 3.043

 

Provado agora que o Hekaton realmente está otimizado também para a escrita no arquivo de log.