Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:Azure SQL Managed Instance
In dit artikel wordt de functie voor gegevensvirtualisatie van Azure SQL Managed Instance beschreven. Met gegevensvirtualisatie kunt u Transact-SQL (T-SQL)-query's uitvoeren op bestanden die gegevens opslaan in algemene gegevensindelingen in Azure Data Lake Storage Gen2 of Azure Blob Storage. U kunt deze gegevens combineren met lokaal opgeslagen relationele gegevens met behulp van joins. Met gegevensvirtualisatie hebt u transparant toegang tot externe gegevens in de modus Alleen-lezen, terwijl u deze in de oorspronkelijke indeling en locatie houdt.
Overzicht
Gegevensvirtualisatie biedt twee manieren om query's uit te voeren op bestanden die zijn bedoeld voor verschillende sets scenario's:
- OPENROWSET-syntaxis: geoptimaliseerd voor ad-hocquery's op bestanden. Meestal gebruikt om snel de inhoud en structuur van een nieuwe set bestanden te verkennen.
- CREATE EXTERNAL TABLE syntaxis: geoptimaliseerd voor terugkerende query's op bestanden met behulp van identieke syntaxis alsof gegevens lokaal zijn opgeslagen in de database. Voor externe tabellen zijn verschillende voorbereidingsstappen vereist in vergelijking met de OPENROWSET-syntaxis, maar is meer controle over gegevenstoegang mogelijk. Gebruik externe tabellen voor analytische workloads en rapportage.
Maak in beide gevallen een externe gegevensbron met behulp van de T-SQL-syntaxis CREATE EXTERNAL DATA SOURCE , zoals wordt beschreven in dit artikel.
CREATE EXTERNAL TABLE AS SELECT syntaxis is ook beschikbaar voor Azure SQL Managed Instance. Hiermee exporteert u de resultaten van een T-SQL-instructie SELECT naar de Parquet- of CSV-bestanden in Azure Blob Storage of Azure Data Lake Storage (ADLS) Gen2 en maakt u een externe tabel boven op deze bestanden.
Bestandsindelingen
Parquet- en CSV-bestandsindelingen (scheidingstekens) voor tekst worden rechtstreeks ondersteund. De JSON-bestandsindeling wordt indirect ondersteund door de CSV-bestandsindeling op te geven waarbij query's elk document als een afzonderlijke rij retourneren. U kunt rijen verder parseren met JSON_VALUE en OPENJSON.
Opslagtypen
Sla bestanden op in Azure Data Lake Storage Gen2 of Azure Blob Storage. Als u een query wilt uitvoeren op bestanden, geeft u de locatie op in een specifieke indeling en gebruikt u het voorvoegsel van het locatietype dat overeenkomt met het type externe bron en eindpunt of protocol, zoals de volgende voorbeelden:
--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
Belangrijk
Het opgegeven locatietypevoorvoegsel wordt gebruikt om het optimale protocol voor communicatie te kiezen en geavanceerde mogelijkheden te gebruiken die door het specifieke opslagtype worden geboden.
Het algemene https:// voorvoegsel wordt uitgeschakeld. Gebruik altijd eindpuntspecifieke voorvoegsels.
Aan de slag
Als u niet bekend bent met gegevensvirtualisatie en snel functionaliteit wilt testen, begint u met het opvragen van openbare gegevenssets die beschikbaar zijn in Azure Open Datasets, zoals de Bing COVID-19-gegevensset die anonieme toegang toestaat.
Gebruik de volgende eindpunten om een query uit te voeren op de Bing COVID-19-gegevenssets:
- Parket:
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
Voer een T-SQL-query uit om eerst inzicht te krijgen in de gegevensset. Deze query maakt gebruik van OPENROWSET om een query uit te voeren op een bestand dat is opgeslagen in een openbaar beschikbaar opslagaccount:
--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
U kunt doorgaan met het verkennen van gegevenssets door WHERE, GROUP BY en andere onderdelen op basis van de resultatenset van de eerste query toe te voegen.
Als de eerste query mislukt op uw met SQL beheerde exemplaar, heeft dat exemplaar waarschijnlijk beperkte toegang tot Azure-opslagaccounts. Neem contact op met uw netwerkexpert om toegang in te schakelen voordat u verdergaat met het uitvoeren van query's.
Wanneer u bekend bent met het uitvoeren van query's op openbare gegevenssets, kunt u overschakelen naar niet-openbare gegevenssets waarvoor referenties moeten worden opgegeven, toegangsrechten moeten worden verleend en firewallregels moeten worden geconfigureerd. In veel praktijkscenario's werkt u voornamelijk met privégegevenssets.
Toegang tot niet-openbare opslagaccounts
Een gebruiker die zich aanmeldt bij een met SQL beheerd exemplaar, moet zijn gemachtigd om bestanden te openen en op te vragen die zijn opgeslagen in een niet-openbaar opslagaccount. De autorisatiestappen zijn afhankelijk van hoe het beheerde SQL-exemplaar wordt geverifieerd bij het opslagaccount. Het type verificatie en eventuele gerelateerde parameters worden niet rechtstreeks bij elke query geleverd. Het referentieobject met databasebereik dat is opgeslagen in de gebruikersdatabase, bevat deze informatie. De database gebruikt de referentie voor toegang tot het opslagaccount wanneer de query wordt uitgevoerd.
Azure SQL Managed Instance ondersteunt de volgende verificatietypen:
- Beheerde identiteit
- Gedeelde toegangshandtekening (SAS)
Een beheerde identiteit is een functie van Microsoft Entra ID (voorheen Azure Active Directory) die Azure-services, zoals Azure SQL Managed Instance, biedt met een identiteit die wordt beheerd in Microsoft Entra ID. U kunt deze identiteit gebruiken om aanvragen voor gegevenstoegang in niet-openbare opslagaccounts te autoriseren. Services zoals Azure SQL Managed Instance hebben een door het systeem toegewezen beheerde identiteit en kunnen ook een of meer door de gebruiker toegewezen beheerde identiteiten hebben. U kunt door het systeem toegewezen beheerde identiteiten of door de gebruiker toegewezen beheerde identiteiten gebruiken voor gegevensvirtualisatie met Azure SQL Managed Instance.
De Azure-opslagbeheerder moet eerst machtigingen verlenen aan de beheerde identiteit om toegang te krijgen tot de gegevens. Verwijs machtigingen aan de door het systeem toegewezen beheerde identiteit van het door het SQL beheerde exemplaar op dezelfde manier als u machtigingen verleent aan elke andere Microsoft Entra-gebruiker. Voorbeeld:
- Selecteer in Azure Portal op de pagina Toegangsbeheer (IAM) van een opslagaccount de optie Roltoewijzing toevoegen.
- Kies de ingebouwde Azure RBAC-rol Storage Blob Data Reader. Deze rol biedt leestoegang tot de beheerde identiteit voor de benodigde Azure Blob Storage-containers.
- In plaats van de beheerde identiteit de Azure RBAC-rol Opslagblob-lezer te verlenen, kunt u ook meer gedetailleerdere machtigingen verlenen voor een subset van bestanden. Alle gebruikers die toegang moeten hebben tot het lezen van afzonderlijke bestanden in deze dataset, moeten ook de toestemming om uit te voeren hebben voor alle bovenliggende mappen tot de hoofdmap (de container). Zie ACL's instellen in Azure Data Lake Storage Gen2 voor meer informatie.
- Selecteer Op de volgende pagina de optie Toegang totbeheerde identiteit toewijzen. Selecteer + Leden selecteren en selecteer onder de vervolgkeuzelijst Beheerde identiteit de gewenste beheerde identiteit. Zie voor meer informatie Azure-rollen toewijzen met behulp van de Azure-portal.
- Daarna, maak de databasescope-referentie aan voor verificatie via beheerde identiteiten. Let op in het volgende voorbeeld dat
'Managed Identity'een in code vastgelegde tekenreeks is.
-- 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'
Externe gegevensbron
Een externe gegevensbron is een abstractie die een eenvoudige verwijzing naar een bestandslocatie biedt voor meerdere query's. Als u een query wilt uitvoeren op openbare locaties, geeft u de bestandslocatie op wanneer u een externe gegevensbron maakt:
CREATE EXTERNAL DATA SOURCE MyExternalDataSource
WITH (
LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
)
Als u toegang wilt krijgen tot niet-openbare opslagaccounts, geeft u de locatie op en verwijst u naar een databasereferentie met ingekapselde verificatieparameters. Met het volgende script maakt u een externe gegevensbron die verwijst naar het bestandspad en verwijst naar een referentie binnen het databasebereik:
-- 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];
)
Query's uitvoeren op gegevensbronnen met BEHULP van OPENROWSET
De OPENROWSET-syntaxis maakt direct ad-hocquery's mogelijk terwijl alleen het minimale aantal databaseobjecten wordt gemaakt dat nodig is.
OPENROWSET vereist alleen het maken van de externe gegevensbron (en mogelijk de referentie) in plaats van de externe tabelbenadering, waarvoor een externe bestandsindeling en de externe tabel zelf zijn vereist.
De DATA_SOURCE parameterwaarde wordt automatisch voorafgegaan door de PARAMETER BULK om het volledige pad naar het bestand te vormen.
Geef bij gebruik OPENROWSETde indeling op van het bestand, zoals het volgende voorbeeld, waarmee een query wordt uitgevoerd op één bestand:
SELECT TOP 10 *
FROM OPENROWSET(
BULK 'bing_covid-19_data.parquet',
DATA_SOURCE = 'MyExternalDataSource',
FORMAT = 'parquet'
) AS filerows;
Query's uitvoeren op meerdere bestanden en mappen
Met de OPENROWSET opdracht kunt u ook query's uitvoeren op meerdere bestanden of mappen met behulp van jokertekens in het PAD BULK.
In het volgende voorbeeld wordt gebruikgemaakt van de open dataset met ritrecords van gele taxi's in NYC.
Maak eerst de externe gegevensbron:
--Create the data source first:
CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net');
U kunt nu alle bestanden opvragen met .parquet extensie in mappen. De volgende query is bijvoorbeeld alleen bedoeld voor bestanden die overeenkomen met een naampatroon:
--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;
Bij het uitvoeren van query's op meerdere bestanden of mappen, moeten alle bestanden die met de ene OPENROWSET zijn geopend, dezelfde structuur hebben (zoals hetzelfde aantal kolommen en gegevenstypen). Mappen kunnen niet recursief worden doorkruist.
Schema-afleiding
Met automatische schemadeductie kunt u snel query's schrijven en gegevens verkennen wanneer u geen bestandsschema's kent. Schemadeductie werkt alleen met Parquet-bestanden.
Hoewel dit handig is, kunnen uitgestelde gegevenstypen groter zijn dan de werkelijke gegevenstypen, omdat er mogelijk onvoldoende informatie in de bronbestanden is om ervoor te zorgen dat het juiste gegevenstype wordt gebruikt. Dit kan leiden tot slechte queryprestaties. Parquet-bestanden bevatten bijvoorbeeld geen metagegevens over maximale lengte van tekenkolommen, zodat het exemplaar deze afgeeft als varchar(8000).
Gebruik de opgeslagen sp_describe_first_results_set-procedure om de resulterende gegevenstypen van uw query te controleren, zoals in het volgende voorbeeld:
EXEC sp_describe_first_result_set N'
SELECT
vendorID, tpepPickupDateTime, passengerCount
FROM
OPENROWSET(
BULK ''yellow/*/*/*.parquet'',
DATA_SOURCE = ''NYCTaxiExternalDataSource'',
FORMAT=''parquet''
) AS nyc';
Zodra u de gegevenstypen kent, geeft u deze op met behulp van de WITH clausule om de prestaties te verbeteren.
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;
Omdat het schema van CSV-bestanden niet automatisch kan worden bepaald, geeft u altijd kolommen op met behulp van de WITH component:
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;
Bestandsmetagegevensfuncties
Wanneer u query's uitvoert op meerdere bestanden of mappen, kunt u met behulp van de functies filepath() en filename() bestandsmetagegevens lezen en een deel van het pad of het volledige pad en de naam van het bestand ophalen waarvan de rij in de resultatenset afkomstig is.
--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;
Wanneer de functie zonder parameter wordt aangeroepen, retourneert de filepath() functie het bestandspad waaruit de rij afkomstig is. Wanneer DATA_SOURCE wordt gebruikt in OPENROWSET, retourneert het het pad ten opzichte van de DATA_SOURCE, anders retourneert het volledige bestandspad.
Wanneer deze wordt aangeroepen met een parameter, wordt een deel van het pad geretourneerd dat overeenkomt met het jokerteken op de positie die is opgegeven in de parameter. Parameterwaarde 1 retourneert bijvoorbeeld een deel van het pad dat overeenkomt met het eerste jokerteken.
De filepath() functie kan ook worden gebruikt voor het filteren en samenvoegen van rijen:
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;
Weergave maken boven op OPENROWSET
U kunt weergaven maken en gebruiken om OPENROWSET-query's te verpakken, zodat u de onderliggende query eenvoudig opnieuw kunt gebruiken:
CREATE VIEW TaxiRides AS
SELECT *
FROM OPENROWSET(
BULK 'yellow/puYear=*/puMonth=*/*.parquet',
DATA_SOURCE = 'NYCTaxiExternalDataSource',
FORMAT = 'parquet'
) AS filerows
Het is ook handig om kolommen met de bestandslocatiegegevens toe te voegen aan een weergave met behulp van de filepath() functie, zodat u eenvoudiger en beter kunt filteren. Bij het gebruik van weergaven kan het aantal bestanden worden verminderd evenals de hoeveelheid gegevens die de query moet lezen en verwerken wanneer deze gefilterd worden op een van de kolommen.
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
Weergaven stellen rapportage- en analysehulpprogramma's zoals Power BI ook in staat om de resultaten van OPENROWSET te benutten.
Externe tabellen
Externe tabellen bevatten toegang tot bestanden, zodat het uitvoeren van query's op deze bestanden bijna hetzelfde is als het uitvoeren van query's op lokale relationele gegevens die zijn opgeslagen in gebruikerstabellen. Als u een externe tabel wilt maken, moet u een externe gegevensbron en externe bestandsindelingsobjecten hebben:
--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
Nadat u de externe tabel hebt gemaakt, kunt u er net als elke andere tabel een query op uitvoeren:
SELECT TOP 10 *
FROM tbl_TaxiRides;
Externe tabellen, zoals OPENROWSET, ondersteunen het uitvoeren van query's op meerdere bestanden en mappen met wildcards. Externe tabellen bieden echter geen ondersteuning voor schemadeductie.
Prestatie-overwegingen
Er is geen vaste limiet voor het aantal bestanden of de hoeveelheid gegevens die u kunt opvragen, maar de prestaties van query's zijn afhankelijk van de hoeveelheid gegevens, gegevensindeling, de manier waarop gegevens worden georganiseerd en de complexiteit van query's en joins.
Gepartitioneerde gegevens opvragen
Gegevens worden vaak ingedeeld in submappen, ook wel partities genoemd. U kunt sql Managed Instance instrueren om alleen bepaalde mappen en bestanden op te vragen. Dit vermindert het aantal bestanden en de hoeveelheid gegevens die de query nodig heeft om te lezen en te verwerken, wat resulteert in betere prestaties. Dit type van queryoptimalisatie wordt ook wel partitiesnoei of partitieverwijdering genoemd. U kunt partities verwijderen uit de uitvoering van query's met behulp van de metagegevensfunctie filepath() in de WHERE component van de query.
De volgende voorbeeldquery leest nyC Yellow Taxi-gegevensbestanden alleen voor de afgelopen drie maanden van 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;
Als uw opgeslagen gegevens niet zijn gepartitioneerd, kunt u overwegen deze te partitioneren om de queryprestaties te verbeteren.
Als u externe tabellen gebruikt, worden filepath()- en filename()-functies ondersteund, maar niet in de WHERE-component. U kunt nog steeds filteren op filename of filepath als u ze gebruikt in berekende kolommen, zoals het volgende voorbeeld laat zien:
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);
Als uw opgeslagen gegevens niet zijn gepartitioneerd, kunt u overwegen deze te partitioneren om de queryprestaties te verbeteren.
Statistiek
Het verzamelen van statistieken over uw externe gegevens is een van de belangrijkste dingen die u kunt doen voor queryoptimalisatie. Hoe meer het exemplaar weet over uw gegevens, hoe sneller het query's kan uitvoeren. De optimalisatiefunctie voor SQL Engine-query's is een optimalisatie op basis van kosten. Het vergelijkt de kosten van verschillende queryplannen en kiest vervolgens het plan met de laagste kosten. In de meeste gevallen wordt het plan gekozen dat het snelst wordt uitgevoerd.
Automatisch statistieken maken
Azure SQL Managed Instance analyseert binnenkomende gebruikersquery's voor ontbrekende statistieken. Als er statistieken ontbreken, worden met de queryoptimalisatie automatisch statistieken gemaakt voor afzonderlijke kolommen in het querypredicaat of joinvoorwaarde om de kardinaliteitschattingen voor het queryplan te verbeteren. Het automatisch maken van statistieken wordt synchroon uitgevoerd, zodat er mogelijk iets slechtere queryprestaties optreden als er statistieken ontbreken in uw kolommen. De tijd die nodig is om statistieken voor één kolom te maken, is afhankelijk van de grootte van de beoogde bestanden.
Handmatige statistieken van OPENROWSET
Statistieken met één kolom voor het OPENROWSET pad kunnen worden gemaakt met behulp van de sys.sp_create_openrowset_statistics opgeslagen procedure door de selectiequery door te geven met één kolom als parameter:
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
';
Het exemplaar maakt standaard gebruik van 100% van de gegevens die in de dataset zijn opgegeven om statistieken te maken. U kunt eventueel de grootte van de steekproef opgeven als een percentage met behulp van de TABLESAMPLE opties. Als u statistieken met één kolom voor meerdere kolommen wilt maken, voert u deze uit sys.sp_create_openrowset_statistics voor elk van de kolommen. U kunt geen statistieken met meerdere kolommen maken voor het OPENROWSET pad.
Als u bestaande statistieken wilt bijwerken, verwijder ze eerst met behulp van de sys.sp_drop_openrowset_statistics opgeslagen procedure en maak ze vervolgens opnieuw aan met behulp van de 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
';
Handmatige statistieken voor externe tabellen
De syntaxis voor het maken van statistieken voor externe tabellen lijkt op de syntaxis die wordt gebruikt voor gewone gebruikerstabellen. Als u statistieken voor een kolom wilt maken, geeft u een naam op voor het statistiekenobject en de naam van de kolom:
CREATE STATISTICS sVendor
ON tbl_TaxiRides (vendorID)
WITH FULLSCAN, NORECOMPUTE;
De WITH opties zijn verplicht en voor de steekproefgrootte zijn FULLSCAN de toegestane opties en SAMPLE n procent.
- Als u statistieken met één kolom voor meerdere kolommen wilt maken, voert u deze uit
CREATE STATISTICSvoor elk van de kolommen. - Statistieken met meerdere kolommen worden niet ondersteund.
Problemen oplossen
Problemen met het uitvoeren van query's treden meestal op wanneer het beheerde SQL-exemplaar geen toegang heeft tot de bestandslocatie. Gerelateerde foutberichten melden mogelijk onvoldoende toegangsrechten, een locatie die niet bestaat, het bestand dat wordt gebruikt door een ander proces of die map kan niet worden weergegeven. In de meeste gevallen geven deze fouten aan dat beleid voor netwerkverkeersbeheer de toegang tot bestanden blokkeert of dat de gebruiker geen toegangsrechten heeft. Controleer de volgende items:
- Onjuist of onjuist getypt locatiepad.
- Geldigheid van SAS-sleutel. Het kan verlopen zijn, een typefout bevatten of begint met een vraagteken.
- Sas-sleutelmachtigingen zijn toegestaan. Minimaal lezen en opnemen als jokertekens worden gebruikt.
- Het inkomende verkeer voor het opslagaccount is geblokkeerd. Controleer voor meer informatie over het beheren van regels voor virtuele netwerken van Azure Storage en zorg ervoor dat toegang vanuit het VNet van het beheerde SQL-exemplaar is toegestaan.
- Uitgaand verkeer op het beheerde SQL-exemplaar geblokkeerd met behulp van het beleid voor opslageindpunten. Uitgaand verkeer naar het opslagaccount toestaan.
- Toegangsrechten voor beheerde identiteiten. Zorg ervoor dat de beheerde identiteit van de instance toegangsrechten heeft voor het opslagaccount.
- Het compatibiliteitsniveau van de database moet 130 of hoger zijn om gegevensvirtualisatiequery's te laten werken.
CREATE EXTERNAL TABLE AS SELECT (Tabel maken in een externe database als selecteren, ook wel CETAS genoemd)
CREATE EXTERNAL TABLE AS SELECT Met (CETAS) kunt u gegevens uit uw met SQL beheerde exemplaar exporteren naar een extern opslagaccount. U kunt CETAS gebruiken om een externe tabel te maken boven op Parquet- of CSV-bestanden in Azure Blob Storage of Azure Data Lake Storage (ADLS) Gen2. CETAS kan ook parallel de resultaten van een T-SQL-instructie SELECT exporteren naar de gemaakte externe tabel. Er is potentieel voor gegevensexfiltratierisico's met deze mogelijkheden, dus met Azure SQL Managed Instance wordt CETAS standaard uitgeschakeld. Raadpleeg CREATE EXTERNAL TABLE AS SELECT (CETAS)om dit in te schakelen.
Beperkingen
- Beveiligingsfunctie op rijniveau wordt niet ondersteund met externe tabellen.
- Dynamische gegevensmaskeringsregel kan niet worden gedefinieerd voor een kolom in een externe tabel.
Bekende problemen
- Wanneer parameterisatie voor Always Encrypted is ingeschakeld in SQL Server Management Studio (SSMS), mislukken gegevensvirtualisatiequery's met
Incorrect syntax near 'PUSHDOWN'een foutbericht.