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

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

Вычисление pushdown повышает производительность запросов во внешних источниках данных. Начиная с 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 No No No No Да

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

** См . инструкции pushdown и поставщики Hadoop.

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

Примечание.

Вычисления pushdown могут блокироваться определенным синтаксисом T-SQL. Дополнительные сведения: Синтаксис для блокировки pushdown.

Вычисления с поддержкой pushdown и поставщики Hadoop

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

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

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

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

Агрегаты Фильтры (двоичное сравнение)
Count_Big NotEqual
Sum LessThan;
Ср. LessOrEqual
Макс. GreaterOrEqual
Мин. GreaterThan
Approx_Count_Distinct Является
IsNot

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

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

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

Pushdown-отправка соединений

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

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

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

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

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

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, разделенного запятыми, при которой в SQL Server копируются данные только для двух столбцов — customer.name и customer.zip_code.

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 позволяет выполнять следующие функции для pushdown предиката.

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

  • 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 блокируют pushdown-вычисления:

  • 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).

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

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

DECLARE @BusinessEntityID INT

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

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

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

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

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

Конфликт сортировки

При работе с данными с различными параметров сортировки может быть невозможно, такие операторы, как COLLATE и результаты. Поддерживаются равные параметры сортировки или двоичные параметры сортировки. Дополнительные сведения см. в разделе "Как определить, произошла ли отправка".

Pushdown для файлов parquet

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

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

Наличие следующих средств предотвращает отправку файлов parquet:

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

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

  • бит
  • TinyInt
  • SmallInt
  • BigInt
  • Вещественное число
  • Тип с плавающей запятой
  • VARCHAR (Bin2Collation, CodePageConversion, BinCollation)
  • NVARCHAR (Bin2Collation, BinCollation)
  • Binary
  • DateTime2 (точность по умолчанию и 7 цифр)
  • Date
  • Время (точность по умолчанию и 7 цифр)
  • Числовые*

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

Типы данных, которые предотвращают отложение parquet

  • Money
  • SmallMoney
  • Дата/время
  • SmallDateTime

Примеры

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

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

Отключить включение

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

Следующие шаги

См. также