Поделиться через


Вычисления pushdown в PolyBase

Область применения: SQL Server 2016 (13.x) и более поздних версий

Вычисления с пониженным уровнем повышают производительность запросов во внешних источниках данных. Начиная с SQL Server 2016 (13.x), вычисления pushdown были доступны для внешних источников данных Hadoop. SQL Server 2019 (15.x) представил вычисления pushdown для других типов внешних источников данных.

Примечание.

Чтобы определить, является ли вычисление pushdown в PolyBase выгодным для вашего запроса, см. статью Как определить, произошел ли внешний pushdown.

Включение вычислений pushdown

В следующих статьях содержатся сведения о конфигурировании вычислений pushdown для конкретных типов внешних источников данных.

В таблице ниже приведена поддержка вычислений pushdown для различных внешних источников данных:

Источник данных Объединения Проекции Агрегации Фильтры Статистика
Базовый протокол ODBC Да Да Да Да Да
Oracle Да+ Да Да Да Да
SQL Server Да Да Да Да Да
Teradata Да Да Да Да Да
MongoDB* Нет Да Да*** Да*** Да
Hadoop Нет Да Несколько** Несколько** Да
Хранилище BLOB-объектов Azure Нет Нет Нет Нет Да

* Поддержка возможности pushdown Azure Cosmos DB включена через API Azure Cosmos DB для MongoDB.

См. выполнение pushdown и поставщики Hadoop.

Поддержка технологии "pushdown" для агрегирования и фильтрации в соединителе MongoDB ODBC для SQL Server 2019 была представлена в SQL Server 2019 CU18.

+ Oracle поддерживает pushdown для соединений, но может потребоваться создать статистику по столбцам соединения для достижения pushdown.

Примечание.

Процесс вычислений с использованием pushdown может быть заблокирован некоторыми элементами синтаксиса T-SQL. Дополнительные сведения см. в Синтаксисе, предотвращающем pushdown.

Вычисления с помощью pushdown и провайдеры Hadoop

PolyBase в настоящее время поддерживает два поставщика Hadoop: Платформа данных Hortonworks (HDP) и Cloudera Distributed Hadoop (CDH). Нет различий между двумя поставщиками с точки зрения вычислений pushdown.

Чтобы использовать функции pushdown вычислений с Hadoop, целевой кластер Hadoop должен иметь основные компоненты: HDFS, YARN и MapReduce с включенным сервером журнала заданий. PolyBase отправляет запрос для выполнения через MapReduce и получает сведения о состоянии с сервера истории заданий. Без любого из этих компонентов запрос завершится сбоем.

Некоторая агрегация данных должна происходить после их обработки на SQL Server. Однако часть статистического вычисления происходит в Hadoop. Это стандартный метод вычисления статистических выражений в системах обработки данных с массовым параллелизмом.

Поставщики Hadoop поддерживают следующие агрегаты и фильтры.

Агрегации Фильтры (двоичное сравнение)
Count_Big Неравно
Сумма МеньшеЧем
Ср. МеньшеИлиРавно
Макс. БольшеИлиРавно
Мин. GreaterThan
Прибл_Количество_Уникальных Является
IsNot

Ключевые сценарии эффективного использования вычислений pushdown

Вычисления pushdown в PolyBase позволяют делегировать задачи вычислений внешним источникам данных. Это снижает рабочую нагрузку на экземпляре SQL Server и может значительно повысить производительность.

SQL Server может отправлять соединения, проекции, агрегаты и фильтры во внешние источники данных, используя удаленные вычислительные ресурсы и ограничивая данные, отправленные по сети.

Принудительная отправка соединения

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

При выполнении соединения внешний источник данных уменьшает объем перемещения данных и повышает производительность запросов. Без выполнения операции join pushdown SQL Server должен локально собрать данные из обеих таблиц в tempdb, а затем выполнить соединение.

В случае распределенных соединений (присоединение локальной таблицы к внешней таблице), если фильтр не применяется к присоединенной внешней таблице, SQL Server должен перенести все данные из внешней таблицы локально для tempdb выполнения операции соединения. Например, следующий запрос не имеет фильтрации по условию соединения внешней таблицы, что приводит к чтению всех данных из внешней таблицы.

SELECT * FROM LocalTable L
JOIN ExternalTable E on L.id = E.id

Так как соединение использует столбец E.id внешней таблицы, при добавлении условия фильтра в этот столбец SQL Server может передать фильтр вниз, уменьшая количество строк, считываемых из внешней таблицы.

SELECT * FROM LocalTable L
JOIN ExternalTable E on L.id = E.id
WHERE E.id = 20000

Выбор подмножества строк

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

В этом примере SQL Server инициирует задание map-reduce для получения строк, соответствующих предикату customer.account_balance < 200000 в Hadoop. Так как запрос можно выполнить и без сканирования всех строк в таблице, в SQL Server копируются только строки, удовлетворяющие условиям предиката. Это экономит значительное время и требует меньше временного места в хранилище, если количество балансов < клиентов 200000 меньше по сравнению с числом клиентов с балансами >учетных записей = 200000.

SELECT * FROM customer WHERE customer.account_balance < 200000;
SELECT * FROM SensorData WHERE Speed > 65;

Выбор подмножества столбцов

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

В этом запросе SQL Server инициирует задание map-reduce для предварительной обработки делимитированного текстового файла Hadoop, чтобы данные только из двух столбцов, customer.name и customer.zip_code, были скопированы в SQL Server.

SELECT customer.name, customer.zip_code
FROM customer
WHERE customer.account_balance < 200000;

Включение основных выражений и операторов

SQL Server позволяет использовать эти основные выражения и операторы для переноса предикатов:

  • Операторы двоичного сравнения (<, >, =, !=, <>, >=, <=) для чисел, значений дат и времени.
  • Арифметические операторы (+, -, *, /, %).
  • Логические операторы (AND, OR).
  • Унарные операторы (NOT, IS NULL, IS NOT NULL).

Операторы BETWEEN, NOT, IN и LIKE могут быть опущены в зависимости от того, как оптимизатор запросов переписывает выражения операторов в виде последовательности утверждений, используя базовые реляционные операторы.

В этом примере запрос содержит несколько предикатов, которые могут быть переданы в Hadoop. SQL Server может отправлять в Hadoop задания map-reduce для выполнения предиката customer.account_balance <= 200000. Выражение BETWEEN 92656 AND 92677 также состоит из двоичных и логических операций, которые могут быть переданы в Hadoop. Логический оператор AND в customer.account_balance AND customer.zipcode является завершающим выражением.

С учетом этого сочетания предикатов задания map-reduce могут выполнять все условия, указанные в предложении WHERE. В SQL Server копируются только те данные, которые соответствуют условиям SELECT.

SELECT * FROM customer
WHERE customer.account_balance <= 200000
AND customer.zipcode BETWEEN 92656 AND 92677;

Поддерживаемые функции для pushdown'а

SQL Server позволяет следующие функции для предикатного выталкивания:

Строковые функции:

  • CONCAT
  • DATALENGTH
  • LEN
  • LIKE
  • LOWER
  • LTRIM
  • RTRIM
  • SUBSTRING
  • UPPER

Математические функции:

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • CEILING
  • COS
  • EXP
  • FLOOR
  • POWER
  • SIGN
  • SIN
  • SQRT
  • TAN

Общие функции:

  • COALESCE *
  • NULLIF

* Использование COLLATE может предотвратить отклонение в некоторых сценариях. Дополнительные сведения см. в разделе "Конфликт сопоставления".

Функции даты и времени:

  • DATEADD
  • DATEDIFF
  • DATEPART

Синтаксис для блокировки pushdown

Эти функции T-SQL или элементы синтаксиса препятствуют оптимизации вычислений:

  • AT TIME ZONE
  • CONCAT_WS
  • TRANSLATE
  • RAND
  • CHECKSUM
  • BINARY_CHECKSUM
  • HASHBYTES
  • ISJSON
  • JSON_VALUE
  • JSON_QUERY
  • JSON_MODIFY
  • NEWID
  • STRING_ESCAPE
  • COMPRESS
  • DECOMPRESS
  • GREATEST
  • LEAST
  • PARSE

Появилась поддержка pushdown для синтаксиса FORMAT и TRIM начиная с кумулятивного обновления 10 (CU10) SQL Server 2019 (15.x).

Предложение фильтра с переменной

При указании переменной в предложении фильтра SQL Server по умолчанию не отправляет предложение фильтра. Например, следующий запрос не передает фильтр вниз:

DECLARE @BusinessEntityID INT

SELECT * FROM [Person].[BusinessEntity]
WHERE BusinessEntityID = @BusinessEntityID;

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

  • Уровень экземпляра: включите флаг трассировки 4199 в качестве параметра запуска для экземпляра.
  • Уровень базы данных: в контексте базы данных с внешними объектами PolyBase выполните команду ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON.
  • Уровень запроса: используйте подсказку OPTION (QUERYTRACEON 4199) запроса или OPTION (USE HINT ('ENABLE_QUERY_OPTIMIZER_HOTFIXES')).

Это ограничение применяется к выполнению sp_executesql и некоторым функциям в разделе фильтра.

SQL Server 2019 CU5 впервые представила возможность принудительного удаления переменной.

Дополнительные сведения см. в разделе sp_executesql.

Конфликт коллирования

Pushdown может не работать с данными с разными параметрами сортировки. Операторы, такие как COLLATE, также могут влиять на исход. SQL Server поддерживает равные параметры сортировки или двоичные параметры сортировки. Дополнительные сведения см. в разделе Как определить, произошел ли внешний pushdown (внешнее сжатие).

Pushdown для файлов parquet

Начиная с SQL Server 2022 (16.x), PolyBase представила поддержку файлов "parquet". SQL Server может выполнять как удаление строк, так и столбцов при выполнении pushdown с помощью parquet.

Поддерживаемые внешние источники данных

Поддержка механизма pushdown для Parquet доступна для следующих внешних источников данных:

  • Хранилище объектов, совместимое с S3
  • Azure Blob-хранилище
  • Azure Data Lake Storage 2-го поколения

Дополнительные сведения о конфигурации см. в этой статье:

Операции с уменьшением стека

SQL Server может выполнять эти операции с parquet-файлами:

  • Операторы двоичного сравнения (>, >=, <=, <) для числовых, дат и значений времени.
  • Сочетание операторов сравнения (> И <, >= И <, > И <=, <= И >=).
  • В фильтре списка (col1 = val1 ИЛИ col1 = val2 ИЛИ col1 = val3).
  • IS NOT NULL для столбца.

Эти условия запрещают оптимизацию с использованием pushdown для файлов parquet.

  • Виртуальные столбцы.
  • Сравнение столбцов.
  • Преобразование типов параметров.

Поддерживаемые типы данных

  • bit
  • tinyint
  • smallint
  • bigint
  • реальный
  • float
  • varchar (Bin2Collation, CodePageConversion, BinCollation)
  • nvarchar (Bin2Collation, BinCollation)
  • binary
  • datetime2 (точность по умолчанию и 7 цифр)
  • дата
  • время (точность по умолчанию и 7 цифр)
  • Числовые *

* Поддерживается, если шкала параметра соответствует шкале столбца или если параметр явно приведён к десятичному.

Типы данных, которые предотвращают перемещение данных в формате Parquet

  • деньги
  • smallmoney
  • datetime
  • smalldatetime

Исключение разделов с помощью структур папок

PolyBase может использовать структуры папок для ликвидации секций, уменьшая объем отсканированных данных во время запросов. При организации файлов parquet в иерархических папках (например, по годам, месяцам или другим ключам секционирования) PolyBase может пропустить все папки, которые не соответствуют предикатам запроса.

Например, если вы структурируйте данные следующим образом:

/data/year=2024/month=01/*.parquet
/data/year=2024/month=02/*.parquet
/data/year=2025/month=01/*.parquet

Вы можете запрашивать определенные разделы, используя подстановочные знаки в OPENROWSET или в расположениях внешних таблиц:

-- Query only January 2025 data
SELECT *
FROM OPENROWSET(
    BULK '/data/year=2025/month=01/*.parquet',
    DATA_SOURCE = 's3_ds',
    FORMAT = 'PARQUET'
) AS [data];

Для динамической ликвидации папок запросите более широкий путь к папке и используйте filepath() предикаты для устранения секций во время выполнения:

SELECT
    r.filepath(1) AS [year],
    r.filepath(2) AS [month],
    COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
    BULK '/data/year=*/month=*/*.parquet',
    DATA_SOURCE = 's3_ds',
    FORMAT = 'PARQUET'
) WITH (
    customer_id INT,
    amount DECIMAL(10, 2)
) AS [r]
WHERE
    r.filepath(1) = '2025'
    AND r.filepath(2) = '01'
GROUP BY
    r.filepath(1),
    r.filepath(2);

Этот подход объединяет устранение партиционирования на уровне папок и проталкивание на уровне файлов parquet для оптимальной производительности запросов. Полное руководство по запросу файлов Parquet с шаблонами папок см. в статье Virtualize Parquet file в хранилище объектов, совместимом с S3, с помощью PolyBase.

Примеры

Принудительное включение

SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (FORCE EXTERNALPUSHDOWN);

Отключить pushdown

SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (DISABLE EXTERNALPUSHDOWN);