Общие сведения о In-Memory OLTP и вариантах использования

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

In-Memory OLTP — это ключевая технология, доступная в SQL Server и SQL Database для оптимизации производительности при обработке транзакций, приёме данных, загрузке данных и в сценариях с временными данными. В этой статье содержатся общие сведения о выполняющейся в памяти OLTP и описываются сценарии использования этой технологии. Используйте эти сведения, чтобы определить, подходит ли In-Memory OLTP для вашего приложения. Статья завершается примером, в котором показаны объекты In-Memory OLTP, приводится ссылка на демонстрацию производительности, а также ссылки на ресурсы, которые можно использовать для дальнейших действий.

Обзор OLTP в оперативной памяти

Выполняющаяся в памяти OLTP может существенно повысить производительность соответствующих рабочих нагрузок. Хотя в некоторых случаях клиенты наблюдали прирост производительности до 30 раз, какой именно прирост будет у вас, зависит от рабочей нагрузки.

Что же влияет на прирост производительности? По сути, технология In-Memory OLTP повышает производительность обработки транзакций за счет более эффективного доступа к данным и выполнения транзакций, а также за счет устранения конкуренции за блокировки и защелки между одновременно выполняемыми транзакциями. In-Memory OLTP работает быстро не потому, что использует память, а благодаря оптимизации работы с данными в памяти. Алгоритмы хранения и обработки данных, а также доступа к ним были полностью изменены с учетом последних улучшений в вычислениях в памяти и вычислениях с высоким уровнем параллелизма.

Теперь только потому, что данные находятся в памяти, не означает, что вы теряете его при сбое. По умолчанию все транзакции полностью устойчивы, что означает, что у вас есть одинаковые гарантии устойчивости для любой другой таблицы в SQL Server: в рамках фиксации транзакций все изменения записываются в журнал транзакций на диске. Если в любой момент после фиксации транзакции произойдёт сбой, ваши данные сохранятся и будут доступны, когда база данных снова заработает. Кроме того, In-Memory OLTP поддерживает все возможности SQL Server для высокой доступности и аварийного восстановления, такие как группы доступности, экземпляры отказоустойчивого кластера, резервное копирование/восстановление и т. д.

Чтобы использовать OLTP в памяти в базе данных, используйте один или несколько следующих типов объектов:

  • Таблицы, оптимизированные для памяти , используются для хранения пользовательских данных. Объявить таблицу в качестве оптимизированной для памяти можно при ее создании.
  • Неустойчивые таблицы используются для временных данных, для кэширования или промежуточных результирующих наборов (вместо традиционных временных таблиц). Недолговечная таблица — это таблица, оптимизированная для памяти, которая объявлена с параметром DURABILITY=SCHEMA_ONLY, что означает, что изменения в этих таблицах не приводят ни к каким операциям ввода-вывода. Это позволяет избежать расходования ресурсов ввода-вывода журнала в случаях, когда гарантии сохранности данных не важны.
  • Типы таблиц, оптимизированные для памяти, используются для параметров с табличным значением (TVPs) и промежуточных результирующих наборов в хранимых процедурах. Типы таблиц, оптимизированные для памяти, можно использовать вместо традиционных типов таблиц. Табличные переменные и табличнозначные параметры (TVP), объявленные с использованием типа таблицы, оптимизированного для памяти, наследуют преимущества недолговечных таблиц, оптимизированных для памяти: эффективный доступ к данным и отсутствие операций ввода-вывода.
  • Скомпилированные в собственном коде модули T-SQL позволяют еще больше сократить продолжительность выполнения отдельной транзакции за счет сокращения циклов ЦП, необходимых для обработки операций. Объявить модуль Transact-SQL в качестве скомпилированного в собственном коде можно при его создании. Сейчас скомпилированными в машинном коде могут быть следующие модули T-SQL: хранимые процедуры, триггеры и скалярные определяемые пользователем функции.

In-Memory OLTP встроена в SQL Server и SQL Database. Так как эти объекты ведут себя аналогично традиционным аналогам, часто можно получить преимущества производительности, делая только минимальные изменения в базе данных и приложении. Кроме того, в одной базе данных можно разместить как оптимизированные для памяти, так и традиционные дисковые таблицы, а также выполнять запросы и к тем, и к другим. См. пример скрипта Transact-SQL для каждого из этих типов объектов далее в этой статье.

Сценарии использования In-Memory OLTP

In-Memory OLTP — это не волшебная кнопка для мгновенного ускорения, и эта технология подходит не для всех нагрузок. Например, таблицы, оптимизированные для памяти, не снижают загрузку ЦП, если в большинстве запросов выполняется агрегирование широких диапазонах данных. В таком сценарии помогают индексы хранилища столбцов.

Внимание

Известная проблема: для баз данных с оптимизированными для памяти таблицами, выполнение резервного копирования журналов транзакций без восстановления и последующее восстановление журнала транзакций с восстановлением может привести к неответственному процессу восстановления базы данных. Эта проблема также может повлиять на функции доставки журналов. Чтобы обойти эту проблему, экземпляр SQL Server можно перезапустить перед началом процесса восстановления.

Ниже приведен список сценариев и шаблонов приложений, в которых, как показывает наш опыт, клиенты успешно используют In-Memory OLTP.

Обработка транзакций с высокой пропускной способностью и низкой задержкой

Именно для этого сценария мы создали выполняющуюся в памяти OLTP: поддержка больших объемов транзакций и обеспечение постоянно низкой задержки для отдельных транзакций.

Общие сценарии рабочей нагрузки включают торговлю финансовыми инструментами, ставки на спортивные мероприятия, мобильные игры и доставку рекламных сообщений. Другой распространенный шаблон — это "каталог", который часто считывается и (или) обновляется. В качестве примера можно привести большие файлы, распределенные по нескольким узлам в кластере. Вы помещаете в каталог расположение каждого сегмента каждого файла в таблице, оптимизированной для памяти.

Вопросы реализации

Используйте таблицы, оптимизированные для памяти, для основных таблиц транзакций, т. е. для таблиц с транзакциями, которые оказывают самое большое влияние на производительность. Используйте скомпилированные в собственном коде хранимые процедуры для оптимизации выполнения логики, связанной с бизнес-транзакциями. Чем большую часть логики удаётся перенести в хранимые процедуры базы данных, тем больше преимуществ вы получите от In-Memory OLTP.

Чтобы приступить к работе в имеющемся приложении, сделайте следующее:

  1. Используйте отчет анализа производительности транзакций, чтобы определить объекты для переноса.
  2. Используйте помощник по оптимизации памяти и помощник по собственной компиляции, чтобы помочь в миграции.

Прием данных из разных источников, включая Интернет вещей

Выполняющаяся в памяти OLTP удобна, если необходимо принимать большие объемы данных одновременно из разных источников. И часто бывает полезно загружать данные в базу данных SQL Server, а не в другие целевые системы, поскольку SQL Server обеспечивает быстрое выполнение запросов к данным и позволяет получать аналитические выводы в режиме реального времени.

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

  • Приём показаний и событий датчиков с возможностью отправки уведомлений, а также исторического анализа.
  • Управление пакетными обновлениями, даже из нескольких источников, при этом сводя к минимуму влияние на параллельную нагрузку на чтение.

Вопросы реализации

Используйте оптимизированную для памяти таблицу для приема данных. Если загрузка данных состоит в основном из вставок (а не обновлений) и объём памяти, занимаемый данными в In-Memory OLTP, имеет значение, то либо

Репозиторий примеров SQL Server содержит приложение для интеллектуальной энергосистемы, в котором используются темпоральная таблица, оптимизированная для памяти, тип таблицы, оптимизированный для памяти, и хранимая процедура, скомпилированная в машинный код, чтобы ускорить загрузку данных, одновременно управляя объёмом хранилища In-Memory OLTP, занимаемого данными датчиков:

Кэширование и состояние сеанса

Технология OLTP в памяти делает ядро СУБД в базах данных SQL Server или Azure SQL привлекательной платформой для поддержания состояния сеанса (например, для приложения ASP.NET) и кэширования.

Состояние сеанса ASP.NET — удачный сценарий применения In-Memory OLTP. Работая с SQL Server, одним клиентам почти удалось добиться выполнения 1,2 млн запросов в секунду. В то же время они начали использовать выполняющуюся в памяти OLTP для кэширования всех приложений среднего уровня на предприятии. Подробности: Как bwin использует In-Memory OLTP в SQL Server 2016 (13.x) для достижения беспрецедентной производительности и масштабируемости

Вопросы реализации

Непостоянные таблицы, оптимизированные для памяти, можно использовать как простое хранилище типа «ключ-значение», сохраняя BLOB в столбце varbinary(max). Кроме того, можно реализовать полуструктурированный кэш с поддержкой JSON в SQL Server и База данных SQL. Наконец, можно создать полностью реляционный кэш в неустойчивых таблицах с полной реляционной схемой, включая различные типы и ограничения данных.

Начните работу с оптимизацией использования памяти состояния сеанса ASP.NET, используя скрипты, опубликованные на GitHub, чтобы заменить объекты, созданные встроенным поставщиком состояния сеанса SQL Server: aspnet-session-state

Примеры клиентов

Замена объекта tempdb

Используйте недолговечные таблицы и оптимизированные для памяти типы таблиц вместо традиционных структур на основе tempdb, таких как временные таблицы, табличные переменные и параметры с табличным значением (TVP).

Табличные переменные и неустойчивые таблицы, оптимизированные для памяти, обычно уменьшают нагрузку ЦП и полностью ликвидируют операции ввода-вывода журналов по сравнению с традиционными табличными переменными и таблицами #temp.

Вопросы реализации

Для начала: улучшение производительности временных таблиц и таблиц переменных с помощью оптимизации памяти.

Примеры клиентов

  • Одному из наших клиентов удалось повысить производительность на 40 %, просто заменив традиционные табличные параметры на табличные параметры, оптимизированные для памяти: High Speed IoT Data Ingestion Using In-Memory OLTP in Azure

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

ETL-процессы часто включают загрузку данных в промежуточную таблицу, преобразование данных и загрузку в конечные таблицы.

Используйте неустойчивые таблицы, оптимизированные для памяти, для промежуточного хранения данных. Они полностью устраняют все операции ввода-вывода и делают доступ к данным более эффективным.

Вопросы реализации

Чтобы ускорить преобразования в промежуточной таблице, выполняющиеся в ходе рабочего процесса, используйте скомпилированные в собственном коде хранимые процедуры. Если вы можете выполнять эти преобразования в параллельном режиме, при оптимизации памяти вы получаете дополнительные преимущества масштабирования.

Пример скрипта

Прежде чем начать использовать выполняющуюся в памяти OLTP, необходимо создать файловую группу MEMORY_OPTIMIZED_DATA. Кроме того, мы рекомендуем использовать уровень совместимости базы данных 130 (или более высокий) и задать для параметра базы данных MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT значение ON.

С помощью скрипта в следующем расположении можно создать файловую группу в папке данных по умолчанию, а также настроить рекомендуемые параметры:

В следующем примере скрипта показаны объекты OLTP в памяти, которые можно создать в базе данных.

Сначала настройте базу данных для In-Memory OLTP.

-- 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