Общие сведения и сценарии использованияOverview and Usage Scenarios

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Выполняющаяся в памяти OLTP — первоклассная технология, доступная в SQL ServerSQL Server и База данных SQLSQL Database и предназначенная для оптимизации производительности обработки транзакций, приема и загрузки данных, а также сценариев с временными данными.In-Memory OLTP is the premier technology available in SQL ServerSQL Server and База данных SQLSQL Database for optimizing performance of transaction processing, data ingestion, data load, and transient data scenarios. В этой статье содержатся общие сведения о выполняющейся в памяти OLTP и описываются сценарии использования этой технологии.This article includes an overview of the technology and outlines usage scenarios for In-Memory OLTP. Эти сведения помогут вам выяснить, подходит ли вашему приложению эта технология.Use this information to determine whether In-Memory OLTP is right for your application. В конце этой статьи приведен пример, демонстрирующий объекты выполняющейся в памяти OLTP, ссылка на демонстрацию производительности, а также ссылки на ресурсы, которые можно использовать в следующих шагах.The article concludes with an example that shows In-Memory OLTP objects, reference to a perf demo, and references to resources you can use for next steps.

В этой статье описывается технология выполняющейся в памяти OLTP, используемая для SQL ServerSQL Server и База данных SQLSQL Database.This article covers the In-Memory OLTP technology in both SQL ServerSQL Server and База данных SQLSQL Database. В следующей записи блога подробно рассматриваются вопросы производительности и преимущества использования ресурсов в База данных SQLSQL Database: Выполняющаяся в памяти OLTP в базе данных Azure SQLThe following blog post contains a deep dive into the performance and resource utilization benefits in База данных SQLSQL Database: In-Memory OLTP in Azure SQL Database

Общие сведения о выполняющейся в памяти OLTPIn-Memory OLTP Overview

Выполняющаяся в памяти OLTP может существенно повысить производительность соответствующих рабочих нагрузок.In-Memory OLTP can provide great performance gains, for the right workloads. Одному клиенту, BWIN, удалось повысить производительность до 1,2 млн запросов в секунду, используя выполняющуюся в памяти OLTP в одной виртуальной машине с SQL Server 2016 (13.x);SQL Server 2016 (13.x).One customer, BWIN, managed to achieve 1.2 Million requests per second with a single machine running SQL Server 2016 (13.x);SQL Server 2016 (13.x), leveraging In-Memory OLTP. Другой клиент, Quorum, удвоил рабочую нагрузку и сократил использование ресурсов на 70 %, применяя выполняющуюся в памяти OLTP в База данных SQLSQL Database.Another customer, Quorum, managed to double their workload while reducing their resource utilization by 70%, by leveraging In-Memory OLTP in База данных SQLSQL Database. В некоторых случаях производительность у клиентов повышалась в 30 раз, но каков будет ваш прирост, зависит от типа и величины рабочей нагрузки.While customers have seen up to 30X performance gain in some cases, how much gain you see depends on the workload.

Что же влияет на прирост производительности?Now, where does this performance gain come from? По сути, выполняющаяся в памяти OLTP позволяет повысить производительность обработки транзакций путем оптимизации доступа к данным и выполнения транзакций, а также за счет устранения конфликтов блокировок и кратковременных блокировок между параллельно выполняемыми транзакциями: производительность повышается не из-за того, что данные находятся в памяти, а из-за оптимизации этих данных.In essence, In-Memory OLTP improves performance of transaction processing by making data access and transaction execution more efficient, and by removing lock and latch contention between concurrently executing transactions: it is not fast because it is in-memory; it is fast because it is optimized around the data being in-memory. Алгоритмы хранения и обработки данных, а также доступа к ним были полностью изменены с учетом последних улучшений в вычислениях в памяти и вычислениях с высоким уровнем параллелизма.Data storage, access, and processing algorithms were redesigned from the ground up to take advantage of the latest enhancements in in-memory and high concurrency computing.

Теперь при сбое данные не будут утеряны только из-за того, что они находятся в памяти.Now, just because data lives in-memory does not mean you lose it when there is a failure. По умолчанию все транзакции являются полностью устойчивыми. Таким образом обеспечивается такой же уровень надежности, что и для любой таблицы в SQL ServerSQL Server. В ходе фиксации транзакции все изменения записываются в журнал транзакций на диске.By default, all transactions are fully durable, meaning that you have the same durability guarantees you get for any other table in SQL ServerSQL Server: as part of transaction commit, all changes are written to the transaction log on disk. В случае сбоя в любое время после фиксации транзакции данные не будут утеряны при переходе базы данных в оперативный режим.If there is a failure at any time after the transaction commits, your data is there when the database comes back online. Кроме того, выполняющаяся в памяти OLTP поддерживает все возможности обеспечения высокой доступности и аварийного восстановления SQL ServerSQL Server, такие как AlwaysOn, резервное копирование, восстановление и т. д.In addition, In-Memory OLTP works with all high availability and disaster recovery capabilities of SQL ServerSQL Server, like Always On, backup/restore, etc.

Чтобы использовать выполняющуюся в памяти OLTP в базе данных, следует применить один или несколько из следующих типов объектов:To leverage In-Memory OLTP in your database, you use one or more of the following types of objects:

  • Таблицы, оптимизированные для памяти , используются для хранения пользовательских данных.Memory-optimized tables are used for storing user data. Объявить таблицу в качестве оптимизированной для памяти можно при ее создании.You declare a table to be memory-optimized at create time.
  • Неустойчивые таблицы используются для временных данных, для кэширования или промежуточных результирующих наборов (вместо традиционных временных таблиц).Non-durable tables are used for transient data, either for caching or for intermediate result set (replacing traditional temp tables). Неустойчивая таблица — это таблица, оптимизированная для памяти и объявленная с помощью DURABILITY=SCHEMA_ONLY. Это означает, что при изменениях в этих таблицах не выполняются операции ввода-вывода.A non-durable table is a memory-optimized table that is declared with DURABILITY=SCHEMA_ONLY, meaning that changes to these tables do not incur any IO. Таким образом можно избежать использования ресурсов ввода-вывода журнала в случаях, когда устойчивость не важна.This avoids consuming log IO resources for cases where durability is not a concern.
  • Табличные типы, оптимизированные для памяти , используются для возвращающих табличные значения параметров, а также для промежуточных результирующих наборов в хранимых процедурах.Memory-optimized table types are used for table-valued parameters (TVPs), as well as intermediate result sets in stored procedures. Их можно использовать вместо традиционных табличных типов.These can be used instead of traditional table types. Табличные переменные и возвращающие табличные значения параметры, которые объявляются с помощью табличных типов, оптимизированных для памяти, получают преимущества неустойчивых таблиц, оптимизированных для памяти: эффективный доступ к данным и отсутствие операций ввода-вывода.Table variables and TVPs that are declared using a memory-optimized table type inherit the benefits of non-durable memory-optimized tables: efficient data access, and no IO.
  • Скомпилированные в собственном коде модули T-SQL позволяют еще больше сократить продолжительность выполнения отдельной транзакции за счет сокращения циклов ЦП, необходимых для обработки операций.Natively compiled T-SQL modules are used to further reduce the time taken for an individual transaction by reducing CPU cycles required to process the operations. Объявить модуль Transact-SQL в качестве скомпилированного в собственном коде можно при его создании.You declare a Transact-SQL module to be natively compiled at create time. Сейчас скомпилированными в машинном коде могут быть следующие модули T-SQL: хранимые процедуры, триггеры и скалярные определяемые пользователем функции.At this time, the following T-SQL modules can be natively compiled: stored procedures, triggers, and scalar user-defined functions.

Выполняющаяся в памяти OLTP встроена в SQL ServerSQL Server и База данных SQLSQL Database.In-Memory OLTP is built into SQL ServerSQL Server and База данных SQLSQL Database. Так как эти объекты похожи на свои традиционные аналоги, чтобы повысить производительность, зачастую достаточно лишь немного изменить базу данных и приложение.And because these objects behave similar to their traditional counterparts, you can often gain performance benefits while making only minimal changes to the database and the application. Кроме того, в одной базе данных можно разместить как оптимизированные для памяти, так и традиционные дисковые таблицы, а также выполнять запросы и к тем, и к другим.Plus, you can have both memory-optimized and traditional disk-based tables in the same database, and run queries across the two. Скрипт Transact-SQL, демонстрирующий пример каждого из этих типов объектов, представлен в конце этой статьи.You find a Transact-SQL script showing an example for each of these types of objects towards the bottom of this article.

Сценарии использования выполняющейся в памяти OLTPUsage Scenarios for In-Memory OLTP

Выполняющаяся в памяти OLTP — это не волшебное средство для повышения производительности. Она подходит не для всех рабочих нагрузок.In-Memory OLTP is not a magic go-fast button, and is not suitable for all workloads. Например, таблицы, оптимизированные для памяти, не снижают загрузку ЦП, если в большинстве запросов выполняется агрегирование в широких диапазонах данных. В этом сценарии могут помочь индексы columnstore.For example, memory-optimized tables don't bring down your CPU utilization if most of the queries are performing aggregation over large ranges of data - Columnstore indexes help with that scenario.

Ниже приведен список сценариев и шаблонов приложений, в которых клиенты успешно использовали выполняющуюся в памяти OLTP.Here is a list of scenarios and application patterns where we have seen customers be successful with In-Memory OLTP.

Обработка транзакций с высокой пропускной способностью и низкой задержкойHigh-throughput and low-latency transaction processing

Именно для этого сценария мы создали выполняющуюся в памяти OLTP: поддержка больших объемов транзакций и обеспечение постоянно низкой задержки для отдельных транзакций.This is the core scenario for which we built In-Memory OLTP: support large volumes of transactions, with consistent low latency for individual transactions.

Общие сценарии рабочей нагрузки включают торговлю финансовыми инструментами, ставки на спортивные мероприятия, мобильные игры и доставку рекламных сообщений.Common workload scenarios are: trading of financial instruments, sports betting, mobile gaming, and ad delivery. Еще один распространенный шаблон — "каталог", который часто считывается и (или) обновляется.Another common pattern we've seen is a "catalog" that is frequently read and/or updated. В качестве примера можно привести большие файлы, распределенные по узлам в кластере. Вы помещаете в каталог расположение каждого сегмента каждого файла в таблице, оптимизированной для памяти.One example is where you have large files, each distributed over a number of cluster nodes, and you catalog the location of each shard of each file in a memory-optimized table.

Рекомендации по реализацииImplementation considerations

Используйте таблицы, оптимизированные для памяти, для основных таблиц транзакций, т. е. для таблиц с транзакциями, которые оказывают самое большое влияние на производительность.Use memory-optimized tables for your core transaction tables, i.e., the tables with the most performance-critical transactions. Используйте скомпилированные в собственном коде хранимые процедуры для оптимизации выполнения логики, связанной с бизнес-транзакциями.Use natively compiled stored procedures to optimize execution of the logic associated with the business transaction. Чем больше логики можно отправить в хранимые процедуры в базе данных, тем больше преимуществ вы получите от выполняющейся в памяти OLTP.The more of the logic you can push down into stored procedures in the database, the more benefit you see from In-Memory OLTP.

Чтобы приступить к работе в имеющемся приложении, сделайте следующее:To get started in an existing application:

  1. Используйте отчет анализа производительности транзакций , чтобы выявить объекты, которые требуется перенести.use the transaction performance analysis report to identify the objects you want to migrate,
  2. Используйте помощников по оптимизации памяти и компиляции в собственном коде для миграции.and use the memory-optimization and native compilation advisors to help with migration.

Клиентские сценарииCustomer Case Studies

Прием данных из разных источников, включая Интернет вещейData ingestion, including IoT (Internet-of-Things)

Выполняющаяся в памяти OLTP удобна, если необходимо принимать большие объемы данных одновременно из разных источников.In-Memory OLTP is good at ingesting large volumes of data from many different sources at the same time. Зачастую лучше всего принимать данные в базу данных SQL ServerSQL Server, так как SQL ServerSQL Server, в отличие от других мест назначения, ускоряет выполнение запросов к данным и позволяет получить ценные сведения в режиме реального времени.And it is often beneficial to ingest data into a SQL ServerSQL Server database compared with other destinations, because SQL ServerSQL Server makes running queries against the data fast, and allows you to get real-time insights.

Распространенные шаблоны применения:Common application patterns are:

  • прием показаний и событий датчиков для вывода уведомлений и исторического анализа;Ingesting sensor readings and events, and allow notifications as well as historical analysis.
  • управление пакетными обновлениями из нескольких источников и максимальное уменьшение влияния на рабочую нагрузку параллельного чтения.Managing batch updates, even from multiple sources, while minimizing the impact on the concurrent read workload.

Рекомендации по реализацииImplementation considerations

Используйте таблицу, оптимизированную для памяти, чтобы принимать данные.Use a memory-optimized table for the data ingestion. Если прием состоит в основном из вставок (а не обновлений), а объем данных, хранимых в выполняющейся в памяти OLTP, играет важную роль, примените одну из следующих рекомендаций:If the ingestion consists mostly of inserts (rather than updates) and In-Memory OLTP storage footprint of the data is a concern, either

  • Используйте задание для регулярной разгрузки пакетов данных в дисковую таблицу с кластеризованным индексом columnstoreс помощью задания, выполняющего операции INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>.Use a job to regularly batch-offload data to a disk-based table with a Clustered Columnstore index, using a job that does INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>; or
  • Используйте временную таблицу, оптимизированную для памяти, для управления статистическими данными. В этом режиме статистические данные находятся на диске, а перемещением данных управляет система.Use a temporal memory-optimized table to manage historical data - in this mode, historical data lives on disk, and data movement is managed by the system.

Репозиторий примеров SQL ServerSQL Server содержит приложение интеллектуальной сетки, которое использует временную таблицу, оптимизированную для памяти, табличный тип, оптимизированный для памяти, и скомпилированную в машинный код хранимую процедуру для повышения скорости приема данных, а также управляет объемом хранилища выполняющейся в памяти OLTP для данных датчиков:The SQL ServerSQL Server samples repository contains a smart grid application that uses a temporal memory-optimized table, a memory-optimized table type, and a natively compiled stored procedure, to speed up data ingestion, while managing the In-Memory OLTP storage footprint of the sensor data:

Клиентские сценарииCustomer Case Studies

Кэширование и состояние сеансаCaching and session state

Благодаря технологии выполняющейся в памяти OLTP среда SQL весьма привлекательна для поддержки состояния сеанса (например, для приложения ASP.NET) и кэширования.The In-Memory OLTP technology makes SQL really attractive for maintaining session state (e.g., for an ASP.NET application) and for caching.

Один из эффективных сценариев — использование выполняющейся в памяти OLTP для поддержки состояния сеанса ASP.NET.ASP.NET session state is a very successful use case for In-Memory OLTP. Работая с SQL ServerSQL Server, одним клиентам почти удалось добиться выполнения 1,2 млн запросов в секунду.With SQL ServerSQL Server, one customer was about to achieve 1.2 Million requests per second. В то же время они начали использовать выполняющуюся в памяти OLTP для кэширования всех приложений среднего уровня на предприятии.In the meantime, they have started using In-Memory OLTP for the caching needs of all mid-tier applications in the enterprise. Сведения. Как компания bwin добилась небывалой производительности и масштаба, используя выполняющуюся в памяти OLTP в SQL Server 2016 (13.x);SQL Server 2016 (13.x)Details: How bwin is using SQL Server 2016 (13.x);SQL Server 2016 (13.x) In-Memory OLTP to achieve unprecedented performance and scale

Рекомендации по реализацииImplementation considerations

Неустойчивые таблицы, оптимизированные для памяти, можно использовать в качестве простого хранилища пар "ключ —значение", сохраняя большие двоичные объекты в столбцах varbinary(max).You can use non-durable memory-optimized tables as a simple key-value store by storing a BLOB in a varbinary(max) column. Кроме того, в SQL ServerSQL Server и База данных SQLSQL Database можно внедрить полуструктурированный кэш с поддержкой JSON.Alternatively, you can implement a semi-structured cache with JSON support in SQL ServerSQL Server and База данных SQLSQL Database. Наконец, можно создать полностью реляционный кэш в неустойчивых таблицах с полной реляционной схемой, включая различные типы и ограничения данных.Finally, you can create a full relational cache through non-durable tables with a full relational schema, including various data types and constraints.

Приступите к работе с оптимизированным для памяти состоянием сеанса ASP.NET, используя скрипты, опубликованные в GitHub, чтобы заменить объекты, которые создал встроенный поставщик состояний сеансов SQL ServerSQL Server: aspnet-session-stateGet started with memory-optimizing ASP.NET session state by leveraging the scripts published on GitHub to replace the objects created by the built-in SQL ServerSQL Server session state provider: aspnet-session-state

Примеры реальных клиентовCustomer case studies

Замена объекта tempdbTempdb object replacement

Используйте неустойчивые таблицы и табличные типы, оптимизированные для памяти, чтобы заменить традиционные структуры на основе TempDB, табличные переменные и возвращающие табличные значения параметры.Leverage non-durable tables and memory-optimized table types to replace your traditional TempDB based structures, such as temporary tables, table variables, and table-valued parameters (TVPs).

Табличные переменные и неустойчивые таблицы, оптимизированные для памяти, обычно уменьшают нагрузку ЦП и полностью ликвидируют операции ввода-вывода журналов по сравнению с традиционными табличными переменными и таблицами #temp.Memory-optimized table variables and non-durable tables typically reduce CPU and completely remove log IO, when compared with traditional table variables and #temp table.

Рекомендации по реализацииImplementation considerations

Чтобы приступить к работе, изучите следующую статью: Улучшение производительности временной таблицы и табличной переменной с помощью оптимизации памяти.To get started see: Improving temp table and table variable performance using memory optimization.

Клиентские сценарииCustomer Case Studies

Извлечение, преобразование и загрузкаETL (Extract Transform Load)

Рабочие процессы извлечения, преобразования и загрузки часто включают загрузку данных в промежуточную таблицу, преобразование данных и их загрузку в итоговые таблицы.ETL workflows often include load of data into a staging table, transformations of the data, and load into the final tables.

Рекомендации по реализацииImplementation considerations

Используйте неустойчивые таблицы, оптимизированные для памяти, для промежуточного хранения данных.Use non-durable memory-optimized tables for the data staging. Они позволяют полностью ликвидировать операции ввода-вывода и обеспечить эффективность доступа.They completely remove all IO, and make data access more efficient.

Чтобы ускорить преобразования в промежуточной таблице, выполняющиеся в ходе рабочего процесса, используйте скомпилированные в собственном коде хранимые процедуры.If you perform transformations on the staging table as part of the workflow, you can use natively compiled stored procedures to speed up these transformations. Если эти преобразования можно выполнять в параллельном режиме, при оптимизации памяти вы получаете дополнительные преимущества масштабирования.If you can do these transformations in parallel you get additional scaling benefits from the memory-optimization.

Образец скриптаSample Script

Прежде чем начать использовать выполняющуюся в памяти OLTP, необходимо создать файловую группу MEMORY_OPTIMIZED_DATA.Before you can start using In-Memory OLTP, you need to create a MEMORY_OPTIMIZED_DATA filegroup. Кроме того, мы рекомендуем использовать уровень совместимости базы данных 130 (или более высокий) и задать для параметра базы данных MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT значение ON.In addition, we recommend using database compatibility level 130 (or higher), and set the database option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT to ON.

С помощью скрипта в следующем расположении можно создать файловую группу в папке данных по умолчанию, а также настроить рекомендуемые параметры:You can use the script at the following location to create the filegroup in the default data folder, and configure the recommended settings:

В следующем скрипте показаны объекты выполняющейся в памяти OLTP, которые можно создать в базе данных.The following script illustrates In-Memory OLTP objects you can create in your database:

-- configure recommended DB option
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
GO
-- memory-optimized table
CREATE TABLE dbo.table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON)
GO
-- non-durable table
CREATE TABLE dbo.temp_table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON,
      DURABILITY=SCHEMA_ONLY)
GO
-- memory-optimized table type
CREATE TYPE dbo.tt_table1 AS TABLE
( c1 INT IDENTITY,
  c2 NVARCHAR(MAX),
  is_transient BIT NOT NULL DEFAULT (0),
  INDEX ix_c1 HASH (c1) WITH (BUCKET_COUNT=1024))
WITH (MEMORY_OPTIMIZED=ON)
GO
-- natively compiled stored procedure
CREATE PROCEDURE dbo.usp_ingest_table1
  @table1 dbo.tt_table1 READONLY
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC
    WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT,
          LANGUAGE=N'us_english')

  DECLARE @i INT = 1

  WHILE @i > 0
  BEGIN
    INSERT dbo.table1
    SELECT c2
    FROM @table1
    WHERE c1 = @i AND is_transient=0

    IF @@ROWCOUNT > 0
      SET @i += 1
    ELSE
    BEGIN
      INSERT dbo.temp_table1
      SELECT c2
      FROM @table1
      WHERE c1 = @i AND is_transient=1

      IF @@ROWCOUNT > 0
        SET @i += 1
      ELSE
        SET @i = 0
    END
  END

END
GO
-- sample execution of the proc
DECLARE @table1 dbo.tt_table1
INSERT @table1 (c2, is_transient) VALUES (N'sample durable', 0)
INSERT @table1 (c2, is_transient) VALUES (N'sample non-durable', 1)
EXECUTE dbo.usp_ingest_table1 @table1=@table1
SELECT c1, c2 from dbo.table1
SELECT c1, c2 from dbo.temp_table1
GO

Ресурсы с дополнительными сведениямиResources to learn more