Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server 2016 (13.x) и более поздних версий
Вычисление pushdown повышает производительность запросов во внешних источниках данных. Начиная с SQL Server 2016 (13.x), вычисления pushdown были доступны для внешних источников данных Hadoop. SQL Server 2019 (15.x) представил вычисления pushdown для других типов внешних источников данных.
Примечание.
Чтобы определить, является ли вычисление pushdown в PolyBase выгодным для вашего запроса, см. статью Как определить, произошел ли внешний pushdown.
Включение вычислений pushdown
В следующих статьях содержатся сведения о настройке вычислений pushdown для конкретных типов внешних источников данных.
- Enable pushdown computation (Активация вычислений pushdown)
- Настройка PolyBase для доступа к внешним данным в Oracle
- Настройка PolyBase для доступа к внешним данным в Teradata
- Настройка PolyBase для доступа к внешним данным в MongoDB
- Настройка PolyBase для доступа к внешним данным с помощью универсальных типов ODBC
- Настройка PolyBase для доступа к внешним данным в SQL Server
В таблице ниже приведена поддержка вычислений 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.
+ 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 и получает сведения о состоянии c сервера журнала заданий. Без любого из этих компонентов запрос завершится сбоем.
Некоторые агрегаты должны возникать после достижения данных SQL Server. Однако часть статистического вычисления происходит в Hadoop. Это стандартный метод вычисления статистических выражений в системах обработки данных с массовым параллелизмом.
Поставщики Hadoop поддерживают следующие агрегаты и фильтры.
| Статистические схемы | Фильтры (двоичное сравнение) |
|---|---|
| Count_Big | NotEqual |
| Sum | LessThan; |
| Ср. | LessOrEqual |
| Макс. | GreaterOrEqual |
| Мин. | GreaterThan |
| Approx_Count_Distinct | Является |
| 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 позволяет следующие функции для предикатного выталкивания:
Строковые функции:
CONCATDATALENGTHLENLIKELOWERLTRIMRTRIMSUBSTRINGUPPER
Математические функции:
ABSACOSASINATANCEILINGCOSEXPFLOORPOWERSIGNSINSQRTTAN
Общие функции:
COALESCE*NULLIF
* Использование с COLLATE помощью может препятствовать принудительному нажатию в некоторых сценариях. Дополнительные сведения см. в разделе "Конфликт сортировки".
Функции даты и времени:
DATEADDDATEDIFFDATEPART
Синтаксис для блокировки pushdown
Эти функции T-SQL или элементы синтаксиса препятствуют оптимизации вычислений:
AT TIME ZONECONCAT_WSTRANSLATERANDCHECKSUMBINARY_CHECKSUMHASHBYTESISJSONJSON_VALUEJSON_QUERYJSON_MODIFYNEWIDSTRING_ESCAPECOMPRESSDECOMPRESSGREATESTLEASTPARSE
Поддержка 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-го поколения
Дополнительные сведения о конфигурации см. в этой статье:
- Настройка PolyBase для доступа к внешним данным в хранилище объектов, совместимом с S3
- Виртуализация файла Parquet в объектном хранилище, совместимом с S3, с помощью PolyBase
Операции с уменьшением стека
SQL Server может выполнять эти операции с parquet-файлами:
- Операторы двоичного сравнения (>, >=, <=, <) для числовых, дат и значений времени.
- Сочетание операторов сравнения (> AND <, >= AND<, ><AND = = AND = AND <= AND >=).
- В фильтре списка (col1 = val1 OR col1 = val2 OR vol1 = 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);
Отключить включение
SELECT * FROM [dbo].[SensorData]
WHERE Speed > 65
OPTION (DISABLE EXTERNALPUSHDOWN);