Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:Instância Gerenciada de SQL do Azure
Este artigo descreve o recurso de virtualização de dados da Instância Gerenciada de SQL do Azure. A virtualização de dados permite executar consultas Transact-SQL (T-SQL) em arquivos que armazenam dados em formatos de dados comuns no Azure Data Lake Storage Gen2 ou no Armazenamento de Blobs do Azure. Você pode combinar esses dados com dados relacionais armazenados localmente usando junções. Com a virtualização de dados, você pode acessar dados externos de forma transparente no modo somente leitura, mantendo-os em seu formato e local originais.
Visão geral
A virtualização de dados fornece duas maneiras de consultar arquivos destinados a diferentes conjuntos de cenários:
- Sintaxe OPENROWSET: otimizada para consulta ad hoc de arquivos. Normalmente usado para explorar rapidamente o conteúdo e a estrutura de um novo conjunto de arquivos.
- Sintaxe CREATE EXTERNAL TABLE: Otimizada para consulta repetitiva de arquivos usando sintaxe idêntica como se os dados fossem armazenados localmente no banco de dados. As tabelas externas exigem várias etapas de preparação em comparação com a sintaxe OPENROWSET, mas permitem mais controle sobre o acesso a dados. Use tabelas externas para cargas de trabalho analíticas e relatórios.
Em ambos os casos, crie uma fonte de dados externa usando a sintaxe T-SQL CREATE EXTERNAL DATA SOURCE , conforme demonstrado neste artigo.
A sintaxe CREATE EXTERNAL TABLE AS SELECT também está disponível para a Instância Gerenciada de SQL do Azure. Isso é para exportar os resultados de uma instrução T-SQL SELECT para os arquivos Parquet ou CSV no Armazenamento de Blobs do Azure ou no Azure Data Lake Storage (ADLS) Gen 2 e criar uma tabela externa sobre esses arquivos.
Formatos de arquivo
Os formatos de arquivo parquet e de texto delimitado (CSV) têm suporte direto. O formato de arquivo JSON tem suporte indiretamente especificando o formato de arquivo CSV em que as consultas retornam todos os documentos como uma linha separada. Você pode analisar linhas posteriormente usando JSON_VALUE e OPENJSON.
Tipos de armazenamento
Armazene arquivos no Azure Data Lake Storage Gen2 ou no Armazenamento de Blobs do Azure. Para consultar arquivos, forneça o local em um formato específico e use o prefixo de tipo de local que corresponde ao tipo de origem externa e ponto de extremidade ou protocolo, como os seguintes exemplos:
--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
O prefixo de tipo de local fornecido é usado para escolher o protocolo ideal para comunicação e usar quaisquer recursos avançados oferecidos pelo tipo de armazenamento específico.
O uso do prefixo genérico https:// está desabilitado. Sempre use prefixos específicos do ponto de extremidade.
Introdução
Se você não estiver familiarizado com a virtualização de dados e quiser testar rapidamente a funcionalidade, comece consultando os conjuntos de dados públicos disponíveis nos Conjuntos de Dados Abertos do Azure, como o conjunto de dados COVID-19 do Bing que permite acesso anônimo.
Use os seguintes pontos de extremidade para consultar os conjuntos de dados de COVID-19 do Bing:
- Parquete:
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 um início rápido, execute uma consulta T-SQL para obter as primeiras informações sobre o conjunto de dados. Essa consulta usa OPENROWSET para consultar um arquivo armazenado em uma conta de armazenamento disponível publicamente:
--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
Você pode continuar a exploração do conjunto de dados acrescentando WHERE, GROUP BYe outras cláusulas com base no conjunto de resultados da primeira consulta.
Se a primeira consulta falhar em sua instância gerenciada de SQL, essa instância provavelmente terá acesso restrito às contas de armazenamento do Azure. Converse com seu especialista em rede para habilitar o acesso antes de prosseguir com a consulta.
Quando estiver familiarizado com a consulta de conjuntos de dados públicos, considere alternar para conjuntos de dados não públicos que exigem fornecer credenciais, conceder direitos de acesso e configurar regras de firewall. Em muitos cenários do mundo real, você opera principalmente com conjuntos de dados privados.
Acesso a contas de armazenamento não públicas
Um usuário que entra em uma instância gerenciada de SQL deve estar autorizado a acessar e consultar arquivos armazenados em uma conta de armazenamento não pública. As etapas de autorização dependem de como a instância gerenciada do SQL se autentica na conta de armazenamento. O tipo de autenticação e quaisquer parâmetros relacionados não são fornecidos diretamente com cada consulta. O objeto de credencial com escopo de banco de dados armazenado no banco de dados do usuário encapsula essas informações. O banco de dados usa a credencial para acessar a conta de armazenamento sempre que a consulta é executada.
A Instância Gerenciada de SQL do Azure dá suporte aos seguintes tipos de autenticação:
- Identidade gerenciada
- SAS (assinatura de acesso compartilhado)
Uma identidade gerenciada é um recurso do Microsoft Entra ID (antigo Azure Active Directory) que fornece serviços do Azure, como a Instância Gerenciada de SQL do Azure, com uma identidade gerenciada no Microsoft Entra ID. Você pode usar essa identidade para autorizar solicitações de acesso a dados em contas de armazenamento não públicas. Serviços como a Instância Gerenciada de SQL do Azure têm uma identidade gerenciada atribuída pelo sistema e também podem ter uma ou mais identidades gerenciadas atribuídas pelo usuário. Você pode usar identidades gerenciadas atribuídas pelo sistema ou identidades gerenciadas atribuídas pelo usuário para virtualização de dados com a Instância Gerenciada de SQL do Azure.
Para acessar os dados, o administrador do armazenamento do Azure deve primeiro conceder permissões para a identidade gerenciada. Conceda permissões à identidade gerenciada atribuída pelo sistema da instância gerenciada do SQL da mesma forma que concede permissões a qualquer outro usuário do Microsoft Entra. Por exemplo:
- No portal do Azure, na página Controle de Acesso (IAM) de uma conta de armazenamento, selecione Adicionar atribuição de função.
- Escolha a função RBAC do Azure interna do Leitor de Dados do Blob de Armazenamento. Essa função fornece acesso de leitura à identidade gerenciada para os contêineres necessários do Armazenamento de Blobs do Azure.
- Em vez de conceder à identidade gerenciada a função RBAC do Azure de Leitor de Dados de Blob de Armazenamento, você também pode conceder permissões mais granulares em um subconjunto de arquivos. Todos os usuários que precisam de acesso à leitura de arquivos individuais nesses dados também devem ter permissão Executar em todas as pastas pai até a raiz (o contêiner). Para obter mais informações, consulte Definir ACLs no Azure Data Lake Storage Gen2.
- Na página seguinte, selecione Atribuir acesso aIdentidade gerenciada. Selecione + Selecionar membros e, na lista suspensa Identidade gerenciada, selecione a identidade gerenciada desejada. Para obter mais informações, confira Atribuir funções do Azure usando o portal do Azure.
- Em seguida, crie a credencial com escopo de banco de dados para autenticação de identidade gerenciada. Observe no exemplo a seguir que
'Managed Identity'é uma cadeia de caracteres embutida em código.
-- 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'
Fonte de dados externa
Uma fonte de dados externa é uma abstração que fornece uma referência fácil a um local de arquivo em várias consultas. Para consultar locais públicos, especifique o local do arquivo ao criar uma fonte de dados externa:
CREATE EXTERNAL DATA SOURCE MyExternalDataSource
WITH (
LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
)
Para acessar contas de armazenamento não públicas, especifique o local e referencie uma credencial com escopo de banco de dados com parâmetros de autenticação encapsulados. O script a seguir cria uma fonte de dados externa que aponta para o caminho do arquivo e faz referência a uma credencial com escopo de banco de dados:
-- Create external data source that points to the file path, and that references a 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];
)
Consultar fontes de dados usando OPENROWSET
A sintaxe OPENROWSET permite a consulta ad hoc instantânea, ao mesmo tempo que cria apenas o número mínimo de objetos de banco de dados necessários.
O OPENROWSET requer apenas a criação da fonte de dados externa (e possivelmente a credencial), em oposição à abordagem de tabela externa, que requer um formato de arquivo externo e a própria tabela externa.
O valor do parâmetro DATA_SOURCE é automaticamente anexado ao parâmetro EM MASSA para formar o caminho completo para o arquivo.
Ao usar OPENROWSET, forneça o formato do arquivo, como o exemplo a seguir, que consulta um único arquivo:
SELECT TOP 10 *
FROM OPENROWSET(
BULK 'bing_covid-19_data.parquet',
DATA_SOURCE = 'MyExternalDataSource',
FORMAT = 'parquet'
) AS filerows;
Consultar vários arquivos e pastas
O comando OPENROWSET também permite consultar vários arquivos ou pastas usando curingas no caminho EM MASSA.
O exemplo a seguir usa o conjunto de dados aberto dos registros de viagem de táxi amarelo NYC.
Em primeiro lugar, crie a fonte de dados externa:
--Create the data source first:
CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');
Agora, você pode consultar todos os arquivos com .parquet extensão em pastas. Por exemplo, a consulta a seguir é apenas para os arquivos que correspondem a um padrão de nome:
--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;
Ao consultar vários arquivos ou pastas, todos os arquivos acessados com o único OPENROWSET devem ter a mesma estrutura (como o mesmo número de colunas e tipos de dados). As pastas não podem ser percorridas recursivamente.
Inferência de esquema
A inferência automática de esquemas ajuda a escrever rapidamente consultas e explorar dados quando você não conhece os esquemas de arquivos. A inferência de esquema funciona apenas com arquivos parquet.
Embora conveniente, os tipos de dados inferidos podem ser maiores do que os tipos de dados reais, pois pode não haver informações suficientes nos arquivos de origem para garantir que o tipo de dados apropriado seja usado. Isso pode levar a um baixo desempenho de consulta. Por exemplo, os arquivos parquet não possuem metadados que indiquem o comprimento máximo das colunas de caracteres, de forma que a instância os infere como varchar(8000).
Use o procedimento armazenado sp_describe_first_results_set para verificar os tipos de dados resultantes da sua consulta, como o exemplo a seguir:
EXEC sp_describe_first_result_set N'
SELECT
vendorID, tpepPickupDateTime, passengerCount
FROM
OPENROWSET(
BULK ''yellow/*/*/*.parquet'',
DATA_SOURCE = ''NYCTaxiExternalDataSource'',
FORMAT=''parquet''
) AS nyc';
Depois de conhecer os tipos de dados, especifique-os usando a cláusula para melhorar o WITH desempenho:
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 o esquema de arquivos CSV não pode ser determinado automaticamente, sempre especifique colunas usando a WITH cláusula:
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;
Funções de metadados de arquivo
Ao consultar vários arquivos ou pastas, você pode usar as funções filepath() e filename() para ler metadados de arquivo e obter parte do caminho ou caminho completo e o nome do arquivo do qual a linha no conjunto de resultados se origina:
--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;
Quando chamada sem um parâmetro, a função filepath() retorna o caminho do arquivo de onde a linha se origina. Quando DATA_SOURCE é usado no OPENROWSET, ele retorna o caminho relativo ao DATA_SOURCE, caso contrário, ele retorna o caminho de arquivo completo.
Quando chamada com um parâmetro, ela retorna parte do caminho correspondente ao caractere curinga na posição especificada no parâmetro. Por exemplo, o valor do parâmetro 1 retorna uma parte do caminho que corresponde ao primeiro curinga.
A função filepath() também pode ser usada para filtrar e agregar linhas:
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;
Criar exibição com base na OPENROWSET
É possível criar e usar modos de exibição para encapsular consultas OPENROWSET para que você possa facilmente reutilizar a consulta subjacente:
CREATE VIEW TaxiRides AS
SELECT *
FROM OPENROWSET(
BULK 'yellow/puYear=*/puMonth=*/*.parquet',
DATA_SOURCE = 'NYCTaxiExternalDataSource',
FORMAT = 'parquet'
) AS filerows
Também é conveniente adicionar colunas com os dados do local do arquivo a uma exibição usando a função filepath() para uma filtragem mais fácil e de alto desempenho. O uso de exibições pode reduzir o número de arquivos e a quantidade de dados que a consulta executada sobre a exibição precisa ler e processar quando filtrada por qualquer uma dessas colunas.
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
As exibições também permitem que ferramentas analíticas e de relatório, como Power BI, consumam os resultados de OPENROWSET.
Tabelas externas
Tabelas externas encapsulam o acesso a arquivos, portanto, consultá-los parece quase o mesmo que consultar dados relacionais locais armazenados em tabelas de usuário. Para criar uma tabela externa, você precisa ter uma fonte de dados externa e objetos de formato de arquivo externos configurados.
--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
Depois de criar a tabela externa, você pode consultá-la como qualquer outra tabela:
SELECT TOP 10 *
FROM tbl_TaxiRides;
Por exemplo OPENROWSET, as tabelas externas dão suporte à consulta de vários arquivos e pastas com curingas. No entanto, as tabelas externas não dão suporte à inferência de esquema.
Considerações sobre o desempenho
Não há limite rígido para o número de arquivos ou a quantidade de dados que você pode consultar, mas o desempenho da consulta depende da quantidade de dados, do formato de dados, da forma como os dados são organizados e da complexidade das consultas e junções.
Consultar dados particionados
Os dados geralmente são organizados em subpastas, também chamadas de partições. Você pode instruir a instância gerenciada de SQL a consultar apenas pastas e arquivos específicos. Isso reduz o número de arquivos e a quantidade de dados que a consulta precisa ler e processar, resultando em melhor desempenho. Esse tipo de otimização de consulta é conhecido como poda de partição ou eliminação de partição. Você pode eliminar partições da execução da consulta usando a filepath() função WHERE de metadados na cláusula da consulta.
O exemplo a seguir consulta arquivos de dados de Táxis amarelos em NYC relativos somente aos últimos três 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;
Se os dados armazenados não forem particionados, considere particioná-los para aprimorar o desempenho da consulta.
Se você estiver usando tabelas externas, as funções filepath() e filename() têm suporte, mas não na cláusula WHERE. Você ainda pode filtrar por filename ou filepath se usá-las em colunas computadas, como o exemplo a seguir demonstra:
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);
Se os dados armazenados não forem particionados, considere particioná-los para aprimorar o desempenho da consulta.
Estatísticas
Coletar estatísticas sobre seus dados externos é uma das coisas mais importantes que você pode fazer para a otimização de consultas. Quanto mais a instância souber sobre seus dados, mais rapidamente ele poderá executar consultas. O otimizador de consulta do mecanismo de SQL é um otimizador baseado no custo. Ele compara o custo de vários planos de consulta e, em seguida, escolhe o plano com o menor custo. Na maioria dos casos, ele escolhe o plano que será executado mais rapidamente.
Criação automática de estatísticas
A Instância Gerenciada de SQL do Azure analisa as consultas de usuário recebidas em busca de estatísticas ausentes. Se faltarem estatísticas, o otimizador de consulta criará automaticamente estatísticas sobre colunas individuais no predicado da consulta ou na condição de junção a fim de melhorar as estimativas da cardinalidade para o plano de consulta. A criação automática de estatísticas é feita de forma síncrona. Portanto, você pode ter um desempenho de consulta ligeiramente degradado se suas colunas estiverem faltando estatísticas. O tempo para criar estatísticas para uma única coluna depende do tamanho do arquivo de destino.
Estatísticas de OPENROWSET manual
As estatísticas de coluna única para o caminho OPENROWSET podem ser criadas usando o procedimento armazenado sys.sp_create_openrowset_statistics, passando a consulta select com uma única coluna 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
';
Por padrão, a instância usa 100% dos dados fornecidos no DataSet para criar estatísticas. Opcionalmente, você pode especificar o tamanho da amostra como um percentual usando as opções TABLESAMPLE. Para criar estatísticas de coluna única para várias colunas, execute sys.sp_create_openrowset_statistics para cada uma das colunas. Não é possível criar estatísticas de várias colunas para o caminho OPENROWSET.
Para atualizar as estatísticas existentes, remova-as primeiro usando o sys.sp_drop_openrowset_statistics procedimento armazenado e, em seguida, recrie-as usando 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
';
Estatísticas manuais da tabela externa
A sintaxe para a criação de estatísticas em tabelas externas é semelhante à usada para tabelas de usuário comuns. Para criar estatísticas em uma coluna, forneça um nome para o objeto de estatísticas e o nome da coluna:
CREATE STATISTICS sVendor
ON tbl_TaxiRides (vendorID)
WITH FULLSCAN, NORECOMPUTE;
As opções WITH são obrigatórias e, para o tamanho da amostra, as opções permitidas são FULLSCAN e SAMPLE n percentual.
- Para criar estatísticas de coluna única para várias colunas, execute
CREATE STATISTICSpara cada uma das colunas. - Não há suporte para estatísticas de várias colunas.
Solucionar problemas
Problemas com a execução da consulta normalmente ocorrem quando a instância gerenciada de SQL não pode acessar o local do arquivo. Mensagens de erro relacionadas podem relatar direitos de acesso insuficientes, um local que não existe, um arquivo sendo usado por outro processo ou que o diretório não pode ser listado. Na maioria dos casos, esses erros indicam que as políticas de controle de tráfego de rede bloqueiam o acesso aos arquivos ou o usuário não tem direitos de acesso. Verifique os seguintes itens:
- Caminho do local errado ou digitado incorretamente.
- Validade da chave SAS. Pode ter expirado, conter um erro de digitação ou começar com um ponto de interrogação.
- Permissões de chave SAS permitidas. Leia no mínimo, e Liste se curingas forem usados.
- Tráfego de entrada bloqueado na conta de armazenamento. Verifique Gerenciamento de Regras de Rede Virtual para o Armazenamento do Azure para obter detalhes e certifique-se de que o acesso da VNet da instância gerenciada de SQL está permitido.
- Tráfego de saída bloqueado na instância gerenciada de SQL usando a política de ponto de extremidade de armazenamento. Permitir o tráfego de saída para a conta de armazenamento.
- Direitos de acesso à identidade gerenciada. Verifique se a identidade gerenciada da instância tem direitos de acesso à conta de armazenamento.
- O nível de compatibilidade do banco de dados deve ser 130 ou superior para que as consultas da virtualização de dados funcionem.
CRIAR TABELA EXTERNA COM SELECT (CETAS, na sigla em inglês)
CREATE EXTERNAL TABLE AS SELECT (CETAS) permite exportar dados de sua instância gerenciada de SQL para uma conta de armazenamento externa. Você pode usar o CETAS para criar uma tabela externa sobre arquivos Parquet ou CSV no Armazenamento de Blobs do Azure ou no Azure Data Lake Storage (ADLS) Gen2. O CETAS também pode exportar, em paralelo, os resultados de uma instrução T-SQL SELECT para a tabela externa criada. Há potencial para o risco de exfiltração de dados com esses recursos, portanto, a Instância Gerenciada de SQL do Azure desabilita o CETAS por padrão. Para habilitar, confira CETAS (CREATE EXTERNAL TABLE AS SELECT).
Limitações
- O recurso de segurança em nível de linha não é suportado com tabelas externas.
- A regra da Máscara Dinâmica de Dados não pode ser definida para uma coluna em uma tabela externa.
Problemas conhecidos
- Quando a parametrização do Always Encrypted está habilitada no SSMS (SQL Server Management Studio), as consultas da virtualização de dados falham com a mensagem de erro
Incorrect syntax near 'PUSHDOWN'.