Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Týká se:Azure SQL Database
Funkce virtualizace dat ve službě Azure SQL Database umožňuje spouštět dotazy Transact-SQL (T-SQL) na soubory, které ukládají data v běžných datových formátech, jako je CSV (bez nutnosti používat text s oddělovači), Parquet a Delta (1.0). Tato data můžete dotazovat ve službě Azure Data Lake Storage Gen2 nebo Azure Blob Storage a kombinovat je s místně uloženými relačními daty pomocí spojení. Díky tomu můžete transparentně přistupovat k externím datům (v režimu jen pro čtení) a přitom je udržovat v původním formátu a umístění – označované také jako virtualizace dat.
Přehled
Virtualizace dat poskytuje dva způsoby dotazování souborů určených pro různé sady scénářů:
- Syntaxe OPENROWSET – optimalizovaná pro ad hoc dotazování souborů. Obvykle se používá k rychlému prozkoumání obsahu a struktury nové sady souborů.
- SYNTAXE CREATE EXTERNAL TABLE – optimalizovaná pro opakované dotazování souborů pomocí stejné syntaxe, jako kdyby byla data uložená místně v databázi. Externí tabulky vyžadují v porovnání se syntaxí OPENROWSET několik kroků přípravy, ale umožňují větší kontrolu nad přístupem k datům. Externí tabulky se obvykle používají pro analytické úlohy a vytváření sestav.
V obou případech musí být externí zdroj dat vytvořen pomocí syntaxe CREATE EXTERNAL DATA SOURCE T-SQL, jak je znázorněno v tomto článku.
Formáty souborů
Formáty souborů Parquet a text s oddělovači (CSV) jsou podporovány přímo. Formát souboru JSON je nepřímo podporován zadáním formátu SOUBORU CSV, ve kterém dotazy vrací každý dokument jako samostatný řádek. Řádky můžete dále analyzovat pomocí JSON_VALUE
a OPENJSON
.
Typy úložiště
Soubory se dají ukládat ve službě Azure Data Lake Storage Gen2 nebo Azure Blob Storage. K dotazování souborů potřebujete zadat umístění v určitém formátu a použít předponu typu umístění odpovídající typu externího zdroje a koncového bodu/protokolu, například následující příklady:
--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>/
Důležité
Vždy používejte předpony specifické pro koncový bod. Zadanou předponu typu umístění se používá k výběru optimálního protokolu pro komunikaci a k využití všech pokročilých funkcí nabízených konkrétním typem úložiště.
https://
Obecná předpona je podporována pouze pro BULK INSERT
, ale ne pro jiné případy použití včetně OPENROWSET
nebo EXTERNAL TABLE
.
Začínáme
Pokud s virtualizací dat začínáte a chcete rychle testovat funkce, začněte dotazováním veřejných datových sad dostupných v Azure Open Datasets, jako je datová sada Bingu COVID-19, která umožňuje anonymní přístup.
K dotazování datových sad Bingu COVID-19 použijte následující koncové body:
- Parkety:
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
Pro rychlý start spusťte tento jednoduchý dotaz T-SQL, abyste získali první přehled o datové sadě. Tento dotaz používá OPENROWSET k dotazování souboru uloženého v veřejně dostupném účtu úložiště:
--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;
Zkoumání sady dat můžete pokračovat připojením WHERE
GROUP BY
a dalšími klauzulemi na základě sady výsledků prvního dotazu.
Jakmile se seznámíte s dotazováním veřejných datových sad, zvažte přepnutí na nepublikované datové sady, které vyžadují zadání přihlašovacích údajů, udělení přístupových práv a konfiguraci pravidel brány firewall. V mnoha reálných scénářích budete pracovat především s privátními datovými sadami.
Přístup k nepublikickým účtům úložiště
Uživatel, který je přihlášený ke službě Azure SQL Database, musí mít oprávnění pro přístup k souborům uloženým v nepřístupných účtech úložiště a dotazování na soubory. Postup autorizace závisí na tom, jak Azure SQL Database ověřuje úložiště. Typy ověřování a všechny související parametry nejsou k dispozici přímo s každým dotazem. Zapouzdřují se v objektu přihlašovacích údajů s oborem databáze uloženém v uživatelské databázi. Přihlašovací údaje používá databáze k přístupu k účtu úložiště při provádění dotazu.
Azure SQL Database podporuje následující typy ověřování:
- Sdílený přístupový podpis (SAS)
- Spravovaná identita
- Předávací ověřování Microsoft Entra prostřednictvím identity uživatele
Sdílený přístupový podpis (SAS) poskytuje delegovaný přístup k souborům v účtu úložiště. SAS poskytuje podrobnou kontrolu nad typem přístupu, který udělujete, včetně intervalu platnosti, udělených oprávnění a přijatelného rozsahu IP adres. Jakmile se token SAS vytvoří, nedá se odvolat ani odstranit a umožní přístup až do vypršení jeho doby platnosti.
Token SAS můžete získat několika způsoby:
- Přejděte na portál Azure –> váš účet úložiště –>Sdílený přístupový podpis –> Konfigurace oprávnění –> Vygenerovat SAS a připojovací řetězec. Další informace najdete v tématu Generování sdíleného přístupového podpisu.
- Vytvořte a nakonfigurujte SAS pomocí Průzkumníka služby Azure Storage.
- Token SAS můžete vytvořit programově prostřednictvím PowerShellu, Azure CLI, .NET a rozhraní REST API. Další informace najdete v tématu Udělení omezeného přístupu k prostředkům Azure Storage pomocí sdílených přístupových podpisů (SAS).
Udělte oprávnění ke čtení a výpisu prostřednictvím sdíleného přístupového podpisu pro přístup k externím datům. V současné době je virtualizace dat se službou Azure SQL Database jen pro čtení.
Pokud chcete vytvořit přihlašovací údaje s vymezeným oborem databáze ve službě Azure SQL Database, musíte nejprve vytvořit hlavní klíč databáze, pokud ještě neexistuje. Hlavní klíč databáze je vyžadován v případě, že přihlašovací údaje vyžadují
SECRET
.-- Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Some Very Strong Password Here>';
Když se vygeneruje token SAS, obsahuje na začátku tokenu otazník (
?
). Pokud chcete token použít, musíte při vytváření přihlašovacích údajů odebrat otazník (?
). Například:CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=secret string here';
Přístup k veřejnému úložišti prostřednictvím anonymních účtů
Pokud požadovaná datová sada umožňuje veřejný přístup (označovaný také jako anonymní přístup), nejsou vyžadovány žádné přihlašovací údaje, pokud je služba Azure Storage správně nakonfigurovaná, přečtěte si téma Konfigurace anonymního přístupu ke čtení pro kontejnery a objekty blob.
Externí zdroj dat
Externí zdroj dat je abstrakce, která umožňuje snadné odkazování na umístění souboru napříč několika dotazy. Pokud chcete zadat dotazy na veřejná umístění, musíte při vytváření externího zdroje dat zadat vše, co je umístěním souboru:
CREATE EXTERNAL DATA SOURCE MyExternalDataSource
WITH (
LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
);
Při přístupu k nepublikovaným účtům úložiště spolu s umístěním musíte také odkazovat na přihlašovací údaje s vymezeným oborem databáze s zapouzdřenými ověřovacími parametry. Následující skript vytvoří externí zdroj dat odkazující na cestu k souboru a odkazuje na přihlašovací údaje v oboru databáze.
--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]
);
Dotazování zdrojů dat pomocí OPENROWSET
Syntaxe OPENROWSET umožňuje okamžité ad hoc dotazování při vytváření pouze minimálního počtu potřebných databázových objektů.
OPENROWSET
Vyžaduje pouze vytvoření externího zdroje dat (a případně přihlašovací údaje) na rozdíl od přístupu externí tabulky, který vyžaduje formát externího souboru a samotnou externí tabulku.
Hodnota DATA_SOURCE
parametru se automaticky předpíná k parametru BULK, aby se vytvořila úplná cesta k souboru.
Při použití OPENROWSET
zadejte formát souboru, například v následujícím příkladu, který se dotazuje na jeden soubor:
SELECT TOP 10 *
FROM OPENROWSET(
BULK 'bing_covid-19_data.parquet',
DATA_SOURCE = 'MyExternalDataSource',
FORMAT = 'parquet'
) AS filerows;
Dotazování na více souborů a složek
Příkaz OPENROWSET
také umožňuje dotazování více souborů nebo složek pomocí zástupných znaků v cestě BULK.
V následujícím příkladu se používá žlutá taxislužba záznamy otevřené datové sady.
Nejprve vytvořte externí zdroj dat:
--Create the data source first:
CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');
Teď můžeme dotázat všechny soubory s příponou .parquet ve složkách. Tady například budeme dotazovat pouze ty soubory, které odpovídají vzoru názvu:
--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;
Při dotazování více souborů nebo složek musí mít všechny soubory, ke kterým se přistupuje pomocí jediné OPENROWSET
struktury (například stejný počet sloupců a datových typů). Složky se nedají rekurzivně přecházet.
Odvozování schémat
Automatické odvozování schématu vám pomůže rychle psát dotazy a zkoumat data, když neznáte schémata souborů. Odvození schématu funguje jenom se soubory parquet.
I když je to praktické, odvozené datové typy můžou být větší než skutečné datové typy, protože ve zdrojových souborech může být dostatek informací, aby se zajistilo použití příslušného datového typu. To může vést k nízkému výkonu dotazů. Například soubory parquet neobsahují metadata o maximální délce sloupce znaků, takže instance ji odvodí jako varchar(8000).
Ke kontrole výsledných datových typů dotazu použijte uloženou proceduru sp_describe_first_results_set, jako je tomu například v následujícím příkladu:
EXEC sp_describe_first_result_set N'
SELECT
vendorID, tpepPickupDateTime, passengerCount
FROM
OPENROWSET(
BULK ''yellow/*/*/*.parquet'',
DATA_SOURCE = ''NYCTaxiExternalDataSource'',
FORMAT=''parquet''
) AS nyc';
Jakmile znáte datové typy, můžete je WITH
pomocí klauzule určit, abyste zlepšili výkon:
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;
Vzhledem k tomu, že schéma souborů CSV nelze automaticky určit, musí být sloupce vždy zadány WITH
pomocí klauzule:
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;
Funkce metadat souborů
Při dotazování na více souborů nebo složek můžete použít filepath()
a filename()
funkce ke čtení metadat souborů a získání části cesty nebo úplné cesty a názvu souboru, ze kterého pochází řádek v sadě výsledků:
--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;
Při zavolání bez parametru filepath()
vrátí funkce cestu k souboru, ze které řádek pochází. Při DATA_SOURCE
použití vrátí OPENROWSET
cestu vzhledem k objektu DATA_SOURCE
, jinak vrátí úplnou cestu k souboru.
Při zavolání s parametrem vrátí část cesty, která odpovídá zástupnému znaku na pozici určené v parametru. Například hodnota parametru 1 by vrátila část cesty, která odpovídá prvnímu zástupného znaku.
Funkci filepath()
lze také použít k filtrování a agregaci řádků:
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;
Vytvoření zobrazení nad OPENROWSET
Zobrazení můžete vytvořit a použít k zabalení dotazů OPENROWSET, abyste mohli snadno použít základní dotaz:
CREATE VIEW TaxiRides AS
SELECT *
FROM OPENROWSET(
BULK 'yellow/puYear=*/puMonth=*/*.parquet',
DATA_SOURCE = 'NYCTaxiExternalDataSource',
FORMAT = 'parquet'
) AS filerows;
Je také vhodné přidat sloupce s daty o umístění souboru do zobrazení pomocí filepath()
funkce pro snadnější a výkonnější filtrování. Použití zobrazení může snížit počet souborů a množství dat, které dotaz nad zobrazením potřebuje ke čtení a zpracování při filtrování podle některého z těchto sloupců:
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;
Zobrazení také umožňují vytváření sestav a analytické nástroje, jako je Power BI, využívat výsledky OPENROWSET
.
Externí tabulky
Externí tabulky zapouzdřují přístup k souborům, takže dotazování je téměř stejné jako dotazování místních relačních dat uložených v uživatelských tabulkách. Vytvoření externí tabulky vyžaduje, aby existovaly objekty externího zdroje dat a formátu externího souboru:
--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
);
Po vytvoření externí tabulky ji můžete dotazovat stejně jako jakoukoli jinou tabulku:
SELECT TOP 10 *
FROM tbl_TaxiRides;
Stejně jako OPENROWSET
externí tabulky umožňují dotazování více souborů a složek pomocí zástupných znaků. Externí tabulky nepodporují odvození schématu.
Důležité informace o výkonu
Počet souborů nebo množství dat, které se dají dotazovat, není nijak omezený, ale výkon dotazů závisí na množství dat, formátu dat, způsobu uspořádání dat a složitosti dotazů a spojení.
Dotazování na dělená data
Data jsou často uspořádaná do podsložek označovaných také jako oddíly. Můžete dotazu zadat, aby četl pouze konkrétní složky a soubory. Tím se sníží počet souborů a množství dat, která dotaz potřebuje ke čtení a zpracování, což vede k lepšímu výkonu. Tento typ optimalizace dotazů se označuje jako vyřazení oddílů nebo odstranění oddílů. Můžete eliminovat oddíly z provádění dotazů pomocí metadata funkce filepath()
v klauzuli dotazu WHERE
.
Následující ukázkový dotaz čte datové soubory NYC Yellow Taxi pouze za poslední tři měsíce roku 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;
Pokud uložená data nejsou rozdělená na oddíly, zvažte jejich rozdělení, aby se zlepšil výkon dotazů.
Pokud používáte externí tabulky, jsou podporovány funkce filepath()
a filename()
, ale ne v klauzuli WHERE
.
Řešení problémů
Problémy se spouštěním dotazů obvykle způsobují, že Azure SQL Database nemá přístup k umístění souboru. Související chybové zprávy můžou hlásit nedostatečná přístupová práva, neexistující umístění nebo cestu k souboru, soubor používaný jiným procesem nebo adresář nelze uvést. Ve většině případů to znamená, že přístup k souborům jsou blokovány zásadami řízení provozu sítě nebo kvůli nedostatku přístupových práv. Toto je to, co by se mělo zkontrolovat:
- Nesprávná nebo chybně zadaná cesta k umístění.
- Platnost klíče SAS: Platnost klíče SAS může vypršena, která obsahuje překlep, počínaje otazníkem.
- Povolená oprávnění ke klíči SAS: Čtení minimálně a Seznam , pokud se používají zástupné cardy.
- Zablokovaný příchozí provoz v účtu úložiště. Zkontrolujte Správu pravidel virtuální sítě pro službu Azure Storage.
- Přístupová práva spravované identity: Ujistěte se, že spravovaná identita služby Azure SQL Database má udělená přístupová práva k účtu úložiště.
- Aby dotazy virtualizace dat fungovaly, musí být úroveň kompatibility databáze 130 nebo vyšší.
Omezení
- Statistiky externích tabulek se v současné době ve službě Azure SQL Database nepodporují.
-
CREATE EXTERNAL TABLE AS SELECT
V současné době není ve službě Azure SQL Database k dispozici. - Funkce zabezpečení na úrovni řádků není u externích tabulek podporovaná.
- Pravidlo dynamického maskování dat nelze definovat pro sloupec v externí tabulce.
- Spravovaná identita nepodporuje scénáře napříč tenanty, pokud je účet služby Azure Storage v jiném tenantovi, podporuje se sdílený přístupový podpis.
Známé problémy
- Pokud je v aplikaci SQL Server Management Studio (SSMS) povolená parametrizace funkce Always Encrypted , dotazy virtualizace dat selžou s chybovou
Incorrect syntax near 'PUSHDOWN'
zprávou.