Virtualización de datos con Azure SQL Managed Instance

Se aplica a: Azure SQL Managed Instance

La característica de virtualización de datos de Azure SQL Managed Instance permite ejecutar consultas de Transact-SQL (T-SQL) en archivos que almacenan datos en formatos de datos comunes en Azure Data Lake Storage Gen2 o Azure Blob Storage, y combinarlos con datos relacionales almacenados localmente mediante combinaciones. De este modo, puede acceder a los datos externos (en el modo de solo lectura) de manera transparente y conservar su formato y ubicación originales, un proceso que también se conoce como "virtualización de datos".

Información general

La virtualización de datos proporciona dos maneras de consultar archivos destinados a diferentes conjuntos de escenarios:

  • Sintaxis de OPENROWSET: optimizada para la consulta ad hoc de archivos. Por lo general, se usa para explorar rápidamente el contenido y la estructura de un conjunto nuevo de datos.
  • Sintaxis de CREATE EXTERNAL TABLE: optimizada para la consulta repetitiva de archivos con una sintaxis idéntica a la que existiría si los datos estuviesen almacenados localmente en la base de datos. La preparación de las tablas externas requiere de varios pasos en comparación con la sintaxis de OPENROWSET, pero permite controlar más el acceso a los datos. Por lo general, las tablas externas se utilizan para la generación de informes y cargas de trabajo analíticas.

En cualquier caso, se debe crear un origen de datos externo mediante la sintaxis CREATE EXTERNAL DATA SOURCE de Transact-SQL, como se muestra en este artículo.

También está disponible la sintaxis CREATE EXTERNAL TABLE AS SELECT para Azure SQL Managed Instance, a fin de poder exportar los resultados de una instrucción SELECT de T-SQL en archivos Parquet o CSV en Azure Blob Storage o Azure Data Lake Storage (ADLS) Gen2 y crear una tabla externa a partir de dichos archivos.

Formatos de archivo

Se admiten directamente los formatos de archivo Parquet y de texto delimitado (CSV). El formato de archivo JSON se admite indirectamente al especificar el formato de archivo CSV en el que las consultas devuelven cada documento como una fila independiente. Puede analizar las filas con JSON_VALUE y OPENJSON.

Tipos de almacenamiento

Los archivos se pueden almacenar en Azure Data Lake Storage Gen2 o Azure Blob Storage. Para consultar archivos, debe proporcionar la ubicación en un formato específico y usar el prefijo de tipo de ubicación correspondiente al tipo de origen externo y punto de conexión o protocolo, como los ejemplos siguientes:

--Blob Storage endpoint
abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet

--Data Lake endpoint
adls://<container>@<storage_account>.dfs.core.windows.net/<path>/<file_name>.parquet

Importante

El prefijo de tipo de ubicación proporcionado se usa para elegir el protocolo óptimo para la comunicación y aprovechar las funcionalidades avanzadas que ofrece el tipo de almacenamiento determinado. El uso del prefijo https:// genérico está deshabilitado. Use siempre prefijos específicos del punto de conexión.

Introducción

Si es primera vez que utiliza la virtualización de datos y quiere probar rápidamente la funcionalidad, empieza por consultar conjuntos de datos públicos en Azure Open Datasets, como el conjunto de datos Bing COVID-19, que permite un acceso anónimo.

Use los puntos de conexión siguientes para consultar los conjuntos de datos Bing COVID-19:

  • Parquet: abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet
  • CSV: abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv

Para empezar rápido, ejecute esta consulta de T-SQL sencilla para obtener la primera información sobre el conjunto de datos. Esta consulta usa OPENROWSET para consultar un archivo almacenado en una cuenta de almacenamiento disponible públicamente:

--Quick query on a file stored in a publicly available storage account:
SELECT TOP 10 *
FROM OPENROWSET(
 BULK 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet',
 FORMAT = 'parquet'
) AS filerows

Puede continuar la exploración del conjunto de datos anexando WHERE, GROUP BY y otras cláusulas basadas en el conjunto de resultados de la primera consulta.

Si se produce un error en la primera consulta en la instancia administrada, es probable que esa instancia tenga acceso restringido a cuentas de almacenamiento de Azure y debe comunicarse con el experto en redes para habilitar el acceso antes de poder continuar con la consulta.

Una vez que se haya familiarizado con la consulta de conjuntos de datos públicos, considere la posibilidad de cambiar a conjuntos de datos no públicos que requieren proporcionar credenciales, conceder derechos de acceso y configurar reglas de firewall. En muchos escenarios reales, operará principalmente con conjuntos de datos privados.

Acceso a cuentas de almacenamiento no públicas

Un usuario que haya iniciado sesión en una instancia administrada debe estar autorizado para acceder a los archivos almacenados y consultarlos en una cuenta de almacenamiento no pública. Los pasos de autorización dependen de cómo se autentica la instancia administrada en el almacenamiento. El tipo de autenticación y los parámetros relacionados no se proporcionan directamente con cada consulta. Se encapsulan en el objeto de credencial con ámbito de base de datos almacenado en la base de datos de usuario. La base de datos usa la credencial para acceder a la cuenta de almacenamiento en cualquier momento en que se ejecute la consulta. Instancia administrada de Azure SQL admite los dos tipos de autenticación siguientes:

Una identidad administrada es una característica de Microsoft Entra ID (anteriormente Azure Active Directory) que proporciona servicios de Azure, como Azure SQL Managed Instance, con una identidad administrada en Microsoft Entra ID. Esta identidad se puede usar para autorizar solicitudes de acceso a datos en cuentas de almacenamiento no públicas. Los servicios como Azure SQL Managed Instance tienen una identidad administrada asignada por el sistema y también pueden tener una o varias identidades administradas asignadas por el usuario. Puede usar identidades administradas asignadas por el sistema o identidades administradas asignadas por el usuario para la virtualización de datos con Azure SQL Managed Instance.

Para acceder a los datos, el administrador de almacenamiento de Azure primero debe conceder permisos a la identidad administrada. La concesión de permisos a la identidad administrada asignada por el sistema se realiza de la misma forma que la concesión de permisos a cualquier otro usuario de Microsoft Entra. Por ejemplo:

  1. En Azure Portal, en la página Control de acceso (IAM) de una cuenta de almacenamiento, seleccione Agregar asignación de roles.
  2. Elija el rol RBAC de Azure integrado Lector de datos de blobs de almacenamiento. Esto proporciona acceso de lectura a la identidad administrada para los contenedores necesarios de Azure Blob Storage.
    • En lugar de conceder el rol RBAC de Azure de Lector de datos de blobs de almacenamiento, también puede conceder permisos más específicos sobre un subconjunto de archivos. Todos los usuarios que necesitan acceso a archivos de lectura para algunos datos de este contenedor también deben tener el permiso Ejecutar sobre todas las carpetas principales hasta la raíz (el contenedor). Aprenda a establecer listas ACL en Azure Data Lake Storage Gen2.
  3. En la página siguiente, seleccione Asignar acceso a Identidad administrada. Elija + Seleccionar miembros y, en la lista desplegable Identidad administrada, seleccione la identidad administrada deseada. Para más información, consulte Asignación de roles de Azure mediante Azure Portal.
  4. La creación de credenciales con ámbito de base de datos para la autenticación de identidad administrada es sencilla. Tenga en cuenta en el ejemplo siguiente que 'Managed Identity' es una cadena codificada de forma rígida.
-- Optional: Create MASTER KEY if it doesn't exist in the database:
-- CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Some Very Strong Password Here>'
GO
CREATE DATABASE SCOPED CREDENTIAL MyCredential
WITH IDENTITY = 'Managed Identity'

Origen de datos externo

Un origen de datos externo es una abstracción que permite hacer referencia fácilmente a una ubicación de archivo en varias consultas. Para consultar ubicaciones públicas, lo único que debe especificar al crear un origen de datos externo es la ubicación del archivo:

CREATE EXTERNAL DATA SOURCE MyExternalDataSource
WITH (
    LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
)

Al acceder a cuentas de almacenamiento no públicas, junto con la ubicación, también debe hacer referencia a una credencial con ámbito de base de datos con parámetros de autenticación encapsulados. El script siguiente crea un origen de datos externo que apunta a la ruta de acceso del archivo y hace referencia a una credencial con ámbito de base de datos.

--Create external data source pointing to the file path, and referencing database-scoped credential:
CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
WITH (
    LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
        CREDENTIAL = [MyCredential];
)

Consulta de orígenes de datos mediante OPENROWSET

La sintaxis de OPENROWSET permite realizar consultas ad hoc instantáneas a la vez que solo se crea la cantidad mínima necesaria de objetos de base de datos.

OPENROWSET solo requiere crear el origen de datos externo (y, posiblemente, la credencial), a diferencia del enfoque de tabla externa, que requiere un formato de archivo externo y la tabla externa misma.

El valor del parámetro DATA_SOURCE se antepone automáticamente al parámetro BULK para formar la ruta de acceso completa al archivo.

Cuando utilice OPENROWSET, proporcione el formato del archivo, como en el ejemplo siguiente, en el que se consulta un archivo único:

SELECT TOP 10 *
FROM OPENROWSET(
 BULK 'bing_covid-19_data.parquet',
 DATA_SOURCE = 'MyExternalDataSource',
 FORMAT = 'parquet'
) AS filerows;

Consulta de varios archivos y carpetas

El comando OPENROWSET también permite consultar varios archivos o carpetas mediante el uso de caracteres comodín en la ruta de acceso BULK.

En el ejemplo siguiente, se usa el conjunto de datos abierto de registros de viajes NYC Yellow Taxi.

En primer lugar, cree el origen de datos externo:

--Create the data source first:
CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');

Ahora podemos consultar todos los archivos con la extensión .parquet en carpetas. Por ejemplo, aquí solo consultaremos los archivos que coincidan con un patrón de nombre:

--Query all files with .parquet extension in folders matching name pattern:
SELECT TOP 10 *
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet'
) AS filerows;

Cuando se consultan varios archivos o carpetas, todos los archivos a los que se accede con OPENROWSET único deben tener la misma estructura (como la misma cantidad de columnas y tipos de datos). Las carpetas no se pueden recorrer de manera recursiva.

Inferencia de esquemas

La inferencia automática de esquemas ayuda a escribir rápidamente consultas y a explorar los datos cuando no se conocen los esquemas de archivo. La inferencia de esquemas solo funciona con los archivos de formato Parquet.

Aunque es conveniente, los tipos de datos inferidos pueden ser mayores que los tipos de datos reales, ya que podría haber suficiente información en los archivos de origen para asegurarse de que se usa el tipo de datos adecuado. Esto puede provocar un rendimiento deficiente de las consultas. Por ejemplo, los archivos Parquet no contienen metadatos sobre la longitud máxima de la columna de caracteres, por lo que la instancia se infiere como varchar(8000).

Utilice el procedimiento almacenado sp_describe_first_results_set para comprobar los tipos de datos resultantes de su consulta, como en el ejemplo siguiente:

EXEC sp_describe_first_result_set N'
 SELECT
 vendorID, tpepPickupDateTime, passengerCount
 FROM
 OPENROWSET(
  BULK ''yellow/*/*/*.parquet'',
  DATA_SOURCE = ''NYCTaxiExternalDataSource'',
  FORMAT=''parquet''
 ) AS nyc';

Una vez que conoce los tipos de datos, puede especificarlos con la cláusula WITH para mejorar el rendimiento:

SELECT TOP 100
 vendorID, tpepPickupDateTime, passengerCount
FROM
OPENROWSET(
 BULK 'yellow/*/*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT='PARQUET'
 )
WITH (
vendorID varchar(4), -- we're using length of 4 instead of the inferred 8000
tpepPickupDateTime datetime2,
passengerCount int
) AS nyc;

Como el esquema de los archivos CSV no se puede determinar automáticamente, debe especificar siempre las columnas con la cláusula WITH:

SELECT TOP 10 id, updated, confirmed, confirmed_change
FROM OPENROWSET(
 BULK 'bing_covid-19_data.csv',
 DATA_SOURCE = 'MyExternalDataSource',
 FORMAT = 'CSV',
 FIRSTROW = 2
)
WITH (
 id int,
 updated date,
 confirmed int,
 confirmed_change int
) AS filerows;

Funciones de metadatos del archivo

Al consultar varios archivos o carpetas, puede usar las funciones filepath() y filename() para leer los metadatos de los archivos y obtener parte de la ruta de acceso (o la ruta de acceso completa) y el nombre del archivo del que se origina la fila del conjunto de resultados:

--Query all files and project file path and file name information for each row:
SELECT TOP 10 filerows.filepath(1) as [Year_Folder], filerows.filepath(2) as [Month_Folder],
filerows.filename() as [File_name], filerows.filepath() as [Full_Path], *
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet') AS filerows;
--List all paths:
SELECT DISTINCT filerows.filepath(1) as [Year_Folder], filerows.filepath(2) as [Month_Folder]
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet') AS filerows;

Cuando se la llama sin ningún parámetro, la función filepath() devuelve la ruta de acceso al archivo del que se origina la fila. Cuando se usa DATA_SOURCE en OPENROWSET, devuelve la ruta de acceso relativa a DATA_SOURCE; de lo contrario, devuelve la ruta de acceso completa al archivo.

Cuando se la llama con un parámetro, devuelve la parte de la ruta de acceso que coincide con el carácter comodín en la posición especificada del parámetro. Por ejemplo, el valor 1 del parámetro devolvería la parte de la ruta de acceso que coincide con el primer carácter comodín.

La función filepath() también se puede usar para filtrar y agregar filas:

SELECT
 r.filepath() AS filepath
 ,r.filepath(1) AS [year]
 ,r.filepath(2) AS [month]
 ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
DATA_SOURCE = 'NYCTaxiExternalDataSource',
FORMAT = 'parquet'
 ) AS r
WHERE
 r.filepath(1) IN ('2017')
 AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
 r.filepath()
 ,r.filepath(1)
 ,r.filepath(2)
ORDER BY
 filepath;

Creación de una vista sobre OPENROWSET

Puede crear y usar vistas para encapsular las consultas OPENROWSET a fin de reutilizar fácilmente la consulta subyacente:

CREATE VIEW TaxiRides AS
SELECT *
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet'
) AS filerows

También resulta conveniente agregar columnas con los datos de ubicación del archivo a una vista mediante la función filepath() para lograr un filtrado más sencillo y con mejor rendimiento. El uso de las vistas puede disminuir el número de archivos y la cantidad de datos que la consuma sobre la vista debe leer y procesar cuando se filtra en función de cualquiera de esas columnas:

CREATE VIEW TaxiRides AS
SELECT *
 , filerows.filepath(1) AS [year]
 , filerows.filepath(2) AS [month]
FROM OPENROWSET(
 BULK 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = 'NYCTaxiExternalDataSource',
 FORMAT = 'parquet'
) AS filerows

Las vistas también permiten que herramientas de informes y análisis, como Power BI, consuman los resultados de OPENROWSET.

Tablas externas

Las tablas externas encapsulan el acceso a los archivos, lo que hace que la experiencia de consulta sea casi idéntica a la consulta de datos relacionales almacenados en tablas de usuario. Para crear una tabla externa, se requiere el origen de datos externo y los objetos de formato de archivo externo:

--Create external file format
CREATE EXTERNAL FILE FORMAT DemoFileFormat
WITH (
 FORMAT_TYPE=PARQUET
)
GO

--Create external table:
CREATE EXTERNAL TABLE tbl_TaxiRides(
 vendorID VARCHAR(100) COLLATE Latin1_General_BIN2,
 tpepPickupDateTime DATETIME2,
 tpepDropoffDateTime DATETIME2,
 passengerCount INT,
 tripDistance FLOAT,
 puLocationId VARCHAR(8000),
 doLocationId VARCHAR(8000),
 startLon FLOAT,
 startLat FLOAT,
 endLon FLOAT,
 endLat FLOAT,
 rateCodeId SMALLINT,
 storeAndFwdFlag VARCHAR(8000),
 paymentType VARCHAR(8000),
 fareAmount FLOAT,
 extra FLOAT,
 mtaTax FLOAT,
 improvementSurcharge VARCHAR(8000),
 tipAmount FLOAT,
 tollsAmount FLOAT,
 totalAmount FLOAT
)
WITH (
 LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = NYCTaxiExternalDataSource,
 FILE_FORMAT = DemoFileFormat
);
GO

Una vez que se crea la tabla externa, puede consultarla tal como lo haría con cualquier otra tabla:

SELECT TOP 10 *
FROM tbl_TaxiRides;

Al igual que OPENROWSET, las tablas externas permiten consultar varios archivos y carpetas mediante el uso de caracteres comodín. No se admite la inferencia de esquemas con tablas externas.

Consideraciones de rendimiento

No hay ningún límite estricto en cuanto al número de archivos o la cantidad de datos que se pueden consultar, pero el rendimiento de la consulta depende de la cantidad de datos, el formato de los datos y la complejidad de las consultas y las combinaciones.

Consulta de datos con particiones

Los datos a menudo se organizan en subcarpetas también denominadas particiones. Puede indicar a una instancia administrada que consulte solo carpetas y archivos concretos. De este modo, se reduce el número de archivos y la cantidad de datos que la consulta tiene que leer y procesar, lo que proporciona un mejor rendimiento. Este tipo de optimización de consultas se conoce como eliminación de particiones. Puede eliminar las particiones de la ejecución de consultas mediante el uso de la función de metadatos filepath() en la cláusula WHERE de la consulta.

En el ejemplo de consulta siguiente se leen archivos de datos de NYC Yellow Taxi solo para los últimos tres meses de 2017:

SELECT
    r.filepath() AS filepath
    ,r.filepath(1) AS [year]
    ,r.filepath(2) AS [month]
    ,COUNT_BIG(*) AS [rows]
FROM OPENROWSET(
        BULK 'yellow/puYear=*/puMonth=*/*.parquet',
        DATA_SOURCE = 'NYCTaxiExternalDataSource',
        FORMAT = 'parquet'
    )
WITH (
    vendorID INT
) AS [r]
WHERE
    r.filepath(1) IN ('2017')
    AND r.filepath(2) IN ('10', '11', '12')
GROUP BY
    r.filepath()
    ,r.filepath(1)
    ,r.filepath(2)
ORDER BY
    filepath;

Si los datos almacenados no tienen particiones, considere la posibilidad de crear particiones para mejorar el rendimiento de las consultas.

Si usa tablas externas, se admiten las funciones filepath() y filename() pero no en la cláusula WHERE. Todavía puede filtrar por filename o filepath si se usan en columnas calculadas. En el siguiente ejemplo se muestra esto:

CREATE EXTERNAL TABLE tbl_TaxiRides (
 vendorID VARCHAR(100) COLLATE Latin1_General_BIN2,
 tpepPickupDateTime DATETIME2,
 tpepDropoffDateTime DATETIME2,
 passengerCount INT,
 tripDistance FLOAT,
 puLocationId VARCHAR(8000),
 doLocationId VARCHAR(8000),
 startLon FLOAT,
 startLat FLOAT,
 endLon FLOAT,
 endLat FLOAT,
 rateCodeId SMALLINT,
 storeAndFwdFlag VARCHAR(8000),
 paymentType VARCHAR(8000),
 fareAmount FLOAT,
 extra FLOAT,
 mtaTax FLOAT,
 improvementSurcharge VARCHAR(8000),
 tipAmount FLOAT,
 tollsAmount FLOAT,
 totalAmount FLOAT,
 [Year]  AS CAST(filepath(1) AS INT), --use filepath() for partitioning
 [Month]  AS CAST(filepath(2) AS INT) --use filepath() for partitioning
)
WITH (
 LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet',
 DATA_SOURCE = NYCTaxiExternalDataSource,
 FILE_FORMAT = DemoFileFormat
);
GO

SELECT *
      FROM tbl_TaxiRides
WHERE
      [year]=2017            
      AND [month] in (10,11,12);

Si los datos almacenados no tienen particiones, considere la posibilidad de crear particiones para mejorar el rendimiento de las consultas.

Estadísticas

La recopilación de estadísticas de los datos externos es una de las cosas más importantes que puede hacer para la optimización de las consultas. Cuanto más sepa la instancia sobre los datos, más rápido puede ejecutar consultas. El optimizador de consultas del motor de SQL está basado en el costo. Compara el costo de varios planes de consulta y elige el menor de ellos. En la mayoría de los casos, elige el plan que se ejecuta más rápidamente.

Creación automática de estadísticas

Azure SQL Managed Instance analiza las consultas de usuario entrantes para buscar las estadísticas que faltan. Si faltan las estadísticas, el optimizador de consultas crea automáticamente las estadísticas en columnas individuales en el predicado de consulta o en la condición de combinación para mejorar las estimaciones de cardinalidad del plan de consulta. La creación automática de estadísticas se realiza de forma sincrónica, por lo que puede suponer una ligera degradación del rendimiento de consulta si a las columnas les faltan estadísticas. El tiempo necesario para crear estadísticas de una sola columna depende del tamaño de los archivos de destino.

Estadísticas manuales de OPENROWSET

Las estadísticas de columna única para la ruta de acceso OPENROWSET se pueden crear con el procedimiento almacenado sys.sp_create_openrowset_statistics al pasar la consulta SELECT con una columna única como parámetro:

EXEC sys.sp_create_openrowset_statistics N'
SELECT pickup_datetime
FROM OPENROWSET(
 BULK ''abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/*.parquet'',
 FORMAT = ''parquet'') AS filerows
';

De manera predeterminada, la instancia utiliza el 100 % de los datos proporcionados en el conjunto de datos para crear estadísticas. También puede especificar el tamaño de la muestra como un porcentaje con las opciones TABLESAMPLE. A fin de crear estadísticas de columna única para varias columnas, ejecute sys.sp_create_openrowset_statistics para cada una de las columnas. No se pueden crear estadísticas de varias columnas para la ruta de acceso OPENROWSET.

Si desea actualizar las estadísticas existentes, anúlelas primero con el procedimiento almacenado sys.sp_drop_openrowset_statistics y, luego, vuelva a crearlas con sys.sp_create_openrowset_statistics:

EXEC sys.sp_drop_openrowset_statistics N'
SELECT pickup_datetime
FROM OPENROWSET(
 BULK ''abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/*.parquet'',
 FORMAT = ''parquet'') AS filerows
';

Estadísticas manuales de tablas externas

La sintaxis para crear estadísticas en tablas externas es similar a la que se utiliza para las tablas de usuario normales. Para crear estadísticas en una columna, indique un nombre para el objeto de estadísticas y el nombre de la columna:

CREATE STATISTICS sVendor
ON tbl_TaxiRides (vendorID)
WITH FULLSCAN, NORECOMPUTE;

Las opciones WITH son obligatorias y, para el tamaño de la muestra, las opciones permitidas son FULLSCAN y SAMPLE n por ciento.

  • A fin de crear estadísticas de columna única para varias columnas, ejecute CREATE STATISTICS para cada una de las columnas.
  • No se admiten estadísticas de varias columnas.

Solución de problemas

Por lo general, los problemas con la ejecución de consultas se deben a que la instancia administrada no puede acceder a la ubicación de los archivos. Los mensajes de error relacionados pueden informar de derechos de acceso insuficientes, una ubicación o ruta de acceso de archivo no existente, un archivo utilizado por otro proceso o que no se puede mostrar ese directorio. En la mayoría de los casos, esto indica que el acceso a los archivos está bloqueado por directivas de control de tráfico de red o debido a la falta de derechos de acceso. Revise lo siguiente:

  • Si la ruta de acceso a la ubicación es incorrecta o está mal escrita.
  • La validez de la clave SAS: es posible que haya expirado, puede contener un error tipográfico o quizás comienza con un signo de interrogación.
  • Permisos de clave SAS permitidos: como mínimo, permiso de lectura. También el permiso de lista, si se utilizan caracteres comodín.
  • Es posible que el tráfico entrante esté bloqueado en la cuenta de almacenamiento. Para más detalles, consulte el artículo sobre la administración de reglas de red virtual para Azure Storage y asegúrese de que está permitido el acceso desde la red virtual de instancia administrada.
  • Tráfico saliente bloqueado en la instancia administrada mediante la directiva de punto de conexión de almacenamiento. Permita el tráfico saliente a la cuenta de almacenamiento.
  • Derechos de acceso de Identidad administrada: asegúrese de que la identidad administrada de la instancia tiene derechos de acceso concedidos en la cuenta de almacenamiento.
  • El nivel de compatibilidad de la base de datos debe ser 130 o superior para que funcionen las consultas de virtualización de datos.

CREATE EXTERNAL TABLE AS SELECT (CETAS)

CREATE EXTERNAL TABLE AS SELECT (CETAS) le permite exportar datos de la instancia administrada de SQL a una cuenta de almacenamiento externa. Puede usar CETAS para crear una tabla externa a partir de archivos Parquet o CSV en Azure Blob Storage o Azure Data Lake Storage (ADLS) Gen2. CETAS también puede exportar, en paralelo, los resultados de una instrucción SELECT de T-SQL en la tabla externa creada. Existe la posibilidad de riesgo de filtración de datos con estas funcionalidades, por lo que CETAS está deshabilitado de forma predeterminada para Azure SQL Managed Instance. Para habilitarlo, consulte CREATE EXTERNAL TABLE AS SELECT (CETAS).

Limitaciones

Problemas conocidos

  • Cuando la parametrización para Always Encrypted está habilitada en SQL Server Management Studio (SSMS), las consultas de virtualización de datos generan un mensaje de error Incorrect syntax near 'PUSHDOWN'.