Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Относится к: SQL Server 2016 (13.x) и более поздние версии
Azure SQL Database
Azure SQL Managed Instance
SQL Database в Microsoft Fabric
Виртуализация данных позволяет выполнять запросы Transact-SQL (T-SQL) по внешним данным, не загружая их в базу данных. PolyBase — это компонент ядра СУБД, который реализует виртуализацию данных в SQL Server и SQL Azure. Вы определяете внешний источник данных, необязательный формат файла и внешнюю таблицу, а затем запрашиваете внешнюю таблицу, SELECT как и любую другую таблицу.
Это руководство поможет вам:
- Узнайте, какие функции PolyBase поддерживаются вашей платформой SQL и версией.
- Выберите между
OPENROWSET, внешними таблицами илиBULK INSERTдля обработки или приема данных. - Следуйте пошаговым инструкциям для распространенных задач.
- Ознакомьтесь с рекомендациями по повышению производительности, устранению неполадок и рекомендациям для рабочих нагрузок.
Распространенные варианты использования
В следующей таблице описаны возможные сценарии использования.
| Сценарий | Использование |
|---|---|
| Спонтанное исследование файлов | OPENROWSET(BULK ...) |
| Повторно используемый файл для запросов в бизнес-аналитике и отчетности | Внешние таблицы по файлам |
| Межбазовый запрос (SQL Server, Oracle, Teradata, MongoDB, ODBC) | Соединители PolyBase с внешними таблицами |
| Экспорт результатов запроса в файлы |
CREATE EXTERNAL TABLE AS SELECT (CETAS) |
| Массовый прием в таблицы |
BULK INSERT или OPENROWSET(BULK ...) с INSERT ... SELECT |
Какие функции доступны где?
В следующей таблице показано, какие основные функции PolyBase и виртуализации данных доступны на каждой платформе SQL. Используйте эту таблицу, чтобы определить, что можно сделать на платформе, прежде чем использовать подробные руководства.
| Функция | 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-го поколения | Нет | Да | Да | Да | Да | Нет |
| Подключение к хранилищу, совместимое с 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://). Учетные данные, имеющие область действия базы данных, предназначены для конечной точки базы данных Azure SQL, такие же шаги, как при подключении к другому SQL Server.
Поддерживается аутентификация с управляемым удостоверением для подключения к хранилищу BLOB-объектов Azure (ABS) и ADLS уровня 2. Для этого требуется SQL Server с поддержкой Azure Arc или SQL Server на виртуальной машине Azure для локального SQL Server. Она изначально доступна в Azure SQL Database и Azure SQL Managed Instance.
Замечание
Начиная с SQL Server 2025 (17.x), запросы к файлам данных (CSV, Parquet и Delta) в хранилище Azure Blob Storage, 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 Azure и Управляемого экземпляра SQL Azure Нет для экземпляров SQL Server |
| Соединители постоянных данных |
CREATE EXTERNAL TABLE с sqlserver://, oracle://и teradata://т. д. |
Для производственной среды требуется регулярный доступ, управление, статистика и pushdown вычисления. | Только аутентификация SQL | Да |
Службы PolyBase необходимы для доступа к облачным файлам в SQL Server 2019 (15.x) и SQL Server 2022 (16.x). SQL Server 2025 (17.x) и более поздних версий имеют встроенную поддержку CSV, Parquet и Delta без PolyBase.
Рекомендации по принятию решений
| Сценарий | Recommendation |
|---|---|
| Мне требуется проверка подлинности с идентификатором Microsoft Entra для удаленного SQL или я хочу избежать использования служб PolyBase. | Использовать OPENROWSET(MSOLEDBSQL, ...) (специальные, без постоянных объектов) |
| Мне нужны постоянные таблицы, статистические данные или вычисления с использованием pushdown для удаленных баз данных. | Используйте 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. |
Выбор сценария
Теперь, когда вы понимаете три подхода, используйте одно из следующих руководств для реализации конкретного варианта использования.
Файлы запросов (Parquet, CSV или Delta)
Если ваши данные находятся в файлах Parquet, CSV или Delta в объектах Azure Blob Storage, 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 |
Вы также можете выполнить одно из следующих пошаговых руководств.
| Руководство | Описание |
|---|---|
| Начало работы с 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> |
Подсказка
Коннектор SQL Server также sqlserver:// работает для Azure SQL Database и Azure SQL Managed Instance. Выполните те же действия и задайте LOCATION для конечной точки SQL Azure (например, 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) и более поздних версий | Да | Parquet, CSV | Требуется конфигурация сервера: разрешить экспорт polybase |
| Управляемый экземпляр SQL Azure | Да | Parquet, CSV | Отключен по умолчанию |
| База данных SQL Azure | Нет | Нет | Недоступно |
| База данных SQL в Fabric | Нет | Нет | Недоступно |
Справочник по 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, поддерживающих PolyBase.
Шаг 1. Создание главного ключа базы данных (DMK). Этот шаг необходим, так как учетные данные хранят секрет маркера SAS. Однако этот шаг можно выполнить, если вы используете управляемое удостоверение или проверку подлинности Microsoft Entra.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_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 = '<strong_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 и как они соответствуют друг другу:
Схема, показывающая объекты T-SQL PolyBase и их связи, от проверки подлинности (главный ключ базы данных, учетные данные) через источники данных и форматы файлов для запроса методов (внешняя таблица, OPENROWSET, BULK INSERT, CETAS).
Дополнительные сведения об этих инструкциях T-SQL см. в следующих статье:
- СОЗДАТЬ ВНЕШНИЙ ИСТОЧНИК ДАННЫХ
- СОЗДАТЬ ВНЕШНИЙ ФОРМАТ ФАЙЛА
- СОЗДАТЬ ВНЕШНЮЮ ТАБЛИЦУ
- OPENROWSET
- Создать внешнюю таблицу как SELECT (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>'Да Обязательный DMK не требуется (секрет не хранится)
Тип аутентификации Значение IDENTITYИмеет секрет DMK Управляемая идентичность 'Managed Identity'Нет Не требуется Майкрософт Ентра айди 'User Identity'или'Managed Identity'Нет Не требуется
Подсказка
Если в заявлении CREATE DATABASE SCOPED CREDENTIAL нет тайны, вам не нужен DMK. Управляемая идентификация и проверка подлинности через Microsoft Entra ID передают доверие платформе. База данных не хранит пароли или маркеры.
Примеры:
В этом примере запроса требуется DMK (учетные данные хранят токен SAS).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_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 (все поддерживаемые версии) |
| Запросы к файлам | OPENROWSET(BULK ...) |
Файлы на локальном диске, в сети или в облаке (Azure Blob, ADLS, S3, OneLake) | Маркер SAS, ключ доступа, управляемое удостоверение, идентификатор Microsoft Entra | Да для облака*; Нет для локального | SQL Server 2005; SQL Server 2022 (16.x) и более поздних версий (облако); Azure SQL |
| Соединители 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) |
Службы PolyBase необходимы для доступа к облачным файлам в SQL Server 2019 (15.x) и SQL Server 2022 (16.x). SQL Server 2025 (17.x) и более поздние версии поддерживают собственные облачные файлы и больше не требуют PolyBase для работы с CSV, Parquet или Delta.
Когда следует использовать каждый подход
Используйте OLE DB OPENROWSET для:
- Быстрые однократные запросы без создания постоянных объектов
- Microsoft Entra ID или аутентификация управляемого удостоверения (через MSOLEDBSQL)
- Избегайте зависимостей служб PolyBase
- Подключение к любому источнику данных с помощью поставщика OLE DB
Используйте файл OPENROWSET(BULK) для:
- Нерегламентированное обнаружение файлов и обнаружение схем
- Быстрые преобразования и предварительные версии перед фиксацией в определении таблицы
- Встроенные преобразования гибких столбцов (приведение, фильтрация, вычисляемые столбцы)
- Данные, которые часто не изменяются и не требуют постоянных метаданных
Используйте соединители PolyBase с CREATE EXTERNAL TABLE для:
- Постоянные и повторно используемые определения таблиц, к которым обращается несколько пользователей или приложений
- Рабочие нагрузки, требующие оптимизации статистики и плана запросов
- Вычисление переноса для удаленных источников (перенос фильтров в Oracle, SQL Server и т. д.)
- После создания общего управления и обеспечения безопасности пользователям нужно только
SELECTразрешение. - При наличии проверки подлинности 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 из Azure Blob Storage (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; SQL Server 2022 (16.x) и более поздних версиях: автосоздание статистики по предикатам (без ручной статистики в SQL Server). См. руководство по статистике OPENROWSET. |
Полная CREATE STATISTICS поддержка на всех платформах, а также автоматическое создание в SQL Server 2022 (16.x) и более поздних версиях. См. статью "Создание статистики внешней таблицы вручную". |
| Сдвиг вниз | Ограниченная поддержка. Подсистема может отправлять фильтры вниз к сканированию файла, но нет pushdown для удаленных источников RDBMS | Да. Поддерживает вычисления pushdown для соединителей RDBMS (SQL Server, Oracle, Teradata, MongoDB) |
| лучше всего подходит для | Исследование данных, обнаружение схем, запросы прототипа, одноразовая загрузка данных, гибкие преобразования | Рабочие нагрузки, повторяющиеся запросы, общий доступ между пользователями, панелями мониторинга и отчетами |
Использование 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 и OPENROWSET(BULK): Какой из них следует использовать?
Оба BULK INSERT и OPENROWSET(BULK ...) импортируют данные из файлов в SQL Server, используя одну и ту же базовую подсистему массовой загрузки. Однако они отличаются синтаксисом, гибкостью и тем, что можно сделать с результатами. В следующей таблице приведены основные различия.
Замечание
BULK INSERT недоступно в базе данных SQL в Fabric. Используйте OPENROWSET(BULK ...) против OneLake в Fabric.
| Функциональность | 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) |
| Доступ к облачным файлам (хранилище BLOB-объектов Azure, ADLS 2-го поколения, S3) | Да. Поддерживается с помощью DATA_SOURCE параметра (SQL Server 2017 (14.x) и более поздних версий, SQL Azure) |
Да. Поддерживается с помощью DATA_SOURCE параметра или встроенного URL с помощью условия FORMAT (SQL Server 2022 (16.x) и более поздними версиями, Azure SQL). |
| Файлы Parquet или Delta | Не поддерживается. Только CSV/разделенный текст | Да. Поддерживается с FORMAT = 'PARQUET' или FORMAT = 'DELTA' (SQL Server 2022 (16.x) и более поздних версий, Azure SQL) |
| Необходимое разрешение |
ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS, а также INSERT в целевой таблице |
ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS |
| Минимальное ведение журнала | Да. Поддерживается в простых или массовых моделях восстановления с помощью TABLOCK |
Да. Поддерживается при использовании с 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 ...), если требуется выполнение одного или нескольких следующих условий:
- Запрос или предварительный просмотр данных файла без создания таблицы.
- Преобразование, фильтрация или присоединение данных во время импорта.
-
Загрузка файлов Parquet или Delta (поддерживает только
OPENROWSETэти форматы). -
Импортируйте весь файл в виде одного значения типа 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.
Дополнительные сведения см. в следующих руководствах.
- Использование BULK INSERT или OPENROWSET(BULK...) для импорта данных в SQL Server: подробное руководство по обеспечению безопасности.
-
Массовый импорт и экспорт данных (SQL Server) — обзор всех методов перемещения массовых данных (bcp,
BULK INSERT, ).OPENROWSET - BULK INSERT (Transact-SQL): полная ссылка на T-SQL.
- OPENROWSET BULK (Transact-SQL): полный справочник по T-SQL.
- Примеры массового доступа к данным в хранилище BLOB-объектов Azure. Примеры параллельного использования обоих методов с хранилищем Azure.
-
Массовый импорт данных больших объектов с помощью поставщика массового набора строк OPENROWSET (SQL Server)
SINGLE_BLOBSINGLE_CLOBиSINGLE_NCLOBпримеров. - Используйте файл форматирования для массового импорта данных (SQL Server): использование файла форматирования при обоих методах.
Полезные функции метаданных
При запросе внешних файлов с 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, но это особенно полезно для OPENROWSET запросов. Для получения дополнительной информации см. sp_describe_first_result_set.
Производительность, устранение неполадок и лучшие практики
После реализации виртуализации данных используйте эти руководства для оптимизации производительности, диагностики проблем и обеспечения готовности рабочей среды:
| Area | Статья | Сведения |
|---|---|---|
| Производительность PolyBase | Рекомендации по производительности в PolyBase для SQL Server | Статистика, сдвиг вниз, параллелизм и управление памятью |
| Выталкивающее вычисление | Вычисления pushdown в PolyBase | Указывает, какие операции будут отправляться в удаленный источник. |
| Как определить, произошла ли операция pushdown | Как определить, случился ли внешний pushdown | Планы запросов и DAM |
| Troubleshooting | Мониторинг и устранение неполадок PolyBase | Распространенные ошибки и способы их устранения |
| Подключение Kerberos | Устранение неполадок с подключением PolyBase к Kerberos | |
| Вопросы и ответы | Часто задаваемые вопросы о PolyBase | |
| Ошибки и решения | Ошибки в PolyBase и возможные решения |