Бөлісу құралы:


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

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

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

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

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

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

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

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

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

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

Сценарии использования для OLTP в памяти

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

Внимание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Используйте задание для регулярной пакетной разгрузки данных в таблицу на основе диска с кластеризованным индексом columnstore, используя задание, которое выполняется INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>; или
  • Используйте временную таблицу, оптимизированную для памяти, для управления статистическими данными. В этом режиме статистические данные находятся на диске, а перемещением данных управляет система.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сначала настроив базу данных для 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