Подключение, запрос и экспорт данных с помощью PolyBase

Относится к: SQL Server 2016 (13.x) и более поздние версии База данных SQL AzureУправляемый экземпляр SQL AzureSQL Database в Microsoft Fabric

Виртуализация данных позволяет выполнять запросы Transact-SQL (T-SQL) по внешним данным, не загружая их в базу данных. Вы определяете внешний источник данных, необязательный формат файла и внешнюю таблицу, а затем запрашиваете внешнюю таблицу, SELECT как и любую другую таблицу.

Это руководство поможет вам:

  • Узнайте, какие функции PolyBase поддерживаются вашей платформой SQL и версией.
  • Выберите между OPENROWSET, внешними таблицами или BULK INSERT для обработки или приема данных.
  • Следуйте пошаговым инструкциям для распространенных задач.
  • Ознакомьтесь с рекомендациями по повышению производительности, устранению неполадок и рекомендациям для рабочих нагрузок.

Поддержка платформы

Распространенные варианты использования

В следующей таблице описаны возможные сценарии использования.

Сценарий Использование
Спонтанное исследование файлов OPENROWSET(BULK ...)
Многократный запрос к файлам для BI или отчетов Внешние таблицы по файлам
Межбазовый запрос (SQL Server, Oracle, Teradata, MongoDB, ODBC) Соединители PolyBase с внешними таблицами
Экспорт результатов запроса в файлы CREATE EXTERNAL TABLE AS SELECT (CETAS)
Массовый прием в таблицы BULK INSERT или OPENROWSET(BULK ...) с INSERT ... SELECT
  • Для случайного исследования файлов используйте OPENROWSET(BULK ...) для проверки файлов без создания повторно используемой таблицы.
  • Для повторного запроса файлов в BI или в сценариях отчётности используйте внешние таблицы поверх файлов для сохранения схемы и обмена результатами между запросами.
  • Для выполнения межбазовых запросов используйте соединители PolyBase вместе с внешними таблицами для доступа к источникам SQL Server, Oracle, Teradata, MongoDB или ODBC.
  • Для экспорта результатов запросов в файлы используйте CREATE EXTERNAL TABLE AS SELECT (CETAS), чтобы записывать выходные данные в формате Parquet или CSV за пределами базы данных.
  • Для массовой загрузки в таблицы используйте BULK INSERT или OPENROWSET(BULK ...) с помощью INSERT ... SELECT для загрузки данных из файлов в таблицы базы данных.

Какие функции доступны где?

В следующей таблице показано, какие основные функции виртуализации PolyBase и данных доступны на каждой платформе SQL, начиная с SQL Server 2019. Для доступности функций в SQL Server 2016 и SQL Server 2017 на Windows см. Функции и ограничения PolyBase. Используйте эту таблицу, чтобы определить, что можно сделать на платформе, прежде чем использовать подробные руководства.

Функция SQL Server 2019 г. SQL Server 2022 SQL Server 2025 г. База данных SQL Azure Управляемый экземпляр SQL Azure База данных SQL в Microsoft Fabric
внешние таблицы Да Да Да Да Да Да
OPENROWSET (BULK) Да 1 Да Да Да Да Да
CETAS (экспорт) Нет Да Да Нет Да Нет
CSV или файлы с разделителями Да 2 Да Да Да Да Да
Файлы Parquet Нет Да Да Да Да Да
Таблицы Delta Lake Нет Да Да Нет Нет Нет
Подключение к другому SQL Server Да Да Да Нет Нет Нет
Подключение к Базе данных SQL Azure или Управляемому экземпляру SQL Azure Да 3 Да 3 Да 3 Нет Нет Нет
Подключение к Oracle / Teradata / MongoDB Да Да Да Нет Нет Нет
Подключение к хранилищу BLOB-объектов Azure Да Да Да Да Да Нет
Подключение к ADLS 2-го поколения Да 5 Да Да Да Да Нет
Подключение к хранилищу, совместимое с S3 Нет Да Да Нет Нет Нет
Подключение к OneLake (Fabric) Нет Нет Нет Нет Нет Да
Выталкивающее вычисление Да Да Да Нет Нет Нет
Аутентификация управляемой идентификации Нет Нет Да 4 Да Да Нет

1 SQL Server 2019 (15.x) поддерживает OPENROWSET(BULK...) локальные и сетевые пути к файлам. В SQL Server 2022 (16.x) и более поздних версиях OPENROWSET(BULK...) также поддерживает чтение из облачного хранилища с помощью FORMAT = 'PARQUET', FORMAT = DELTA и FORMAT = 'CSV'.

2 версия поддержки CSV в SQL Server 2019 (15.x) требует Hadoop. В SQL Server 2022 (16.x) и более поздних версиях CSV-файл изначально поддерживается без Hadoop.

3 Использует соединитель SQL Server (sqlserver://). Учетные данные уровня базы данных предназначены для конечной точки SQL. Используйте те же шаги, что и при подключении к другому экземпляру SQL Server.

Поддерживается аутентификация с управляемым удостоверением для подключения к хранилищу BLOB-объектов Azure (ABS) и ADLS уровня 2. Для этого требуется SQL Server с поддержкой Azure Arc или SQL Server на виртуальной машине Azure для локального SQL Server. Она изначально доступна в База данных SQL Azure и Управляемый экземпляр SQL Azure.

5 SQL Server 2019 CU11 и более поздние версии поддерживают Azure Data Lake Storage 2-го поколения с префиксом abfs ORabfss. В SQL Server 2022 и более поздних версиях используйте префиксadls.

  • Внешние таблицы поддерживаются в SQL Server 2019, SQL Server 2022, SQL Server 2025, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database в Microsoft Fabric.
  • OPENROWSET (BULK)поддерживается в SQL Server 2019, SQL Server 2022, SQL Server 2025, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database в Microsoft Fabric. SQL Server 2019 поддерживает локальные и сетевые файловые пути, а SQL Server 2022 и более поздние версии также поддерживают чтение облачного хранилища с FORMAT = 'PARQUET', FORMAT = DELTA, и FORMAT = 'CSV'.
  • Экспорт CETAS не поддерживается в SQL Server 2019, База данных SQL Azure или SQL Database в Microsoft Fabric. Экспорт CETAS поддерживается в SQL Server 2022, SQL Server 2025 и Управляемый экземпляр SQL Azure.
  • CSV и разделённые файлы поддерживаются в SQL Server 2019, SQL Server 2022, SQL Server 2025, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database в Microsoft Fabric. SQL Server 2019 требует Hadoop для поддержки CSV, тогда как SQL Server 2022 и более поздние версии поддерживают CSV нативно без Hadoop.
  • Файлы Parquet не поддерживаются в SQL Server 2019. Файлы Parquet поддерживаются в SQL Server 2022, SQL Server 2025, База данных SQL Azure, Управляемый экземпляр SQL Azure и базе данных SQL в Microsoft Fabric.
  • Таблицы Delta Lake не поддерживаются в SQL Server 2019, База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database в Microsoft Fabric. Таблицы Delta Lake поддерживаются в SQL Server 2022 и SQL Server 2025.
  • Подключение к другому экземпляру SQL Server поддерживается в SQL Server 2019, SQL Server 2022 и SQL Server 2025. Подключение к другому экземпляру SQL Server не поддерживается в База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database в Microsoft Fabric.
  • Подключение к База данных SQL Azure или Управляемый экземпляр SQL Azure поддерживается в SQL Server 2019, SQL Server 2022 и SQL Server 2025 с помощью соединителя SQL Server. Учетные данные уровня базы данных предназначены для конечной точки База данных SQL Azure или Управляемый экземпляр SQL Azure, а шаги настройки такие же, как при подключении к другому экземпляру SQL Server. Эти соединения не поддерживаются в База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database в Microsoft Fabric.
  • Подключение к Oracle, Teradata или MongoDB поддерживается в SQL Server 2019, SQL Server 2022 и SQL Server 2025. Эти соединения не поддерживаются в База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database в Microsoft Fabric.
  • Подключение к Хранилище BLOB-объектов Azure поддерживается в SQL Server 2019, SQL Server 2022, SQL Server 2025, База данных SQL Azure и Управляемый экземпляр SQL Azure. Подключение к Хранилище BLOB-объектов Azure не поддерживается из базы данных SQL в Microsoft Fabric.
  • Подключение к ADLS Gen2 не поддерживается в релизах SQL Server 2019 до CU11 или из базы данных SQL в Microsoft Fabric. Подключение к ADLS Gen2 поддерживается начиная с SQL Server 2019 CU11, а также в SQL Server 2022, SQL Server 2025, База данных SQL Azure и Управляемый экземпляр SQL Azure.
  • Подключение к S3-совместимому хранилищу не поддерживается в SQL Server 2019, База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database в Microsoft Fabric. Подключение к S3-совместимому хранилищу поддерживается в SQL Server 2022 и SQL Server 2025.
  • Подключение к OneLake поддерживается из базы данных SQL в Microsoft Fabric. Подключение к OneLake не поддерживается в SQL Server 2019, SQL Server 2022, SQL Server 2025, База данных SQL Azure или Управляемый экземпляр SQL Azure.
  • Вычисления pushdown поддерживаются в SQL Server 2019, SQL Server 2022 и SQL Server 2025. Вычисления pushdown не поддерживаются в База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database в Microsoft Fabric.
  • Управляемая аутентификация идентичности не поддерживается в SQL Server 2019 и SQL Server 2022. Аутентификация управляемой идентичности поддерживается в SQL Server 2025 для подключения к Хранилище BLOB-объектов Azure и ADLS Gen2, а также требует SQL Server с поддержкой Azure Arc или SQL Server на виртуальной машине Azure. Управляемая аутентификация идентичности также поддерживается в База данных SQL Azure и Управляемый экземпляр SQL Azure, но не поддерживается в базе данных SQL в Microsoft Fabric.

Замечание

Начиная с SQL Server 2025 (17.x), запросы к файлам данных (CSV, Parquet и Delta) в хранилище Хранилище BLOB-объектов Azure, ADLS Gen2 или S3-совместимом хранилище являются собственной функцией движка и больше не требуют установки или запуска служб PolyBase. Соединители RDBMS (SQL Server, Oracle, Teradata, MongoDB, ODBC) по-прежнему требуют установки и запуска служб PolyBase. SQL Server 2025 (17.x) также добавляет поддержку Linux для этих соединителей, которые ранее были доступны только в Windows.

Запрос внешних данных

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

Подход Синтаксис Используйте, когда Аутентификация Требуется установка PolyBase
Нерегламентированные запросы OLE DB OPENROWSET(provider, connection, query) Требуется быстрый однократный запрос без постоянных объектов или проверка подлинности идентификатора Microsoft Entra Проверка подлинности SQL, проверка подлинности Windows, Microsoft Entra ID (MSOLEDBSQL) Нет
Специальные запросы к файлам OPENROWSET(BULK ...) Перед созданием таблицы необходимо быстро изучить данные файлов или проверить схемы. Маркер SAS, ключ доступа, управляемое удостоверение, идентификатор Microsoft Entra SQL Server 2022: Да 1

SQL Server 2025 и более поздние версии: Нет

База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database in Fabric: Встроенное
Соединители постоянных данных CREATE EXTERNAL TABLE с sqlserver://, oracle://и teradata://т. д. Для производственной среды требуется регулярный доступ, управление, статистика и pushdown вычисления. Только аутентификация SQL Да

1 Для доступа к облачным файлам в SQL Server 2022 (16.x) необходимо установить компонент PolyBase, но соединители для Хранилище BLOB-объектов Azure, ADLS Gen2 и S3-совместимого хранилища не зависят от служб PolyBase. SQL Server 2025 (17.x) и более поздние версии поддерживают нативную поддержку CSV, Parquet и Delta без установки или запуска сервисов PolyBase.

  • Ad hoc запросы OLE DB используются OPENROWSET(provider, connection, query) для быстрого однократного доступа к удалёному источнику данных без создания постоянных объектов. Они могут использовать SQL-аутентификацию, проверка подлинности Windows или Microsoft Entra ID с MSOLEDBSQL. В этом случае не требуется установка PolyBase.
  • Специальные запросы к файлам позволяют использовать OPENROWSET(BULK ...), чтобы быстро анализировать данные в файлах или проверить схему перед созданием таблицы. Они могут использовать токены SAS, ключи доступа, управляемую идентичность или Microsoft Entra ID. SQL Server 2022 требует установки функций PolyBase для облачных файлов, но не требует сервисов PolyBase. SQL Server 2025 и более поздние версии не требуют PolyBase для облачных файлов. Специальные запросы к файлам встроены в База данных SQL Azure, Управляемый экземпляр SQL Azure и базу данных SQL в Fabric.
  • Постоянные коннекторы данных используют CREATE EXTERNAL TABLE с sqlserver://, oracle://, teradata:// и аналогичными расположениями для регулярного доступа, управления данными, статистики и pushdown-вычислений в продуктивных рабочих нагрузках. Они требуют SQL-аутентификации и сервисов PolyBase.

Рекомендации по принятию решений

Сценарий Recommendation
Вам нужна аутентификация Microsoft Entra ID для удалённого SQL-подключения или вы хотите избежать использования сервисов PolyBase. Используйте OPENROWSET(MSOLEDBSQL, ...) (ad hoc, без постоянных объектов).
Вам нужны постоянные таблицы, статистика или вычисления в удалённых базах данных. Используйте CREATE EXTERNAL TABLE с соединителями PolyBase (sqlserver://, oracle://, teradata://, mongodb://, odbc://). OPENROWSET Не поддерживает разъёмы.
Вы исследуете новый файл или тестируете схему. Используйте OPENROWSET(BULK ...) (быстрая итерация, без постоянных объектов).
Вы вводите данные файлов в таблицу с трансформациями. Используйте INSERT ... SELECT из OPENROWSET(BULK ...).
Для многих пользователей или приложений нужна система управления или общий доступ. Используйте CREATE EXTERNAL TABLE так, чтобы права и метаданные были централизованы.
Вы работаете с SQL базами данных в Fabric. Используйте OPENROWSET(BULK ...) для разовых запросов к OneLake или внешние таблицы для повторного использования; для внешнего хранилища используйте ярлыки OneLake.
  • Если вам нужна аутентификация Microsoft Entra ID для удалённого SQL или вы хотите избежать сервисов PolyBase, используйте OPENROWSET(MSOLEDBSQL, ...) для ad hoc удалённых запросов без постоянных объектов.
  • Если вам нужны постоянные таблицы, статистика или вычисление с переносом обработки в удалённые базы данных, используйте CREATE EXTERNAL TABLE с коннекторами PolyBase, такими как sqlserver://, oracle://, mongodb://, teradata:// и odbc://. OPENROWSET не поддерживает эти разъёмы.
  • Если вы работаете с новым файлом или тестируете схему, используйте OPENROWSET(BULK ...) для быстрой итерации без создания постоянных объектов.
  • Если вы вводите данные файлов в таблицу с преобразованиями, используйте INSERT ... SELECT из OPENROWSET(BULK ...).
  • Если вам нужен управление или общий доступ для многих пользователей или приложений, используйте CREATE EXTERNAL TABLE так, чтобы права и метаданные были централизованы.
  • Если вы работаете с базой данных SQL в Fabric, используйте OPENROWSET(BULK ...) для специальных запросов OneLake или внешние таблицы для повторного использования, а для доступа к внешнему хранилищу — ярлыки OneLake.

Выбор сценария

Теперь, когда вы понимаете три подхода, используйте одно из следующих руководств для реализации конкретного варианта использования.

Файлы запросов (Parquet, CSV или Delta)

Если ваши данные находятся в файлах Parquet, CSV или Delta в объектах Хранилище BLOB-объектов Azure, ADLS 2-го поколения, хранилище, совместимое с S3 или OneLake, следуйте одному из этих руководств.

Сценарий Рекомендуемое руководство Платформы
Быстрый запрос по мере необходимости к файлу Parquet или CSV Используйте OPENROWSET. Внешняя таблица не требуется SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Fabric
Повторяющиеся запросы к файлам Parquet с постоянной схемой Создание внешней таблицы на основе Parquet SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Fabric
Запрос CSV-файлов с внешней таблицей Создание внешней таблицы с форматом файла для текста, разделённого разделителями SQL Server 2019 (15.x) и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Fabric
Запросы к таблицам Delta Lake Создание внешней таблицы с помощью FILE_FORMAT = DeltaLakeFileFormat SQL Server 2022 (16.x) и более поздних версий
Экспорт результатов запроса в файлы Parquet или CSV (CETAS) Используйте CREATE EXTERNAL TABLE AS SELECT SQL Server 2022 (16.x) и более поздних версий, Управляемый экземпляр SQL Azure
  • Для быстрого случайного запроса к файлу Parquet или CSV используйте OPENROWSET. Для этого метода не требуется внешней таблицы. SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database in Fabric поддерживают этот шаблон.
  • Для повторяющихся запросов к файлам Parquet с постоянной схемой используйте внешнюю таблицу вместо Parquet. SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database in Fabric поддерживают этот шаблон.
  • Для запроса к CSV-файлам используйте внешнюю таблицу с форматом файла для разделённого текста. SQL Server 2019 (15.x) и более поздние версии, Azure SQL SQL Database, Управляемый экземпляр SQL Azure и SQL Database in Fabric поддерживают этот шаблон.
  • Для запроса к таблицам Delta Lake используйте внешнюю таблицу с FILE_FORMAT = DeltaLakeFileFormat. SQL Server 2022 (16.x) и более поздние версии поддерживают этот шаблон.
  • Для экспорта результатов запросов в файлы Parquet или CSV используйте CREATE EXTERNAL TABLE AS SELECT. SQL Server 2022 (16.x) и более поздние версии, а также Azure SQL SQL Managed Instance поддерживают этот шаблон.

Вы также можете выполнить одно из следующих пошаговых руководств.

Руководство Описание
Начало работы с PolyBase в SQL Server 2022 Охватывает OPENROWSET с помощью Parquet и CSV, внешние таблицы и навигацию по папкам.
Виртуализация файла Parquet в объектном хранилище, совместимом с S3, с помощью PolyBase Руководство по SQL Server 2022 (16.x) и более поздних версий.
Виртуализация CSV-файла с помощью PolyBase Руководство по SQL Server 2022 (16.x) и более поздних версий.
Виртуализация разностной таблицы с помощью PolyBase Руководство по SQL Server 2022 (16.x) и более поздних версий.
Виртуализация данных с помощью базы данных SQL Azure (предварительная версия) Руководство по базе данных SQL Azure для Parquet и CSV.
Виртуализация данных с помощью управляемого экземпляра Azure SQL Руководство по Управляемому экземпляру SQL Azure для Parquet, CSV и CETAS.
Виртуализация данных в базе данных SQL в Fabric Руководство по базе данных SQL в Fabric для файлов OneLake.

Подключение к другому экземпляру SQL Server, Базе данных SQL Azure или Управляемому экземпляру SQL

В SQL Server 2019 (15.x) и более поздних версиях PolyBase может запрашивать таблицы в другом экземпляре SQL Server, Базе данных SQL Azure или Управляемом экземпляре SQL Azure без использования связанных серверов.

Это важно

Соединитель sqlserver:// не поддерживается в базе данных SQL в Fabric. Соединители RDBMS PolyBase используют проверку подлинности SQL через CREATE DATABASE SCOPED CREDENTIAL и не поддерживают идентификацию Microsoft Entra, управляемое удостоверение или учетную запись службы. Так как для базы данных SQL в Fabric требуется проверка подлинности Microsoft Entra, вы не можете подключиться к ней с помощью PolyBase.

Step Что делать
1. Установка PolyBase Установка PolyBase в Windows или установка PolyBase в Linux
Создайте учетные данные CREATE DATABASE SCOPED CREDENTIAL с целевым логином
3. Создание внешнего источника данных CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>')
4. Создание внешней таблицы CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>')
5. Запрос SELECT * FROM <external_table>
    1. Установите PolyBase на Windows или Linux с помощью Install PolyBase на Windows или Install PolyBase на Linux до настройки доступа к внешним данным SQL.
    1. Создайте учетные данные области базы данных с целевым именем входа, используя CREATE DATABASE SCOPED CREDENTIAL, чтобы ядро СУБД могло проходить проверку подлинности на удаленном сервере.
    1. Создайте внешний источник данных для удалённого SQL Server, используя CREATE EXTERNAL DATA SOURCE ... WITH (LOCATION = 'sqlserver://<server>').
    1. Создайте внешнюю таблицу, используя CREATE EXTERNAL TABLE ... WITH (LOCATION = '<db>.<schema>.<table>') для представления удалённой таблицы.
    1. Запросите внешнюю таблицу, используя SELECT * FROM <external_table>.

Подсказка

Коннектор SQL Server также sqlserver:// работает для База данных SQL Azure и Управляемый экземпляр SQL Azure. Используйте те же шаги и установите LOCATION на База данных SQL Azure или Управляемый экземпляр SQL Azure endpoint (например, sqlserver://myserver.database.windows.net).

Подробное руководство см. в разделе "Настройка PolyBase для доступа к внешним данным в SQL Server".

Подключение к Oracle, Teradata или MongoDB

SQL Server 2019 (15.x) и более поздние версии могут выполнять запросы к базам данных Oracle, Teradata, MongoDB и Cosmos DB через коннекторы PolyBase ODBC.

Источник данных Guide Требования
Oracle Настройка PolyBase для доступа к внешним данным в Oracle SQL Server 2019 (15.x) и более поздних версий, клиентские драйверы Oracle
Teradata Настройка PolyBase для доступа к внешним данным в Teradata SQL Server 2019 (15.x) и более поздних версий, драйвер ODBC Teradata
MongoDB / Cosmos DB Настройка PolyBase для доступа к внешним данным в MongoDB SQL Server 2019 (15.x) и более поздних версий, драйвер ODBC MongoDB
Любой источник ODBC Настройка PolyBase для доступа к внешним данным с помощью универсальных типов ODBC SQL Server 2019 (15.x) и более поздние версии (Windows)

(Linux, начиная с SQL Server 2025 (17.x))

Подключитесь к хранилищу Blob Azure или ADLS Gen2

Платформа SQL Варианты проверки подлинности Guide
SQL Server 2022 (16.x) и более поздних версий Маркер SAS, ключ доступа, Управляемое удостоверение (начиная с SQL Server 2025 (17.x)) Настройка PolyBase для доступа к внешним данным в хранилище BLOB-объектов Azure
SQL Server 2019 (15.x) Ключ доступа (через соединитель Hadoop) Настройка PolyBase для доступа к внешним данным в хранилище BLOB-объектов Azure
База данных SQL Azure Маркер SAS, управляемая идентификация, переадресация Microsoft Entra Виртуализация данных с помощью базы данных SQL Azure (предварительная версия)
Управляемый экземпляр SQL Azure Токен SAS, управляемое удостоверение Виртуализация данных с помощью управляемого экземпляра Azure SQL

В SQL Server 2022 (16.x) префиксы URI изменились. При миграции с SQL Server 2019 (15.x) или более ранних версий:

  • Хранилище Blob Azure: изменить wasb[s]:// на abs://
  • ADLS 2-го поколения: переход abfs[s]:// на adls://

Дополнительные сведения см. в статье "Настройка PolyBase для доступа к внешним данным в хранилище BLOB-объектов Azure".

Подключение к хранилищу объектов, совместимое с S3

SQL Server 2022 (16.x) и более поздних версий поддерживают хранилище, совместимое с S3, например Amazon S3, MinIO и Ceph.

Дополнительные сведения см. в статье Настройка PolyBase для доступа к внешним данным в совместимом с S3 хранилище объектов.

Экспорт данных с помощью CREATE EXTERNAL TABLE AS SELECT CETAS

CETAS экспортирует результаты запросов во внешние файлы (Parquet или CSV) в хранилище BLOB-объектов Azure, ADLS 2-го поколения или в хранилище, совместимом с S3.

Платформа SQL Поддерживается Форматы экспорта Примечания
SQL Server 2022 (16.x) и более поздние версии. Экспорт в ADLS Gen2 с CETAS требует версии SQL Server 2022 CU5 или более поздней. Да Parquet, CSV Требуется конфигурация сервера: разрешить экспорт polybase.
Управляемый экземпляр SQL Azure Да Parquet, CSV Отключен по умолчанию
База данных SQL Azure Нет Нет Недоступно
База данных SQL в Fabric Нет Нет Недоступно
  • SQL Server 2022 и более поздние версии поддерживают CETAS и экспортируют файлы Parquet и CSV. Параметр Конфигурация сервера: разрешить экспорт PolyBase обязателен. Экспорт CETAS в ADLS Gen2 недоступен в релизах SQL Server 2022 до CU5.
  • Управляемый экземпляр SQL Azure поддерживает CETAS и экспортирует файлы Parquet и CSV. Руководство «Отключено по умолчанию» описывает его состояние по умолчанию.
  • База данных SQL Azure не поддерживает CETAS.
  • SQL-база данных в Fabric не поддерживает CETAS.

Справочник по Transact-SQL см. в разделе CREATE EXTERNAL TABLE AS SELECT (CETAS).

Примеры быстрого запуска

Пример 1. Разовый запрос к файлу Parquet (OPENROWSET)

Внешняя таблица не требуется. Работает над SQL Server 2022 (16.x) и более поздними версиями, Базой данных SQL Azure, Управляемым экземпляром SQL Azure и базой данных SQL в Fabric.

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
    FORMAT = 'PARQUET'
) AS [result];

Пример 2: Внешняя таблица для CSV в Blob-хранилище Azure

Этот пример работает на всех SQL-платформах, поддерживающих внешние таблицы поверх CSV-файлов.

  • Шаг 1. Создание главного ключа базы данных (DMK). Этот шаг необходим, так как учетные данные хранят секрет маркера SAS. Однако этот шаг можно пропустить, если вы используете Managed Identity или аутентификацию Microsoft Entra.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
    
  • Шаг 2: Создайте аутентификационные данные с помощью токена SAS. Опустить ведущий ?.

    CREATE DATABASE SCOPED CREDENTIAL MyStorageCred
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
         SECRET = '<your_SAS_token>'; -- omit the leading '?'
    
  • Шаг 3. Создание внешнего источника данных.

    CREATE EXTERNAL DATA SOURCE MyAzureStorage
    WITH (
        LOCATION = 'abs://mycontainer@mystorageaccount.blob.core.windows.net',
        CREDENTIAL = MyStorageCred
    );
    
  • Шаг 4. Создание формата файла для CSV-файла.

    CREATE EXTERNAL FILE FORMAT CsvFormat
    WITH (
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS (
            FIELD_TERMINATOR = ',',
            STRING_DELIMITER = '"',
            FIRST_ROW = 2
        )
    );
    
  • Шаг 5. Создание внешней таблицы.

    CREATE EXTERNAL TABLE dbo.SalesExternal
    (
        OrderId INT,
        OrderDate DATE,
        Amount DECIMAL (18, 2),
        Customer NVARCHAR (100)
    )
    WITH (
        DATA_SOURCE = MyAzureStorage,
        LOCATION = '/data/sales/',
        FILE_FORMAT = CsvFormat
    );
    
  • Шаг 6. Запрос внешней таблицы.

    SELECT *
    FROM dbo.SalesExternal
    WHERE OrderDate >= '2025-01-01';
    

Пример 3. Запрос таблицы в другом SQL Server

Этот пример работает в SQL Server 2019 (15.x) и более поздних версиях.

  • Шаг 1. Создание главного ключа базы данных (обязательно, так как учетные данные хранят пароль).

    CREATE MASTER KEY ENCRYPTION
    BY PASSWORD = '<password>';
    
  • Шаг 2. Создание учетных данных для удаленного экземпляра SQL Server.

    CREATE DATABASE SCOPED CREDENTIAL RemoteSqlCred
    WITH IDENTITY = 'remote_user',
         SECRET = '<password>';
    
  • Шаг 3. Создание внешнего источника данных.

    CREATE EXTERNAL DATA SOURCE RemoteSqlServer
    WITH (
        LOCATION = 'sqlserver://remote-server.contoso.com',
        PUSHDOWN = ON,
        CREDENTIAL = RemoteSqlCred
    );
    
  • Шаг 4. Создание внешней таблицы (трехкомпонентное имя в LOCATION).

    CREATE EXTERNAL TABLE dbo.RemoteCustomers
    (
        CustomerId INT,
        CustomerName NVARCHAR (200)
            COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    WITH (
        DATA_SOURCE = RemoteSqlServer,
        LOCATION = 'SalesDB.dbo.Customers'
    );
    
  • Шаг 5. Запрос между серверами.

    SELECT c.CustomerName,
           s.Amount
    FROM dbo.RemoteCustomers AS c
         INNER JOIN dbo.LocalSales AS s
             ON c.CustomerId = s.CustomerId;
    

Пример 4. Экспорт результатов в Parquet с помощью CETAS

Работает с SQL Server 2022 (16.x) и более поздними версиями, Управляемым экземпляром SQL Azure.

  • Шаг 1. Включение CETAS (только SQL Server).

    EXECUTE sp_configure 'allow polybase export', 1;
    RECONFIGURE;
    
  • Шаг 2. Создание учетных данных и источника данных (повторное использование из предыдущих примеров).

  • Шаг 3. Создание формата файла для экспорта Parquet.

    CREATE EXTERNAL FILE FORMAT ParquetFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
  • Шаг 4. Экспорт результатов запроса.

    CREATE EXTERNAL TABLE dbo.Sales2025Export
    WITH (
        DATA_SOURCE = MyAzureStorage,
        LOCATION = '/exports/sales_2025.parquet',
        FILE_FORMAT = ParquetFormat
    ) AS
    SELECT *
    FROM Sales.Orders
    WHERE OrderDate >= '2025-01-01';
    

Стандартные блоки T-SQL для PolyBase

Прежде чем реализовать любой сценарий, ознакомьтесь с основными объектами T-SQL, которые используют PolyBase и как они соответствуют друг другу:

Схема с объектами PolyBase Transact-SQL и их связями.

Схема, показывающая объекты PolyBase T-SQL и их взаимосвязи: от аутентификации (главный ключ базы данных, учетные данные) через источники данных и форматы файлов к методам запросов (внешняя таблица, OPENROWSET, BULK INSERT, CETAS).

Полный справочник Transact-SQL для всех объектов см. в справочнике по Transact-SQL PolyBase.

Это важно

Проверьте сопоставление типов данных для вашего внешнего формата файла. При создании внешнего формата файлов или запроса файлов с помощью OPENROWSETPolyBase автоматически сопоставляет типы исходных данных (Parquet, CSV, Delta, Oracle, Teradata, MongoDB) с типами данных SQL Server. Несогласованные типы могут привести к автоматическому и незаметному усечению, потере точности или ошибкам в запросах. Например, Parquet DECIMAL(38,18) сопоставляется с элементом DECIMAL(18,0). Просмотрите таблицы сопоставления перед определением столбцов внешней таблицы или клаузой WITH. Для полной справки см. Сопоставление типов PolyBase.

Когда тебе нужно CREATE MASTER KEY?

Главный ключ базы данных (DMK) создается с помощью CREATE MASTER KEY синтаксиса. DMK шифрует секреты, хранящиеся в учетных данных базы данных. Это необходимо только в том случае, если учетные данные содержат значение секрета, то есть если он хранит пароль, маркер или ключ доступа.

  • DMK необходим (учетные данные содержат секрет):

    Тип аутентификации Значение IDENTITY Имеет секрет DMK
    Маркер SAS 'SHARED ACCESS SIGNATURE' Да Обязательный
    Ключ доступа S3 'S3 ACCESS KEY' Да Обязательный
    Вход SQL / обычная проверка подлинности '<username>' Да Обязательный
    Ключ доступа к учетной записи хранения '<storage_account_name>' Да Обязательный
    • Учетная запись токена SAS использует IDENTITY = 'SHARED ACCESS SIGNATURE' и хранит секретное значение, поэтому требуется мастер-ключ базы данных.
    • Учётные данные ключа доступа S3 используют IDENTITY = 'S3 ACCESS KEY' и хранят секретное значение, поэтому требуется главный ключ базы данных.
      • Вход в SQL или базовый учетный код аутентификации использует IDENTITY = '<username>' и хранит секретное значение, поэтому требуется мастер-ключ базы данных.
    • Ключ доступа к аккаунту хранения использует IDENTITY = '<storage_account_name>' и хранит секретное значение, поэтому требуется мастер-ключ базы данных.
  • DMK не требуется (секрет не хранится)

    Тип аутентификации Значение IDENTITY Имеет секрет DMK
    Управляемая идентичность 'Managed Identity' Нет Не требуется
    Майкрософт Ентра айди 'User Identity' или 'Managed Identity' Нет Не требуется
    • Учетные данные управляемой идентификации используют IDENTITY = 'Managed Identity' и не хранят секрет, поэтому не требуют главного ключа базы данных.
    • Учетные данные Microsoft Entra ID используют IDENTITY = 'User Identity' или IDENTITY = 'Managed Identity' и не хранят секретных данных, поэтому главный ключ базы данных не требуется.

Подсказка

Если в вашем CREATE DATABASE SCOPED CREDENTIAL заявлении нет секрета, вам не нужен DMK. Управляемая идентификация и проверка подлинности через Microsoft Entra ID передают доверие платформе. База данных не хранит пароли или маркеры.

Примеры:

В этом примере запроса требуется DMK (учетные данные хранят токен SAS).

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL SasCred
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = '<your_SAS_token>';

В этом примере запроса DMK не требуется (управляемое удостоверение, без секрета).

CREATE DATABASE SCOPED CREDENTIAL ManagedIdentityCred
WITH IDENTITY = 'Managed Identity';

В этом примере запроса DMK не требуется (сквозная передача Microsoft Entra без использования секрета).

CREATE DATABASE SCOPED CREDENTIAL EntraIdCred
WITH IDENTITY = 'User Identity';

Удаленный доступ к данным с помощью OPENROWSET и внешних таблиц

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

Подход Синтаксис подключается к Аутентификация Службы PolyBase Платформы
Запросы OLE DB OPENROWSET(provider, connection, query) Любой источник OLE DB с помощью MSOLEDBSQL, SQLOLEDB или других поставщиков Проверка подлинности SQL, проверка подлинности Windows, Microsoft Entra ID (MSOLEDBSQL) Нет SQL Server (все поддерживаемые версии)
Файловые запросы в SQL Server 2022 (16.x) и SQL Server 2019 (15.x) OPENROWSET(BULK ...) Файлы на локальном диске, в сети или в облаке (Azure Blob, ADLS, S3, OneLake) Маркер SAS, ключ доступа, управляемое удостоверение, идентификатор Microsoft Entra Да, для облака 1; Нет для локального SQL Server 2022 (16.x) и SQL Server 2019 (15.x)
Файловые запросы в SQL Server 2025 (17.x) и более поздних версиях OPENROWSET(BULK ...) Файлы на локальном диске, в сети или в облаке (Azure Blob, ADLS, S3, OneLake) Маркер SAS, ключ доступа, управляемое удостоверение, идентификатор Microsoft Entra Нет SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Fabric
Соединители PolyBase CREATE EXTERNAL TABLE с помощью CREATE EXTERNAL DATA SOURCE, sqlserver://, oracle://, teradata://, mongodb://, odbc:// Удаленный SQL Server, Oracle, Teradata, MongoDB, источники ODBC Только аутентификация SQL Да SQL Server 2019 (15.x) и более поздних версий (Windows); SQL Server 2025 (17.x) и более поздних версий (Linux)

1 Для доступа к облачным файлам в SQL Server 2022 (16.x) необходимо установить функцию PolyBase.

  • Запросы OLE DB используются OPENROWSET(provider, connection, query) для подключения к любому исходнику OLE DB через MSOLEDBSQL, SQLOLEDB или другого провайдера на всех поддерживаемых версиях SQL Server. Они поддерживают SQL-аутентификацию, проверка подлинности Windows и Microsoft Entra ID с MSOLEDBSQL и не требуют установки сервисов PolyBase.
  • Файловые запросы используются OPENROWSET(BULK ...) для чтения файлов на локальном диске, сетевых ресурсах или облачном хранилище, таком как Хранилище BLOB-объектов Azure, ADLS, S3 или OneLake, используя токен SAS, ключ доступа, управляемую идентичность или Microsoft Entra ID. Они поддерживаются для локальных и сетевых файлов в версиях SQL Server 2005 и позднее, для облачных файлов в SQL Server 2022 (16.x) и более поздних версиях, а также в База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database in Fabric. Файловые запросы не требуют сервисов PolyBase для локальных файлов или облачных файлов в SQL Server 2022 (16.x) и более поздних версиях.
  • Коннекторы PolyBase используют CREATE EXTERNAL TABLE с CREATE EXTERNAL DATA SOURCE и расположение oracle://, sqlserver://, teradata://, mongodb:// или odbc:// для подключения к удалённым источникам SQL Server, Oracle, Teradata, MongoDB или ODBC. Для них требуется аутентификация SQL и сервисы PolyBase в SQL Server 2019 (15.x) и более поздних версиях на Windows и SQL Server 2025 (17.x) и более поздних версиях на Linux. Дополнительные сведения см. в разделе CREATE EXTERNAL DATA SOURCE (Transact-SQL).

Когда следует использовать каждый подход

Используйте OLE DB OPENROWSET для:

  • Используйте OLE DB OPENROWSET для быстрых, одноразовых ad hoc запросов без создания постоянных объектов.
  • Используйте OLE DB OPENROWSET для Microsoft Entra ID или управляемой идентификационной аутентификации через MSOLEDBSQL.
  • Используйте OLE DB OPENROWSET , чтобы избежать зависимостей сервисов PolyBase.
  • Используйте OLE DB OPENROWSET для подключения к любому источнику данных, у которого есть OLE DB провайдер.

Используйте файл OPENROWSET(BULK) для:

  • Используйте файлы OPENROWSET(BULK ...) для ad hoc исследования файлов и поиска схем.
  • Используйте файл OPENROWSET(BULK ...) для быстрых превращений и предпросмотров, прежде чем решаться на определение таблицы.
  • Используйте файл OPENROWSET(BULK ...) для гибких преобразований встраиваемых столбцов, таких как кастинг, фильтрация и вычисленные столбцы.
  • Используйте файл OPENROWSET(BULK ...) для данных, которые редко меняются и не требуют постоянных метаданных.

Используйте коннекторы PolyBase с CREATE EXTERNAL TABLE для:

  • Используйте коннекторы PolyBase с CREATE EXTERNAL TABLE для постоянных, многократно используемых определений таблиц, к которым могут обращаться несколько пользователей или приложений.
  • Используйте соединители PolyBase с CREATE EXTERNAL TABLE для производственных нагрузок, где требуется сбор статистики и оптимизация планов запросов.
  • Используйте соединители PolyBase с CREATE EXTERNAL TABLE для выполнения pushdown-вычислений в удалённых источниках, таких как Oracle и SQL Server.
  • Используйте коннекторы PolyBase с CREATE EXTERNAL TABLE для общего управления и безопасности; после создания таблицы пользователям требуется только разрешение SELECT.
  • Используйте соединители PolyBase с CREATE EXTERNAL TABLE, если для удалённого источника доступна проверка подлинности SQL.

OPENROWSET (OLE DB) — нерегламентированные удаленные запросы (не требуются службы PolyBase)

Форма OPENROWSET OLE DB подключается к удаленному источнику данных через поставщика OLE DB, выполняет сквозной запрос и возвращает результаты в виде набора строк. Это одноразовая, временная альтернатива связанному серверу. Постоянные метаданные не создаются. Этот синтаксис не требует служб PolyBase и не поддерживает облачные файлы или внешние источники данных.

В этом примере запрос подключается к удаленному SQL Server через OLE DB (а не PolyBase).

SELECT *
FROM OPENROWSET (
    'MSOLEDBSQL',
    'Server=remote-server;Database=AdventureWorks;Trusted_Connection=yes;',
    'SELECT TOP 10 * FROM AdventureWorks.Sales.SalesOrderHeader'
);

OPENROWSET(BULK) — запросы на основе файлов (PolyBase)

Форма BULKOPENROWSET считывает данные непосредственно из файлов. В SQL Server 2019 (15.x) и более ранних версиях он считывается из локальных или UNC-путей к файлам и требует файла форматирования. В SQL Server 2022 (16.x) и более поздних версиях можно читать из облачного хранилища с помощью параметров DATA_SOURCE и FORMAT. Этот подход представляет собой интегрированную версию PolyBase для виртуализации данных.

В контексте PolyBase и виртуализации данных, когда это руководство ссылается на OPENROWSET, это означает синтаксис OPENROWSET(BULK ...) с конструкцией FORMAT для выполнения запросов к внешним файлам.

Примеры:

В этом примере запрос считывает файл Parquet из Хранилище BLOB-объектов Azure (SQL Server 2022 и более поздних версий).

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'data/sales/*.parquet',
    DATA_SOURCE = 'MyAzureStorage',
    FORMAT = 'PARQUET'
) AS [result];

В этом примере запрос считывает файл Parquet с встроенным путем (База данных SQL Azure, Управляемый экземпляр SQL Azure).

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
    FORMAT = 'PARQUET'
) AS [result];

Когда следует использовать OPENROWSET и внешние таблицы

Обе OPENROWSET(BULK ...) и внешние таблицы позволяют запрашивать внешние данные с помощью T-SQL, но они предназначены для различных вариантов использования. В следующей таблице приведены основные различия, которые помогут вам решить, какой подход соответствует вашему сценарию.

Функциональность OPENROWSET(BULK ...) Внешняя таблица
Purpose Нерегламентированное исследование и однократные запросы Постоянное, повторное определение таблицы
Метаданные, хранящиеся в базе данных Нет. Ничего не сохраняется после выполнения запроса Да. Определение таблицы, источник данных и формат файла хранятся в виде объектов базы данных
Определение схемы Определяется автоматически из файла (Parquet) или задается в коде с использованием WITH выражения. Определяется явным образом в инструкции CREATE EXTERNAL TABLE
Разрешения Требуется ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS После создания стандартные SELECT права доступа для таблицы будут достаточно
Вычисляемые столбцы Да. Добавьте выражения и вычисляемые столбцы в SELECT список; такие функции метаданных, как filename() и filepath() доступны только здесь. Нет. Фиксированный список столбцов; выполнение преобразований в представлении или запросе, считывающего внешнюю таблицу
Статистика Управляемый экземпляр SQL Azure: ручная одноколоночная статистика через sys.sp_create_openrowset_statistics. См. руководство по статистике OPENROWSET.

SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure, база данных SQL в Fabric: автоматическое создание статистики для предикатов. Ручная OPENROWSET статистика не поддерживается на SQL Server.
Полная CREATE STATISTICS поддержка на всех платформах, а также автоматическое создание в SQL Server 2022 (16.x) и более поздних версиях. См. статью "Создание статистики внешней таблицы вручную".
Сдвиг вниз Ограниченная поддержка. Подсистема может отправлять фильтры вниз к сканированию файла, но нет pushdown для удаленных источников RDBMS Да. Поддерживает вычисления pushdown для соединителей RDBMS (SQL Server, Oracle, Teradata, MongoDB)
лучше всего подходит для Исследование данных, обнаружение схем, запросы прототипа, одноразовая загрузка данных, гибкие преобразования Рабочие нагрузки, повторяющиеся запросы, общий доступ между пользователями, панелями мониторинга и отчетами
  • OPENROWSET(BULK ...) лучше всего подходит для случайного исследования и единичных запросов, а внешняя таблица лучше подходит для постоянных, многократно используемых определений таблиц.
  • OPENROWSET(BULK ...) не сохраняет метаданные в базе данных после выполнения запроса, тогда как внешняя таблица хранит определение таблицы, источник данных и формат файла в виде объектов базы данных.
  • OPENROWSET(BULK ...) автоматически определяет схему по файлу Parquet или задаёт её непосредственно с помощью предложения WITH, тогда как во внешней таблице схема явно задаётся в операторе CREATE EXTERNAL TABLE.
  • OPENROWSET(BULK ...) требует ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS, тогда как внешняя таблица может быть запрошена пользователями, которым требуется стандартное SELECT разрешение только после появления таблицы.
  • OPENROWSET(BULK ...) поддерживает вычисляемые столбцы в запросе и функции метаданных, такие как filename() и filepath(), тогда как внешняя таблица имеет фиксированный набор столбцов и требует преобразований в представлении или в запросе, который читает внешнюю таблицу.
  • OPENROWSET(BULK ...)имеет ограниченную поддержку статистики: Azure SQL SQL Managed Instance может использовать sys.sp_create_openrowset_statistics для одностолбцевой статистики, но SQL Server 2022 (16.x) и более поздние версии, База данных SQL Azure и SQL Database in Fabric автоматически создают статистику по предикатам. Ручная OPENROWSET статистика не поддерживается на SQL Server, База данных SQL Azure и SQL Database в Fabric. Внешняя таблица поддерживает полные CREATE STATISTICS возможности на всех платформах, а также автоматическую статистику в SQL Server 2022 (16.x) и более поздних версиях, База данных SQL Azure и SQL Database в Fabric. Смотрите статистику OPENROWSET, созданную вручную и создание вручную статистики для внешней таблицы.
  • OPENROWSET(BULK ...) имеет ограниченные возможности проталкивания вычислений и не поддерживает проталкивание в удалённые источники RDBMS, в то время как внешняя таблица поддерживает проталкивание вычислений для коннекторов к RDBMS.
  • OPENROWSET(BULK ...) Лучше всего подходит для анализа данных, поиска схем, прототипирования, одноразовых загрузок и гибких преобразований, а внешняя таблица — для производственных нагрузок, повторяющихся запросов, общего доступа, дашбордов и отчетности.

Использование OPENROWSET при необходимости гибкости

Используется OPENROWSET для изучения файла, тестирования различных схем или добавления вычисляемых столбцов и преобразований без создания постоянных объектов. Например, можно извлечь путь к файлу в виде столбца, привести типы данных в виде встроенных или отфильтровать вычисляемых выражений в одном запросе.

В этом примере запроса содержатся вычисляемые столбцы и преобразования:

SELECT result.filename() AS [FileName],
       result.filepath(1) AS [Year],
       result.filepath(2) AS [Month],
       CAST (OrderDate AS DATE) AS OrderDate,
       Amount,
       OrderDate
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*/*/*/*.parquet',
    FORMAT = 'PARQUET'
) AS result
WHERE result.filepath(1) = '2025';

Подсказка

Функции filepath() и filename() доступны в Базе данных SQL Azure, Управляемом экземпляре SQL Azure и SQL Server 2022 (16.x) и более поздних версиях. Они позволяют фильтровать части пути к файлу (исключение секций) и отображать имя исходного файла в виде столбца, что невозможно с внешними таблицами напрямую.

Использование внешних таблиц при необходимости сохраняемости и управления

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

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

Этот пример запроса создает статистику во внешней таблице для улучшения планов запросов.

CREATE STATISTICS Stats_OrderDate
ON dbo.SalesExternal(OrderDate)
WITH FULLSCAN;

Дополнительные сведения о статистике обоих подходов см. в разделе "Рекомендации по производительности PolyBase— статистика".

BULK INSERT vs. OPENROWSET(BULK): Какой из них следует использовать?

Оба BULK INSERT и OPENROWSET(BULK ...) импортируют данные из файлов в SQL Server, используя одну и ту же базовую подсистему массовой загрузки. Однако они отличаются синтаксисом, гибкостью и тем, что можно сделать с результатами. В следующей таблице приведены основные различия.

Замечание

Отдельная инструкция BULK INSERT не поддерживается в базе данных SQL в Fabric. Для поглощения данных используйте INSERT ... SELECTOPENROWSET(BULK ...) против OneLake.

Функциональность BULK INSERT OPENROWSET(BULK ...)
Основная цель Загружает данные из файла непосредственно в целевую таблицу Возвращает набор строк, который используется в инструкции SELECT или INSERT ... SELECT.
Шаблон использования Автономное выражение: BULK INSERT <table> FROM '<file>' Необходимо использовать внутри запроса: SELECT * FROM OPENROWSET(BULK ...) или INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...)
Требуется целевая таблица? Да. Всегда записывает данные непосредственно в таблицу Нет. Его можно SELECT использовать без вставки куда-либо или вставить в любую таблицу или временную таблицу.
Преобразования столбцов во время загрузки Ограниченная поддержка. Потоки данных из файла в таблицу как есть (сопоставление, управляемое файлом форматирования или порядком столбцов). Полная поддержка. Выражения, фильтры, CASTWHEREJOIN другие таблицы и вычисляемые столбцы можно добавить в окружающую среду.SELECT
Хинты таблицы Предложение WITH включает поддержку BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK и многое другое Поддерживает подсказки таблицы, используя синтаксис INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...)
Импорт больших объектов (LOB) с одним значением Не поддерживаются Да. Поддерживает SINGLE_BLOB, SINGLE_CLOBSINGLE_NCLOB чтобы импортировать весь файл как одно значение varbinary(max), varchar(max), или nvarchar(max)
Форматирование файлов Да. Поддерживается с помощью (XML и других форматов) Да. Поддерживается (XML и не XML)
Доступ к файлам в облаке DATA_SOURCEподдерживает Хранилище BLOB-объектов Azure в SQL Server 2017 (14.x) и более поздних версиях, База данных SQL Azure и Управляемый экземпляр SQL Azure. SQL Server 2019 CU11 и более поздние обновления также поддерживают ADLS Gen2. Совместимое с S3 хранилище не поддерживается. DATA_SOURCEподдерживает Хранилище BLOB-объектов Azure в SQL Server 2017 (14.x) и более поздних версиях, ADLS Gen2 в SQL Server 2019 CU11 и более поздних версиях, а также совместимое с S3 хранилище в SQL Server 2022 (16.x) и более поздних версиях. База данных SQL Azure и Управляемый экземпляр SQL Azure поддерживают Хранилище BLOB-объектов Azure и ADLS Gen2. База данных SQL в Fabric поддерживает OneLake и внешнее хранилище через ярлыки OneLake.
Файлы Parquet или Delta Не поддерживается. Только CSV/разделенный текст Да. SQL Server 2022 (16.x) и более поздние версии, Управляемый экземпляр SQL Azure и База данных SQL Azure поддерживают FORMAT = 'PARQUET' и FORMAT = 'DELTA'; а база данных SQL в Fabric поддерживает FORMAT = 'PARQUET', но не DELTA. Дополнительные сведения см. в статье OPENROWSET BULK (Transact-SQL).
Необходимое разрешение ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS, а также INSERT в целевой таблице ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS
Минимальное ведение журнала Да. Поддерживается в простых или массовых моделях восстановления с помощью TABLOCK Да. Поддерживается при использовании с INSERT ... SELECT и TABLOCK
  • BULK INSERT загружает данные из файла непосредственно в целевую таблицу, тогда как OPENROWSET(BULK ...) возвращает набор строк, который можно использовать в инструкции SELECT или INSERT ... SELECT.
  • BULK INSERT является самостоятельной инструкцией, в то время как OPENROWSET(BULK ...) должен использоваться внутри запроса, например SELECT * FROM OPENROWSET(BULK ...) или INSERT INTO <table> SELECT * FROM OPENROWSET(BULK ...).
  • BULK INSERT всегда записывает напрямую в целевую таблицу, тогда как OPENROWSET(BULK ...) может SELECT из файла, не вставляя данные никуда, или вставлять их в какую-либо таблицу или временную таблицу.
  • BULK INSERT имеет ограниченную поддержку преобразований столбцов, поскольку данные поступают из файла в таблицу в неизменном виде, а сопоставление задаётся файлом формата или порядком столбцов. OPENROWSET(BULK ...) поддерживает выражения, CAST, фильтры JOIN, элементы SELECT и вычисляемые столбцы в окружающем WHERE.
  • BULK INSERT использует WITH выражение для BATCHSIZE, CHECK_CONSTRAINTS, FIRE_TRIGGERS, KEEPIDENTITY, KEEPNULLS, TABLOCK и других подсказок. OPENROWSET(BULK ...) поддерживает табличные указания с помощью INSERT ... SELECT * FROM OPENROWSET(BULK ...) WITH (TABLOCK, IGNORE_CONSTRAINTS, ...).
  • BULK INSERT не поддерживает импорт крупных объектов с одним значением. OPENROWSET(BULK ...) поддерживает SINGLE_BLOB, SINGLE_CLOB и SINGLE_NCLOB для импорта всего файла как одного значения varbinary(max), varchar(max) или nvarchar(max) соответственно.
  • И BULK INSERT, и OPENROWSET(BULK ...) поддерживают файлы в формате XML и не XML.
  • Для доступа к облачным файлам с BULK INSERT, DATA_SOURCE параметр поддерживает Хранилище BLOB-объектов Azure в SQL Server 2017 (14.x) и более поздних версиях, База данных SQL Azure и Управляемый экземпляр SQL Azure. SQL Server 2019 CU11 и более поздние обновления также поддерживают ADLS Gen2, но BULK INSERT не поддерживают совместимое с S3 хранилище. Для OPENROWSET(BULK ...), DATA_SOURCE поддерживает Хранилище BLOB-объектов Azure в SQL Server 2017 (14.x) и более поздних версиях, ADLS Gen2 в SQL Server 2019 CU11 и более поздних версиях, а также совместимое с S3 хранилище в SQL Server 2022 (16.x) и более поздних версиях. База данных SQL Azure и Управляемый экземпляр SQL Azure поддерживают Хранилище BLOB-объектов Azure и ADLS Gen2. База данных SQL в Fabric поддерживает OneLake и внешнее хранилище через ярлыки OneLake.
  • BULK INSERT не поддерживает файлы Parquet или Delta и поддерживает только CSV или разделённый текст. OPENROWSET(BULK ...) FORMAT = 'PARQUET' FORMAT = 'DELTA' поддерживает SQL Server 2022 (16.x) и более поздние версии База данных SQL Azure и Управляемый экземпляр SQL Azure. SQL-база данных в Fabric поддерживаетFORMAT = 'PARQUET', но не FORMAT = 'DELTA'. Дополнительные сведения см. в статье OPENROWSET BULK (Transact-SQL).
  • для BULK INSERT требуются ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS, а также разрешение INSERT для целевой таблицы, тогда как для OPENROWSET(BULK ...) требуется ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS.
  • BULK INSERT Поддерживает минимальное логирование в простой или массовой модели восстановления с TABLOCK. OPENROWSET(BULK ...) Поддерживает минимальное логирование при использовании с INSERT ... SELECT и TABLOCK.

Когда выбрать BULK INSERT

Используйте BULK INSERT при простой загрузке файлов в таблицу и не требуется преобразовывать, фильтровать или присоединять данные во время импорта. Он использует более простой синтаксис для CSV-файлов или других файлов с разделителями:

В этом примере запрос загружает CSV-файл из хранилища BLOB-объектов Azure непосредственно в таблицу.

BULK INSERT Sales.Invoices
FROM 'invoices/inv-2025-01.csv'
WITH (
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
);

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

BULK INSERT dbo.Products
FROM 'C:\Data\products.csv'
WITH (
    FORMATFILE = 'C:\Data\products.fmt',
    FIRSTROW = 2,
    TABLOCK
);

Когда следует выбрать OPENROWSET(BULK)

Используйте OPENROWSET(BULK ...), если требуется выполнение одного или нескольких следующих условий:

  • Используйте OPENROWSET(BULK ...), чтобы запрашивать данные файла или предварительно просматривать их без предварительного создания таблицы.
  • Используйте OPENROWSET(BULK ...) для преобразования, фильтрации или объединения данных во время импорта.
  • Используйте OPENROWSET(BULK ...) для загрузки файлов Parquet или Delta, потому что BULK INSERT они не поддерживают эти форматы.
  • Используйте OPENROWSET(BULK ...), чтобы импортировать весь файл как одно значение LOB с помощью SINGLE_BLOB, SINGLE_CLOB или SINGLE_NCLOB.

В этом примере запрос предварительно просматривает CSV-файл из хранилища BLOB-объектов Azure без вставки данных в любом месте.

SELECT TOP 10 *
FROM OPENROWSET (
    BULK 'invoices/inv-2025-01.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2,
    FIELDTERMINATOR = ','
) AS src;

В этом примере запрос вставляет данные с преобразованием и фильтрацией.

INSERT INTO Sales.Invoices (InvoiceDate, Amount, Customer)
SELECT CAST (InvoiceDate AS DATE),
       Amount * 1.1, -- Apply a 10% markup
       UPPER(Customer)
FROM OPENROWSET (
    BULK 'invoices/inv-2025-01.csv',
    DATA_SOURCE = 'MyAzureBlobStorage',
    FORMAT = 'CSV',
    FIRSTROW = 2
) WITH (
    InvoiceDate VARCHAR (10),
    Amount DECIMAL (18, 2),
    Customer VARCHAR (100)
) AS src
WHERE Amount IS NOT NULL;

В этом примере запроса файл Parquet загружается, что невозможно сделать с помощью BULK INSERT.

INSERT INTO Sales.Invoices
SELECT *
FROM OPENROWSET (
    BULK 'data/invoices/*.parquet',
    DATA_SOURCE = 'MyAzureStorage',
    FORMAT = 'PARQUET') AS src;

В этом примере запрос импортирует весь XML-файл в виде одного значения varbinary(max ).

INSERT INTO dbo.XmlDocuments (DocContent)
SELECT BulkColumn
FROM OPENROWSET (
    BULK 'C:\Data\catalog.xml',
    SINGLE_BLOB
) AS x;

Подсказка

Один из способов — начать с OPENROWSET(BULK ...) в SELECT для изучения и проверки данных файла, а затем перейти к BULK INSERT для окончательной загрузки на производстве, если преобразования вам не нужны. Если вам нужна поддержка Parquet или Delta или встроенная фильтрация, оставайтесь с OPENROWSET.

Дополнительные сведения см. в следующих руководствах.

Полезные функции метаданных

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

filepath() и filename()

Функции filepath() и filename() возвращают части пути к файлу или имени файла для каждой строки в результирующем наборе. Они особенно полезны для:

  • Устранение секций: фильтрация по сегментам папок (например, разделов года или месяца или дня), поэтому модуль считывает только соответствующие файлы, а не сканирует все.

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

Функция Возвраты Пример
filename() Имя файла (включая расширение) исходного файла для каждой строки sales_2025_01.parquet
filepath(N) Сегмент папки N из строки с подстановочными знаками (*) на пути BULK, где N начинается с 1 Для пути sales/2025/01/*.parquetfilepath(1) возвращает 2025, filepath(2) возвращает 01

Область применения: База данных SQL Azure, Управляемый экземпляр SQL Azure, SQL Server 2022 (16.x) и более поздние версии, база данных SQL в Fabric.

В этом примере запрос используется filepath() для устранения секций и filename() определения исходных файлов. Он считывает только файлы в папке /2025/ и считывает только файлы в подпапке /06/ .

SELECT result.filename() AS SourceFile,
       result.filepath(1) AS [Year],
       result.filepath(2) AS [Month],
       *
FROM OPENROWSET (
    BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*/*/*.parquet',
    FORMAT = 'PARQUET'
) AS result
WHERE result.filepath(1) = '2025' 
      AND result.filepath(2) = '06';

Подсказка

Поместите filepath() фильтры в WHERE предложение, а не в вложенный запрос или CTE. Если фильтр находится в WHERE предложении, подсистема может выполнять ликвидацию секций на уровне сканирования файлов, что значительно снижает количество операций ввода-вывода.

sp_describe_first_result_set — обнаружение типов столбцов OPENROWSET

При использовании OPENROWSET с файлами Parquet подсистема автоматически выводит типы данных столбцов (вывод схемы). Выводимые типы могут быть больше, чем необходимо. Например, символьные столбцы часто выводятся как varchar(8000), так как метаданные Parquet не включают максимальную длину. Этот выбор может снизить производительность и использовать больше памяти.

Используйте sp_describe_first_result_set для проверки выводимых схем перед завершением запроса. После просмотра выводимых типов укажите более узкие типы в WITH предложении для повышения производительности.

  • Шаг 1. Проверка выводимой схемы.

    EXECUTE sp_describe_first_result_set N'
    SELECT *
    FROM OPENROWSET(
        BULK ''abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet'',
        FORMAT = ''PARQUET''
    ) AS result';
    

    В выходных данных отображаются имя каждого столбца, выводимый тип данных, максимальная длина, точность и масштабирование. Если вы видите varchar(8000) там, где varchar(100) было бы достаточно, замените его.

  • Шаг 2. Используйте явные типы для повышения производительности.

    SELECT TOP 100 *
    FROM OPENROWSET (
        BULK 'abs://mycontainer@mystorageaccount.blob.core.windows.net/data/sales/*.parquet',
        FORMAT = 'PARQUET'
    ) WITH (
        OrderId INT,
        OrderDate DATE,
        Amount DECIMAL (18, 2),
        Customer VARCHAR (100) -- much narrower than the inferred varchar(8000)
    ) AS result;
    

Вывод схемы работает только с файлами Parquet. Для CSV-файлов всегда указывайте определения столбцов в WITH предложении (для OPENROWSET) или в инструкции CREATE EXTERNAL TABLE . sp_describe_first_result_set это общая процедура для SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure и базы данных SQL в Fabric, но она особенно полезна для OPENROWSET-запросов. Для получения дополнительной информации см. sp_describe_first_result_set.

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

После реализации виртуализации данных используйте эти руководства для оптимизации производительности, диагностики проблем и обеспечения готовности рабочей среды:

Area Статья Сведения
Производительность PolyBase Рекомендации по производительности в PolyBase для SQL Server Статистика, сдвиг вниз, параллелизм и управление памятью
Выталкивающее вычисление Вычисления pushdown в PolyBase Указывает, какие операции будут отправляться в удаленный источник.
Как определить, произошла ли операция pushdown Как определить, случился ли внешний pushdown Планы запросов и DAM
Troubleshooting Мониторинг и устранение неполадок PolyBase Распространенные ошибки и способы их устранения
Подключение Kerberos Устранение неполадок с подключением PolyBase к Kerberos
Вопросы и ответы Часто задаваемые вопросы о PolyBase
Ошибки и решения Ошибки в PolyBase и возможные решения