Общие сведения о выполняющейся в памяти OLTP и сценарии потребления

Применимо к: SQL Server (все поддерживаемые версии) Azure SQL Управляемый экземпляр SQL Azure базы данных

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

В этой статье рассматриваются In-Memory технологии OLTP как в SQL Server, так и в База данных SQL. Дополнительные сведения о данных в памяти в Azure SQL см. в статье "Оптимизация производительности с помощью технологий в памяти" в базе данных Azure SQL и Управляемый экземпляр SQL Azure и блоге: In-Memory OLTP в базе данных Azure SQL.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • прием показаний и событий датчиков для вывода уведомлений и исторического анализа;
  • управление пакетными обновлениями из нескольких источников и максимальное уменьшение влияния на рабочую нагрузку параллельного чтения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В следующем примере скрипта показано, In-Memory объекты 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

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

См. также раздел

Дальнейшие действия