Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
In-Memory OLTP — это ключевая технология, доступная в SQL Server и SQL Database для оптимизации производительности при обработке транзакций, приёме данных, загрузке данных и в сценариях с временными данными. В этой статье содержатся общие сведения о выполняющейся в памяти OLTP и описываются сценарии использования этой технологии. Используйте эти сведения, чтобы определить, подходит ли In-Memory OLTP для вашего приложения. Статья завершается примером, в котором показаны объекты In-Memory OLTP, приводится ссылка на демонстрацию производительности, а также ссылки на ресурсы, которые можно использовать для дальнейших действий.
- В этой статье рассматривается технология In-Memory OLTP как в SQL Server, так и в Базе данных SQL.
- Дополнительные сведения о данных в памяти в База данных SQL Azure см. в статье "Оптимизация производительности с помощью технологий в памяти" в База данных SQL Azure и блоге: OLTP в памяти в База данных SQL Azure.
- Дополнительные сведения, относящиеся к данным в памяти в Управляемый экземпляр SQL Azure, см. в статье Оптимизация производительности с помощью технологий in-memory в Управляемый экземпляр SQL Azure.
Обзор 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.
Чтобы приступить к работе в имеющемся приложении, сделайте следующее:
- Используйте отчет анализа производительности транзакций, чтобы определить объекты для переноса.
- Используйте помощник по оптимизации памяти и помощник по собственной компиляции, чтобы помочь в миграции.
Прием данных из разных источников, включая Интернет вещей
Выполняющаяся в памяти OLTP удобна, если необходимо принимать большие объемы данных одновременно из разных источников. И часто бывает полезно загружать данные в базу данных SQL Server, а не в другие целевые системы, поскольку SQL Server обеспечивает быстрое выполнение запросов к данным и позволяет получать аналитические выводы в режиме реального времени.
Распространенные шаблоны применения:
- Приём показаний и событий датчиков с возможностью отправки уведомлений, а также исторического анализа.
- Управление пакетными обновлениями, даже из нескольких источников, при этом сводя к минимуму влияние на параллельную нагрузку на чтение.
Вопросы реализации
Используйте оптимизированную для памяти таблицу для приема данных. Если загрузка данных состоит в основном из вставок (а не обновлений) и объём памяти, занимаемый данными в In-Memory OLTP, имеет значение, то либо
- Используйте задание для регулярной пакетной выгрузки данных в таблицу на диске с кластеризованным индексом columnstore с помощью задания, которое выполняет
INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>; или - Используйте временную таблицу, оптимизированную для памяти, для управления статистическими данными. В этом режиме статистические данные находятся на диске, а перемещением данных управляет система.
Репозиторий примеров 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
Примеры клиентов
- bwin еще больше повысила пропускную способность за счет состояния сеанса ASP.NET и внедрила общекорпоративную систему кэширования промежуточного уровня с In-Memory OLTP в SQL Server 2016 (13.x): Как bwin использует In-Memory OLTP в SQL Server 2016 (13.x) для достижения беспрецедентной производительности и масштабируемости.
Замена объекта 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
Связанный контент
- Опрос начальных областей в памяти OLTP
- Преимущества In-Memory OLTP для производительности и использования ресурсов в База данных SQL Azure
- Улучшение производительности временной таблицы и табличной переменной с помощью оптимизации памяти
- Демонстрация: повышение производительности OLTP в памяти
- Пример базы данных для OLTP в памяти
- in-memory-oltp-perf-demo-v1.0
- 17-минутный видеоролик с объяснением In-Memory OLTP и демонстрацией
- Обзор и сценарии использования OLTP в памяти
- Оптимизация производительности с помощью выполняющихся в памяти технологий в Azure SQL
- Системно-версионированные темпоральные таблицы с таблицами, оптимизированными для памяти
- Файловая группа, оптимизированная для памяти
- Скрипт, позволяющий включить выполняющуюся в памяти OLTP и задать рекомендуемые параметры