Pesquisa de áreas iniciais em OLTP in-memorySurvey of Initial Areas in In-Memory OLTP

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Este artigo é para o desenvolvedor que está com pressa para aprender os fundamentos dos recursos de desempenho do OLTP in-memory do Microsoft SQL Server e do Banco de Dados SQL do Azure.This article is for the developer who is in a hurry to learn the basics of the In-Memory OLTP performance features of Microsoft SQL Server and Azure SQL Database.

Para o OLTP in-memory, este artigo fornece o seguinte:For In-Memory OLTP, this article provides the following:

  • Explicações rápidas dos recursos.Quick explanations of the features.
  • Exemplos do código principal que implementam os recursos.Core code samples that implement the features.

O SQL Server e o Banco de dados SQL têm apenas pequenas variações no suporte de tecnologia in-memory.SQL Server and SQL Database have only minor variations in their support of In-Memory technologies.

No mundo real, os blogueiros se referem ao OLTP in-memory como Hekaton.In the wild some bloggers refer to the In-Memory OLTP as Hekaton.

Benefícios dos recursos In-MemoryBenefits of In-Memory Features

O SQL Server fornece recursos In-Memory que podem melhorar muito o desempenho de vários sistemas de aplicativos.SQL Server provides In-Memory features that can greatly improve the performance of many application systems. As considerações mais simples estão descritas nesta seção.The most straight forward considerations are described in this section.

Recursos para OLTP (Processamento de Transações Online)Features for OLTP (Online Transactional Processing)

Sistemas que devem processar grandes números de INSERTs do SQL simultaneamente são excelentes candidatos para recursos do OLTP.Systems which must processes large numbers of SQL INSERTs concurrently are excellent candidates for the OLTP features.

  • Nossos parâmetros de comparação mostram que é possível obter melhorias de velocidade de 5 a 20 vezes mais rápidas pela adoção de recursos In-Memory.Our benchmarks show that speed improvements from 5 times to 20 times faster are achievable by adoption of the In-Memory features.

Sistemas que processam cálculos pesados no Transact-SQL são excelentes candidatos.Systems which process heavy calculations in Transact-SQL are excellent candidates.

  • Um procedimento armazenado que é dedicado a cálculos pesados pode ser executado até 99 vezes mais rápido.A stored procedure that is dedicated to heavy calculations can run up to 99 times faster.

Posteriormente, você pode visitar os seguintes artigos que oferecem demonstrações de ganhos de desempenho do OLTP in-memory:Later you might visit the following articles which offer demonstrations of performance gains from In-Memory OLTP:

Recursos de análise operacionalFeatures for Operational Analytics

A análise in-memory refere-se aos SELECTs do SQL, que agregam dados transacionais, normalmente pela inclusão de uma cláusula GROUP BY.In-Memory Analytics refers to SQL SELECTs which aggregate transactional data, typically by inclusion of a GROUP BY clause. O tipo de índice chamado columnstore é central para análise operacional.The index type called columnstore is central to operational analytics.

Há dois cenários principais:There are two major scenarios:

  • Análise operacional em lote refere-se aos processos de agregação que são executados após o horário comercial ou no hardware secundário, que tem cópias dos dados transacionais.Batch Operational Analytics refers to aggregation processes that run either after business hours or on secondary hardware which has copies of the transactional data.
  • Análise operacional em tempo real refere-se aos processos de agregação que são executados durante o horário comercial e no hardware principal que é usado para cargas de trabalho transacionais.Real-time Operational Analytics refers to aggregration processes that run during business hours and on the primary hardware which is used for transactional workloads.

O presente artigo se concentra em OLTP e não em Análises.The present article focuses on OLTP, and not on Analytics. Para obter informações sobre como os índices columnstore trazem as Análises para o SQL, confira:For information on how columnstore indexes bring Analytics to SQL, see:

Observação

Um vídeo de dois minutos sobre os recursos In-Memory está disponível no Banco de Dados SQL do Azure - Tecnologias In-Memory.A two minute video about the In-Memory features is available at Azure SQL Database - In-Memory Technologies. O vídeo é de dezembro de 2015.The video is dated December 2015.

columnstoreColumnstore

Uma sequência de postagens de blog excelente explica elegantemente os índices columnstore de várias perspectivas.A sequence of excellent blog posts elegantly explains columnstore indexes from several perspectives. A maioria das postagens descreve o conceito de análise operacional em tempo real, à qual o columnstore dá suporte.The majority of the posts describe further the concept of real-time operational analytics, which columnstore supports. Essas postagens foram criadas por Sunil Agarwal, gerente de programa da Microsoft, em março de 2016.These posts were authored by Sunil Agarwal, a Program Manager at Microsoft, in March 2016.

Análise operacional em tempo realReal-time Operational Analytics

  1. Análise operacional em tempo real usando a tecnologia in-memoryReal-Time Operational Analytics Using In-Memory Technology
  2. Análise operacional em tempo real – Visão geral do NCCI (índice columnstore não clusterizado)Real-Time Operational Analytics - Overview nonclustered columnstore index (NCCI)
  3. Análise Operacional em Tempo Real: Exemplo simples usando NCCI (índice columnstore não clusterizado) no SQL Server 2016Real-Time Operational Analytics: Simple example using nonclustered clustered columnstore index (NCCI) in SQL Server 2016
  4. Análise Operacional em Tempo Real: Operações DML e NCCI (índice columnstore não clusterizado) no SQL Server 2016Real-Time Operational Analytics: DML operations and nonclustered columnstore index (NCCI) in SQL Server 2016
  5. Análise Operacional em Tempo Real: NCCI (índice columnstore não clusterizado) filtradoReal-Time Operational Analytics: Filtered nonclustered columnstore index (NCCI)
  6. Análise Operacional em Tempo Real: Opção de atraso de compactação para NCCI (índice columnstore não clusterizado)Real-Time Operational Analytics: Compression Delay Option for Nonclustered Columnstore Index (NCCI)
  7. Análise Operacional em Tempo Real: Opção de Atraso de Compactação com NCCI e o desempenhoReal-Time Operational Analytics: Compression Delay option with NCCI and the performance
  8. Análise Operacional em Tempo Real: Tabelas com otimização de memória e índice columnstoreReal-Time Operational Analytics: Memory-Optimized Tables and Columnstore Index

Desfragmentar um índice columnstoreDefragment a columnstore index

  1. Desfragmentação de índice columnStore usando o comando REORGANIZEColumnstore Index Defragmentation using REORGANIZE Command
  2. Política de mesclagem do índice columnstore para REORGANIZEColumnstore Index Merge Policy for REORGANIZE

Importação em massa de dadosBulk importation of data

  1. Repositório de coluna clusterizada: carregamento em massaClustered Column Store: Bulk Load
  2. índice columnstore clusterizado: Otimizações de carregamento de dados – registro em log mínimoClustered Columnstore Index: Data Load Optimizations - Minimal Logging
  3. Índice columnstore clusterizado: Otimização de carregamento de dados – importação em massa paralelaClustered columnstore Index: Data Load Optimization - Parallel Bulk Import

Recursos do OLTP in-memoryFeatures of In-Memory OLTP

Vejamos os principais recursos do OLTP in-memory.Let's look at the main features of In-Memory OLTP.

Tabelas com otimização de memóriaMemory-optimized tables

A palavra-chave do T-SQL MEMORY_OPTIMIZED, na instrução CREATE TABLE, é como a tabela é criada para existir na memória ativa em vez de no disco.The T-SQL keyword MEMORY_OPTIMIZED, on the CREATE TABLE statement, is how a table is created to exist in active memory, instead of on disk.

Uma Tabela com otimização de memória tem uma representação de si mesma na memória ativa e na cópia secundária no disco.A Memory-optimized tables has one representation of itself in active memory, and secondary copy on the disk.

  • A cópia em disco é destinada para a recuperação da rotina depois de uma reinicialização após o desligamento do servidor ou do banco de dados.The disk copy is for routine recovery after a shutdown-then-restart of the server or database. Essa dualidade de memória mais disco é completamente oculta para você e para seu código.This memory-plus-disk duality is completely hidden from you and your code.

Módulos compilados nativamenteNatively compiled modules

A palavra-chave do T-SQL NATIVE_COMPILATION, na instrução CREATE PROCEDURE, é como um procedimento armazenado compilado de forma nativa é criado.The T-SQL keyword NATIVE_COMPILATION, on the CREATE PROCEDURE statement, is how a natively compiled stored procedure is created. As instruções T-SQL são compiladas para código de computador no primeiro uso do proc nativo toda vez que o banco de dados é alternado online.The T-SQL statements are compiled to machine code on first use of the native proc each time the database is cycled online. As instruções T-SQL não suportam mais a interpretação lenta de cada instrução.The T-SQL instructions no longer endure slow interpretation of every instruction.

  • Vimos o resultado da compilação nativa em durações que tem de uma a 100 vezes a duração interpretada.We have seen native compilation result in durations that are 1/100th of the interpreted duration.

Um módulo nativo pode fazer referência apenas às tabelas com otimização de memória e não podem fazer referência às tabelas baseadas em disco.A native module can reference memory-optimized tables only, and it cannot reference disk-based tables.

Há três tipos de módulos compilados nativamente:There are three types of natively compiled modules:

Disponibilidade no Banco de Dados SQL do AzureAvailability in Azure SQL Database

O OLTP in-memory e o Columnstore estão disponíveis no banco de dados SQL.In-Memory OLTP and Columnstore are available in Azure SQL Database. Para obter detalhes, veja Otimizar o desempenho usando tecnologias in-memory no banco de dados SQL.For details see Optimize Performance using In-Memory Technologies in SQL Database.

1. Garantir o nível de compatibilidade >= 1301. Ensure compatibility level >= 130

Essa seção inicia uma sequência de sessões numeradas que, juntas, demonstram a sintaxe do Transact-SQL que pode ser usada para implementar recursos do OLTP in-memory.This section begins a sequence of numbered sections that together demonstrate the Transact-SQL syntax you can use to implement In-Memory OLTP features.

Primeiro, é importante que seu banco de dados seja definido para um nível de compatibilidade de pelo menos 130.First, it is important that your database be set to a compatibility level of at least 130. Next é o código do T-SQL para exibir o nível de compatibilidade efetivo para o qual seu banco de dados atual está definido.Next is the T-SQL code to view the current compatibility level that your current database is set to.

SELECT d.compatibility_level
    FROM sys.databases as d
    WHERE d.name = Db_Name();

Next é o código do T-SQL para atualizar o nível, se necessário.Next is the T-SQL code to update the level, if necessary.

ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL = 130;

2. Elevar para o INSTANTÂNEO2. Elevate to SNAPSHOT

Quando uma transação envolve tanto uma tabela baseada em disco quanto uma tabela com otimização de memória, chamamos esse procedimento de transação entre contêineres.When a transaction involves both a disk-based table and a memory-optimized table, we call that a cross-container transaction. Em tal transação, é essencial que a porção com otimização de memória da transação opere no nível de isolamento da transação chamado INSTANTÂNEO.In such a transaction it is essential that the memory-optimized portion of the transaction operate at the transaction isolation level named SNAPSHOT.

Para impor com segurança este nível para as tabelas com otimização de memória em uma transação entre contêineres, altere sua configuração de banco de dados executando o T-SQL a seguir.To reliably enforce this level for memory-optimized tables in a cross-container transaction, alter your database setting by executing the following T-SQL.

ALTER DATABASE CURRENT
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;

3. Criar um GRUPO DE ARQUIVOS otimizado3. Create an optimized FILEGROUP

No Microsoft SQL Server, antes de criar uma tabela com otimização de memória, você deve primeiro criar um grupo de arquivos que você declare como CONTAINS MEMORY_OPTIMIZED_DATA.On Microsoft SQL Server, before you can create a memory-optimized table you must first create a FILEGROUP that you declare CONTAINS MEMORY_OPTIMIZED_DATA. O GRUPO DE ARQUIVOS é atribuído ao seu banco de dados.The FILEGROUP is assigned to your database. Para obter detalhes, confira:For details see:

No Banco de Dados SQL do Azure, você não precisa, e não pode, criar um GRUPO DE ARQUIVOS.On Azure SQL Database, you need not and cannot create such a FILEGROUP.

O exemplo de script T-SQL a seguir habilita um banco de dados para OLTP in-memory e define todas as configurações recomendadas.The following sample T-SQL script enables a database for In-Memory OLTP and configures all recommended settings. Ele funciona com o SQL Server e o Banco de Dados SQL do Azure: enable-in-memory-oltp.sql.It works with both SQL Server and Azure SQL Database: enable-in-memory-oltp.sql.

Observe que nem todos os recursos do SQL Server têm o suporte para os bancos de dados com um grupo de arquivos MEMORY_OPTIMIZED_DATA.Note that not all SQL Server features are supported for databases with a MEMORY_OPTIMIZED_DATA filegroup. Para obter detalhes sobre as limitações, confira: Recursos do SQL Server sem suporte para OLTP na MemóriaFor details on limitations see: Unsupported SQL Server Features for In-Memory OLTP

4. Criar uma tabela com otimização de memória4. Create a memory-optimized table

A palavra-chave fundamental do Transact-SQL é MEMORY_OPTIMIZED.The crucial Transact-SQL keyword is the keyword MEMORY_OPTIMIZED.

CREATE TABLE dbo.SalesOrder
    (
        SalesOrderId   integer   not null   IDENTITY
            PRIMARY KEY NONCLUSTERED,
        CustomerId   integer    not null,
        OrderDate    datetime   not null
    )
        WITH
            (MEMORY_OPTIMIZED = ON,
            DURABILITY = SCHEMA_AND_DATA);

As instruções INSERT e SELECT do Transact-SQL em relação a uma tabela com otimização de memória são as mesmas que para uma tabela normal.Transact-SQL INSERT and SELECT statements against a memory-optimized table are the same as for a regular table.

ALTER TABLE para tabelas com otimização de memóriaALTER TABLE for Memory-Optimized tables

ALTER TABLE...ADD/DROP pode adicionar ou remover uma coluna de uma tabela com otimização de memória ou de um índice.ALTER TABLE...ADD/DROP can add or remove a column from a memory-optimized table, or an index.

  • CREATE INDEX e DROP INDEX não podem ser executados em uma tabela com otimização de memória; em vez disso, use .ALTER TABLE... ADD/DROP INDEX.CREATE INDEX and DROP INDEX cannot be run against a memory-optimized table, use ALTER TABLE ... ADD/DROP INDEX instead.
  • Para obter detalhes, confira Alterando tabelas com otimização de memória.For details see Altering Memory-Optimized Tables.

Planejar suas tabelas com otimização de memóriaPlan your memory-optimized tables and indexes

5. Criar um procedimento armazenado compilado de modo nativo (proc. nativo)5. Create a natively compiled stored procedure (native proc)

A palavra-chave fundamental é NATIVE_COMPILATION.The crucial keyword is NATIVE_COMPILATION.

CREATE PROCEDURE ncspRetrieveLatestSalesOrderIdForCustomerId  
        @_CustomerId   INT  
        WITH  
            NATIVE_COMPILATION,  
            SCHEMABINDING  
    AS  
    BEGIN ATOMIC  
        WITH  
            (TRANSACTION ISOLATION LEVEL = SNAPSHOT,
            LANGUAGE = N'us_english')  
      
        DECLARE @SalesOrderId int, @OrderDate datetime;
      
        SELECT TOP 1  
                @SalesOrderId = s.SalesOrderId,  
                @OrderDate    = s.OrderDate  
            FROM dbo.SalesOrder AS s  
            WHERE s.CustomerId = @_CustomerId  
            ORDER BY s.OrderDate DESC;  
      
        RETURN @SalesOrderId;  
    END;  

A palavra-chave SCHEMABINDING indica que as tabelas referidas no procedimento nativo não podem ser descartadas, a menos que o proc. nativo seja descartado primeiro.The keyword SCHEMABINDING means the tables referenced in the native proc cannot be dropped unless the native proc is dropped first. Para obter detalhes, confira Criando procedimentos armazenados compilados de modo nativo.For details see Creating Natively Compiled Stored Procedures.

Observe que você não precisa criar um procedimento armazenado compilado de modo nativo para acessar uma tabela com otimização de memória.Note that you do not need to create a natively compiled stored procedure to access a memory-optimized table. Você também pode fazer referência a tabelas com otimização de memória dos procedimentos armazenados e lotes ad hoc tradicionais.You can also reference memory-optimized tables from traditional stored procedures and ad hoc batches.

6. Executar o proc. nativo6. Execute the native proc

Preencha a tabela com duas linhas de dados.Populate the table with two rows of data.

INSERT into dbo.SalesOrder  
        ( CustomerId, OrderDate )  
    VALUES  
        ( 42, '2013-01-13 03:35:59' ),
        ( 42, '2015-01-15 15:35:59' );

Uma chamada do tipo EXECUTAR para o procedimento armazenado compilado de modo nativo é reproduzida.An EXECUTE call to the natively compiled stored procedure follows.

DECLARE @LatestSalesOrderId int, @mesg nvarchar(128);
      
EXECUTE @LatestSalesOrderId =  
    ncspRetrieveLatestSalesOrderIdForCustomerId 42;
      
SET @mesg = CONCAT(@LatestSalesOrderId,  
    ' = Latest SalesOrderId, for CustomerId = ', 42);
PRINT @mesg;  
-- Here is the actual PRINT output:  
-- 2 = Latest SalesOrderId, for CustomerId = 42  

Guia para a documentação e próximas etapasGuide to the documentation and next steps

Os exemplos simples anteriores oferecem uma base para aprender os recursos mais avançados do OLTP in-memory.The preceding plain examples give you a foundation for learning the more advanced features of In-Memory OLTP. As seções a seguir são um guia para as considerações especiais que talvez você precise saber e onde você pode conferir os detalhes sobre cada uma.The following sections are a guide to the special considerations you might need to know, and to where you can see the details about each.

Como os recursos do OLTP in-memory funcionam com muito mais rapidez?How In-Memory OLTP features work so much faster

As subseções a seguir descrevem brevemente como os recursos do OLTP in-memory funcionam internamente para fornecer um desempenho aprimorado.The following subsections briefly describe how the In-Memory OLTP features work internally to provide improved performance.

Como as tabelas com otimização de memória têm um desempenho mais rápido?How memory-optimized tables perform faster

Natureza dupla: uma tabela com otimização de memória tem uma natureza dupla: uma representação na memória ativa e a outra no disco rígido.Dual nature: A memory-optimized table has a dual nature: one representation in active memory, and the other on the hard disk. Cada transação está comprometida com ambas as representações da tabela.Each transaction is committed to both representations of the table. As transações operam contra a muito mais rápida representação de memória ativa.Transactions operate against the much faster active memory representation. As tabelas com otimização de memória se beneficiam da maior velocidade da memória ativa em comparação ao disco.Memory-optimized tables benefit from the greater speed of active memory versus the disk. Além disso, a maior agilidade da memória ativa torna prática uma estrutura de tabela mais avançada, que é otimizada para a velocidade.Further, the greater nimbleness of active memory makes practical a more advanced table structure that is optimized for speed. A estrutura avançada também não tem páginas, por isso evita a sobrecarga e a contenção de travas e spinlocks.The advanced structure is also pageless, so it avoids the overhead and contention of latches and spinlocks.

Nenhum bloqueio: a tabela com otimização de memória se baseia em uma abordagem otimista para os objetivos concorrentes de integridade de dados em relação à simultaneidade e alta taxa de transferência.No locks: The memory-optimized table relies on an optimistic approach to the competing goals of data integrity versus concurrency and high throughput. Durante a transação, a tabela não coloca bloqueios em qualquer versão de linhas atualizadas dos dados.During the transaction, the table does not place locks on any version of the updated rows of data. Isso pode reduzir significativamente a contenção em alguns sistemas de alto volume.This can greatly reduce contention in some high volume systems.

Versões de linha: em vez de bloqueios, a tabela com otimização de memória adiciona uma nova versão de uma linha atualizada na tabela em si, não no tempdb.Row versions: Instead of locks, the memory-optimized table adds a new version of an updated row in the table itself, not in tempdb. A linha original é mantida até que a transação seja confirmada.The original row is kept until after the transaction is committed. Durante a transação, outros processos podem ler a versão original da linha.During the transaction, other processes can read the original version of the row.

  • Quando várias versões de uma linha são criadas para uma tabela baseada em disco, as versões de linha são armazenadas temporariamente no tempdb.When multiple versions of a row are created for a disk-based table, row versions are stored temporarily in tempdb.

Menos registro em log: as versões anteriores e posteriores das linhas atualizadas são mantidas na tabela com otimização de memória.Less logging: The before and after versions of the updated rows are held in the memory-optimized table. O par de linhas fornece grande parte das informações que tradicionalmente são gravadas no arquivo de log.The pair of rows provides much of the information that is traditionally written to the log file. Isso permite que o sistema grave menos informações, e com menos frequência, no log.This enables the system to write less information, and less often, to the log. No entanto, a integridade transacional é garantida.Yet transactional integrity is ensured.

Como os proc. nativos têm um desempenho mais rápido?How native procs perform faster

A conversão de um procedimento regular armazenado e interpretado para um procedimento armazenado compilado de modo nativo reduz significativamente o número de instruções a serem realizadas durante o tempo de execução.Converting a regular interpreted stored procedure into a natively compiled stored procedure greatly reduces the number of instructions to execute during run time.

Vantagens e desvantagens dos recursos In-MemoryTrade-offs of In-Memory features

Como é comum na ciência da computação, os ganhos de desempenho fornecidos pelos recursos de memória são uma compensação.As is common in computer science, the performance gains provided by the In-Memory features are a trade-off. Os melhores recursos trazem benefícios que são mais valiosos do que os custos extras do recurso.The better features bring benefits that are more valuable than the extra costs of the feature. Você pode encontrar diretrizes abrangentes sobre as vantagens e desvantagens em:You can find comprehensive guidance about the trade-offs at:

O restante desta seção lista algumas das principais considerações sobre planejamento e vantagens e desvantagens.The rest of this section lists some of the major planning and trade-off considerations.

Vantagens e desvantagens das tabelas com otimização de memóriaTrade-offs of memory-optimized tables

Estimar memória: você deve estimar a quantidade de memória ativa que sua tabela com otimização de memória consumirá.Estimate memory: You must estimate the amount of active memory that your memory-optimized table will consume. Seu sistema de computador deve ter capacidade de memória suficiente para hospedar uma tabela com otimização de memória.Your computer system must have adequate memory capacity to host a memory-optimized table. Para obter detalhes, confira:For details see:

Particionar sua tabela grande: uma forma de atender à demanda de muita memória ativa é dividir a tabela grande em partes na memória, que armazenam as linhas de dados ativas recentes em relação às outras partes do disco que armazenam as linhas herdadas frias (como pedidos de venda que foram totalmente enviados e concluídos).Partition your large table: One way to meet the demand for lots of active memory is to partition your large table into parts in-memory that store hot recent data rows versus other parts on the disk that store cold legacy rows (such as sales orders that have been fully shipped and completed). Esse particionamento é um processo manual de design e implementação.This partitioning is a manual process of design and implementation. Consulte:See:

Vantagens e desvantagens dos proc. nativosTrade-offs of native procs

  • Um procedimento armazenado compilado de modo nativo não pode acessar uma tabela baseada em disco.A natively compiled stored procedure cannot access a disk-based table. Um proc. nativo pode acessar somente as tabelas com otimização de memória.A native proc can access only memory-optimized tables.
  • Quando um processo nativo for executado pela primeira vez depois que o servidor ou o banco de dados tiver sido colocado online novamente, o proc. nativo deverá ser recompilado uma vez.When a native proc runs for its first time after the server or database was most recently brought back online, the native proc must be recompiled one time. Isso causa um atraso antes do proc. nativo começar a ser executado.This causes a delay before the native proc starts to run.

Considerações avançadas das tabelas com otimização de memóriaAdvanced considerations for memory-optimized tables

OsÍndices para as tabelas com otimização de memória são diferentes de algumas maneiras dos índices em tabelas em disco tradicionais.Indexes for Memory-Optimized Tables are different in some ways from indexes on traditional on-disk tables. Os Índices de Hash estão disponíveis apenas em tabelas com otimização de memória.Hash Indexes are available only on memory-optimized tables.

Você deve planejar para garantir que haverá memória ativa suficiente para sua tabela planejada de otimização de memória e seus índices.You must plan to ensure there will be sufficient active memory for your planned memory-optimized table and its indexes. Consulte:See:

Uma tabela com otimização de memória pode ser declarada com DURABILITY = SCHEMA_ONLY:A memory-optimized table can be declared with DURABILITY = SCHEMA_ONLY:

  • Essa sintaxe informa ao sistema para descartar todos os dados da tabela com otimização de memória quando o banco de dados é colocado offline.This syntax tells the system to discard all data from the memory-optimized table when the database is taken offline. Somente a definição da tabela é persistida.Only the table definition is persisted.
  • Quando o banco de dados for colocado online novamente, a tabela com otimização de memória será carregada outra vez na memória ativa, vazia de dados.When the database is brought back online, the memory-optimized table is loaded back into active memory, empty of data.
  • Tabelas SCHEMA_ONLY podem ser uma excelente alternativa às tabelas de #temporary em tempdb, quando vários milhares de linhas estão envolvidos.SCHEMA_ONLY tables can be a superior alternative to #temporary tables in tempdb, when many thousands of rows are involved.

Variáveis de tabela também podem ser declaradas como com otimização de memória.Table variables can also be declared as memory-optimized. Consulte:See:

Considerações avançadas dos módulos compilados de modo nativoAdvanced considerations for natively compiled modules

Os tipos de módulos compilados de modo nativo disponíveis por meio do Transact-SQL são:The types of natively compiled modules available through Transact-SQL are:

Uma UDF (função definida pelo usuário) compilada nativamente é executada muito mais rapidamente do que uma UDF interpretada.A natively compiled user defined function (UDF) runs faster than an interpreted UDF. Aqui estão alguns pontos a considerar com UDFs:Here are some things to consider with UDFs:

  • Quando um T-SQL SELECT usa um UDF, o UDF é sempre chamado uma vez por linha retornada.When a T-SQL SELECT uses a UDF, the UDF is always called once per returned row.
    • As UDFs nunca são executadas de forma embutida, em vez disso, sempre são chamadas.UDFs never run inline, and instead are always called.
    • A diferença compilada será menos significativa do que a sobrecarga de chamadas repetidas inerentes a todas as UDFs.The compiled distinction is less significant than is the overhead of repeated calls that is inherent to all UDFs.
    • Ainda assim, a sobrecarga de chamadas a UDF geralmente é aceitável no nível de prática.Still, the overhead of UDF calls is often acceptable at the practical level.

Para dados de teste e explicação sobre o desempenho dos UDFs nativos, consulte:For test data and explanation about the performance of native UDFs, see:

Guia de documentação das tabelas com otimização de memóriaDocumentation guide for memory-optimized tables

Consulte estes outros links que abordam considerações especiais para tabelas com otimização de memória:Refer to these other articles that discuss special considerations for memory-optimized tables:

Guia de documentação dos proc. nativosDocumentation guide for native procs

O seguinte artigo e seus artigos filho no sumário, explicam os detalhes sobre procedimentos armazenados compilados nativamente.The following article, and its children articles in the table of contents (TOC), explain the details about natively compiled stored procedures.

Aqui estão os artigos que oferecem o código para demonstrar os ganhos de desempenho que você pode obter usando OLTP in-memory:Here are articles that offer code to demonstrate the performance gains you can achieve by using In-Memory OLTP: