Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:Banco de Dados SQL do Azure
O recurso de virtualização de dados do Banco de Dados SQL do Azure permite executar consultas Transact-SQL (T-SQL) em arquivos que armazenam dados em formatos de dados comuns, como CSV (sem a necessidade de usar texto delimitado), Parquet e Delta (1.0). Você pode consultar esses dados no Azure Data Lake Storage Gen2 ou no Armazenamento de Blobs do Azure e combiná-los com dados relacionais armazenados localmente usando junções. Dessa forma, você pode acessar dados externos de forma transparente (no modo somente leitura), mantendo-os em seu formato e local originais - também conhecidos como virtualização de dados.
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 consultas repetitivas 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 aos dados. As tabelas externas são normalmente usadas para cargas de trabalho analíticas e relatórios.
Em ambos os casos, uma fonte de dados externa deve ser criada usando a sintaxe CREATE EXTERNAL DATA SOURCE T-SQL, conforme demonstrado neste artigo.
Formatos de ficheiro
Os formatos de arquivo Parquet e texto delimitado (CSV) são diretamente suportados. O formato de arquivo JSON é suportado indiretamente, especificando o formato de arquivo CSV onde as consultas retornam cada documento como uma linha separada. Você pode analisar linhas ainda mais usando JSON_VALUE e OPENJSON.
Tipos de armazenamento
Os arquivos podem ser armazenados no Azure Data Lake Storage Gen2 ou no Armazenamento de Blobs do Azure. Para consultar arquivos, você precisa fornecer o local em um formato específico e usar o prefixo do tipo de local correspondente ao tipo de fonte externa e ponto de extremidade/protocolo, como os seguintes exemplos:
--Blob Storage endpoint
abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet
--or
abs://<storage_account_name>.blob.core.windows.net/<container_name>/
--Data Lake endpoint
adls://<container>@<storage_account>.dfs.core.windows.net/<path>/<file_name>.parquet
--or
adls://<storage_account_name>.dfs.core.windows.net/<container_name>/
Importante
Use sempre prefixos específicos do ponto de extremidade. O prefixo do tipo de local fornecido é usado para escolher o protocolo ideal para comunicação e para aproveitar quaisquer recursos avançados oferecidos pelo tipo de armazenamento específico.
O prefixo genérico https:// é suportado apenas para BULK INSERT, mas não para outros casos de uso, incluindo OPENROWSET ou EXTERNAL TABLE.
Introdução
Se você é novo na virtualização de dados e deseja testar rapidamente a funcionalidade, comece consultando conjuntos de dados públicos disponíveis nos Conjuntos de Dados Abertos do Azure, como o conjunto de dados do Bing COVID-19 que permite acesso anônimo.
Use as seguintes interfaces para consultar os conjuntos de dados do Bing COVID-19.
- Parquet:
abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.parquet - VCS:
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 esta consulta T-SQL simples para obter as primeiras informações sobre o conjunto de dados. Esta 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 anexando WHERE, GROUP BY e outras cláusulas com base no conjunto de resultados da primeira consulta.
Depois de se familiarizar com a consulta de conjuntos de dados públicos, considere mudar para conjuntos de dados não públicos que exijam o fornecimento de credenciais, a concessão de direitos de acesso e a configuração de regras de firewall. Em muitos cenários do mundo real, você operará principalmente com conjuntos de dados privados.
Acesso a contas de armazenamento não públicas
Um usuário conectado a um Banco de Dados SQL do Azure deve ser autorizado a acessar e consultar arquivos armazenados em contas de armazenamento não públicas. As etapas de autorização dependem de como o Banco de Dados SQL do Azure autentica o armazenamento. Os tipos de autenticações e quaisquer parâmetros relacionados não são fornecidos diretamente com cada consulta. Eles estão encapsulados no objeto de credencial com escopo de base de dados armazenado no banco de dados do utilizador. A credencial é usada pelo banco de dados para acessar a conta de armazenamento sempre que a consulta é executada.
O Banco de Dados SQL do Azure dá suporte aos seguintes tipos de autenticação:
- Assinatura de acesso compartilhado (SAS)
- Identidade gerenciada
- Autenticação de passagem do Microsoft Entra via Identidade do Usuário
Uma assinatura de acesso compartilhado (SAS) fornece acesso delegado a arquivos em uma conta de armazenamento. O SAS oferece controle granular sobre o tipo de acesso concedido, incluindo intervalo de validade, permissões concedidas e intervalo de endereços IP aceitável. Uma vez que o token SAS é criado, ele não pode ser revogado ou excluído, e permite o acesso até que seu período de validade expire.
Você pode obter um token SAS de várias maneiras:
- Navegue até o portal do Azure -> sua conta de armazenamento ->Assinatura de acesso compartilhado -> Configurar permissões -> Gerar SAS e cadeia de conexão. Para obter mais informações, consulte Gerar uma assinatura de acesso compartilhado.
- Crie e configure uma SAS com o Azure Storage Explorer.
- Você pode criar um token SAS programaticamente por meio do PowerShell, CLI do Azure, .NET e API REST. Para obter mais informações, consulte Conceder acesso limitado aos recursos do Armazenamento do Azure usando assinaturas de acesso compartilhado (SAS).
Conceda permissões de Leitura e Lista através do SAS para aceder a dados externos. Atualmente, a virtualização de dados com o Banco de Dados SQL do Azure é somente leitura.
Para criar uma credencial com escopo de banco de dados no Banco de Dados SQL do Azure, você deve primeiro criar a chave mestra do banco de dados, se ainda não existir. Uma chave mestra de banco de dados é necessária quando a credencial requer
SECRET.-- Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Some Very Strong Password Here>';Quando um token SAS é gerado, ele inclui um ponto de interrogação (
?) no início do token. Para usar o token, você deve remover o ponto de interrogação (?) ao criar uma credencial. Por exemplo:CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=secret string here';
Acesso ao armazenamento público através de contas anónimas
Se o conjunto de dados desejado permitir acesso público (também conhecido como acesso anônimo), nenhuma credencial será necessária, desde que o Armazenamento do Azure esteja configurado corretamente, consulte Configurar acesso de leitura anônimo para contêineres e blobs.
Fonte de dados externa
Uma fonte de dados externa é uma abstração que permite a referência fácil de um local de arquivo em várias consultas. Para consultar locais públicos, tudo o que você precisa especificar ao criar uma fonte de dados externa é o local do arquivo:
CREATE EXTERNAL DATA SOURCE MyExternalDataSource
WITH (
LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
);
Ao acessar contas de armazenamento não públicas, juntamente com o local, você também precisa fazer referência a 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 apontando para a localização do ficheiro e fazendo referência a uma credencial delimitada para o banco de dados.
--Create external data source pointing to the file path, and referencing database-scoped credential:
CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
WITH (
LOCATION = 'abs://<privatecontainer>@privatestorageaccount.blob.core.windows.net/dataset/'
CREDENTIAL = [MyCredential]
);
Consultar fontes de dados usando OPENROWSET
A sintaxe OPENROWSET permite consultas ad hoc instantâneas enquanto cria apenas o número mínimo de objetos de banco de dados necessários.
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 DATA_SOURCE valor do parâmetro é automaticamente anexado ao parâmetro BULK 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 OPENROWSET comando também permite consultar vários arquivos ou pastas usando curingas no caminho MASS.
O exemplo a seguir usa o conjunto de dados abertos de registros de viagem de táxi amarelo de Nova York.
Primeiro, 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 podemos consultar todos os arquivos com extensão .parquet em pastas. Por exemplo, aqui consultaremos apenas 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 do esquema
A inferência automática de esquema ajuda você a escrever consultas e explorar dados rapidamente quando você não conhece esquemas de arquivo. A inferência de esquema só funciona com arquivos parquet.
Embora convenientes, os tipos de dados inferidos podem ser maiores do que os tipos de dados reais, porque pode haver informações suficientes nos arquivos de origem para garantir que o tipo de dados apropriado seja usado. Tal pode levar a um fraco desempenho da consulta. Por exemplo, os arquivos parquet não contêm metadados sobre o comprimento máximo da coluna de caracteres, então a instância infere como varchar(8000).
Utilize o procedimento armazenado sp_describe_first_results_set para verificar os tipos de dados resultantes da consulta, tais como o seguinte exemplo:
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, você pode especificá-los 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, as colunas devem ser sempre especificadas 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 filepath() e filename() funções para ler metadados de arquivo e obter parte do caminho ou caminho completo e 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;
Quando chamada sem um parâmetro, a filepath() função retorna o caminho do arquivo do qual a linha se origina. Quando DATA_SOURCE usado no OPENROWSET, ele retorna o caminho relativo ao DATA_SOURCE, caso contrário, retorna o caminho completo do arquivo.
Quando chamado com um parâmetro, ele retorna parte do caminho que corresponde ao caracter curinga na posição especificada no parâmetro. Por exemplo, o valor do parâmetro 1 retornaria parte do caminho que corresponde ao primeiro curinga.
A filepath() função 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 vista na parte superior de OPENROWSET
Você pode criar e usar modos de exibição para encapsular consultas OPENROWSET para que possa reutilizar facilmente 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 de localização do arquivo a uma visualização usando a filepath() função para uma filtragem mais fácil e mais eficiente. O uso de modos de exibição pode reduzir o número de arquivos e a quantidade de dados que a consulta na parte superior do modo de 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órios, como o Power BI, consumam resultados do OPENROWSET.
Tabelas externas
As tabelas externas encapsulam o acesso a arquivos, tornando a experiência de consulta quase idêntica à consulta de dados relacionais locais armazenados em tabelas de usuário. A criação de uma tabela externa requer a existência da fonte de dados externa e dos objetos de formato de arquivo externo:
--Create external file format
CREATE EXTERNAL FILE FORMAT DemoFileFormat
WITH (
FORMAT_TYPE=PARQUET
);
--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
);
Uma vez que a tabela externa é criada, você pode consultá-la como qualquer outra tabela:
SELECT TOP 10 *
FROM tbl_TaxiRides;
Assim como OPENROWSET, as tabelas externas permitem consultar vários arquivos e pastas usando curingas. A inferência de esquema não é suportada com tabelas externas.
Considerações sobre desempenho
Não há limite rígido para o número de arquivos ou a quantidade de dados que podem ser consultados, mas o desempenho da consulta depende da quantidade de dados, do formato dos 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 consulta a ler 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 um melhor desempenho. Este tipo de otimização de consulta é conhecido como redução de partição ou remoção de partição. Você pode eliminar partições da execução da consulta usando a função filepath() de metadados na cláusula WHERE da consulta.
A consulta de exemplo a seguir lê os arquivos de dados do NYC Yellow Taxi somente para os ú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 estiverem particionados, considere particioná-los para melhorar o desempenho da consulta.
Se estiver a usar tabelas externas, as funções filepath() e filename() são suportadas, mas não na cláusula WHERE.
Solucionar problemas
Os problemas com a execução da consulta geralmente são causados pelo fato de o Banco de Dados SQL do Azure não conseguir acessar o local do arquivo. As mensagens de erro relacionadas podem relatar direitos de acesso insuficientes, local ou caminho de arquivo inexistente, arquivo sendo usado por outro processo ou que o diretório não pode ser listado. Na maioria dos casos, isso indica que o acesso aos arquivos está bloqueado por políticas de controle de tráfego de rede ou devido à falta de direitos de acesso. Isto é o que deve ser verificado:
- Caminho de localização errado ou escrito com erros.
- Validade da chave SAS: pode estar expirada, contendo um erro de digitação, começando 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 Gestão de regras de rede virtual para Azure Storage.
- Direitos de acesso de Identidade Gerenciada: verifique se a identidade gerenciada do Banco de Dados SQL do Azure recebeu direitos de acesso à conta de armazenamento.
- O nível de compatibilidade do banco de dados deve ser 130 ou superior para que as consultas de virtualização de dados funcionem.
Limitações
- Atualmente, não há suporte para estatísticas em tabelas externas no Banco de Dados SQL do Azure.
- Atualmente,
CREATE EXTERNAL TABLE AS SELECTnão está disponível no Banco de Dados SQL do Azure. - O recurso de segurança em nível de linha não é suportado com tabelas externas.
- A regra de mascaramento de dados dinâmicos não pode ser definida para uma coluna em uma tabela externa.
- A identidade gerenciada não oferece suporte a cenários entre inquilinos; se a sua conta de Armazenamento do Azure estiver em um inquilino diferente, a assinatura de acesso compartilhado será o método suportado.
Problemas conhecidos
- Quando a parametrização para Always Encrypted está habilitada no SQL Server Management Studio (SSMS), as consultas de virtualização de dados falham com
Incorrect syntax near 'PUSHDOWN'uma mensagem de erro.