Повышение показателей пропускной способности базы данных Azure SQL из Azure Stream Analytics

В этой статье приведены советы по улучшению пропускной способности операций записи при загрузке данных в базу данных Azure SQL с использованием Azure Stream Analytics.

При выводе данных в SQL из Azure Stream Analytics поддерживается запись в параллельном режиме. Эта возможность реализует топологии заданий с полной параллельной обработкой, когда несколько секций выходных данных могут записывать в целевую таблицу в параллельном режиме. Тем не менее активации этой возможности в Azure Stream Analytics может быть недостаточно для увеличения пропускной способности, так как она очень зависит от конфигурации базы данных SQL Azure и схемы таблицы. Выбранные индексы, ключ кластеризации, коэффициент заполнения индекса и сжатие влияют на время загрузки таблиц. Дополнительные сведения о том, как оптимизировать базу данных для улучшения производительности запросов и загрузки на основе внутренних тестов производительности, см. в статье Настройка производительности в базе данных SQL Azure. Упорядочение записей не гарантируется при записи в базу данных SQL в параллельном режиме.

Ниже приведены некоторые конфигурации каждой службы, которые позволяют повысить общую пропускную способность решения.

Azure Stream Analytics

  • Секционирование по наследованию. Этот вариант конфигурации выходных данных SQL позволяет наследовать схему секционирования, используемую на предыдущем шаге запроса или с предыдущими входными данными. Если этот параметр включен, выполняется запись в таблицу на диске и присутствует задание с топологией полной параллельной обработки, будет прослеживаться лучшая пропускная способность. Такое секционирование автоматически выполняется для многих других выходных данных. Блокировка таблицы (TABLOCK) также отключается для массовой вставки, выполняемой при использовании этого параметра.

    Примечание

    При наличии более чем 8 секций входных данных может быть нецелесообразно использовать наследование схемы секционирования входных данных. Это максимальное ограничение было обнаружено в таблице с одним столбцом идентификаторов и кластеризованным индексом. В этом случае рекомендуется использовать в запросе INTO 8, чтобы явно указать число модулей записи вывода. В зависимости от этой схемы и выбранных индексов, результаты отличаются.

  • Размер пакета. Конфигурация выходных данных SQL позволяет указать максимальный размер пакета выходных данных Azure Stream Analytics в зависимости от характера целевой таблицы или рабочей нагрузки. Размер пакета равен максимальному числу записей, отправляемых с каждой транзакцией массовой вставки. В кластеризованных индексах columnstore для пакетов с числом строк около 100 000 можно использовать дополнительную параллелизацию, выполнять минимальное ведение журнала и блокировки. Оптимальным выбором могут быть таблицы на диске с 10 000 строк (по умолчанию) или меньше, так как большие размеры пакетов могут привести к укрупнению блокировки во время операции массовой вставки.

  • Настройка входных сообщений. Если вы выполнили оптимизацию с использованием секционирования по наследованию и размера пакета, путем увеличения количества входных событий в сообщении на секцию можно дополнительно повысить пропускную способность записи. Путем настройки входных сообщений размеры пакетов в Azure Stream Analytics можно увеличивать вплоть до указанного размера, тем самым повышая пропускную способность. Это можно сделать с помощью сжатия или увеличения размеров входящих сообщений в EventHub или большом двоичном объекте.

SQL Azure

  • Секционированная таблица и индексы. Если использовать секционированные таблицу SQL и индексы для таблицы с тем же столбцом в качестве ключа секции (например, PartitionId), можно значительно уменьшить состязания между секциями во время операций записи. Для секционированной таблицы потребуется создать функцию и схему секционирования в первичной файловой группе. Это приведет к повышению уровня доступности имеющихся данных при загрузке новых данных. Может быть достигнуто ограничение операций ввода-вывода журнала в зависимости от количества секций, которые можно увеличить, обновив номер SKU.

  • Предупреждение нарушений уникальных ключей. Если в журнале действий Azure Stream Analytics появилось несколько предупреждающих сообщений о нарушении ключа, убедитесь, что на ваше задание не повлияли нарушения ограничений, которые могут произойти во время восстановления. Этого можно избежать, установив для индексов параметр IGNORE_DUP_KEY.

Служба "Фабрика данных Azure" и таблицы в памяти

  • Таблица в памяти как временная таблица.Таблицы в памяти обеспечивают очень высокую скорость загрузки данных, но размер данных не должен превышать доступный объем памяти. Тесты производительности демонстрируют, что массовая загрузка из таблицы в памяти в таблицу на диске примерно в 10 раз быстрее, чем во время непосредственной массовой вставки с помощью одного средства записи в дисковой таблице со столбцом идентификаторов и кластеризованным индексом. Чтобы использовать производительность массовой вставки, настройте задание копирования с использованием службы "Фабрика данных Azure", позволяющее копировать данные из таблицы в памяти в таблицу на диске.

Предотвращение ошибок в расчете производительности

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

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

  • Создайте триггер INSTEAD OF, чтобы использовать простую вставку для каждой строки.
  • Используйте временную таблицу в памяти, как описано в предыдущем разделе.

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

Сводка

Таким образом, если использовать функцию секционирования выходных данных в Azure Stream Analytics для выходных данных SQL, согласованная параллелизация задания с секционированной таблицей в SQL Azure может обеспечить значительные усовершенствования пропускной способности. Использование службы "Фабрика данных Azure" для оркестрации перемещения данных из таблицы в памяти в таблицы на диске позволяет достичь значительного увеличения пропускной способности. Если это целесообразно, повышение плотности сообщений также может быть важным фактором для улучшения общей пропускной способности.

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