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


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

Относится к: SQL Server 2016 (13.x) и более поздние версии Azure SQL DatabaseAzure SQL Managed InstanceSQL 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 и как они соответствуют друг другу:

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

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

Дополнительные сведения об этих инструкциях T-SQL см. в следующих статье:

Полный справочник 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.

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

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

При запросе внешних файлов с 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 и возможные решения