Dela via


Prestandaöverväganden i PolyBase för SQL Server

Gäller för: SQL Server 2016 (13.x) – Windows och senare versioner SQL Server 2017 (14.x) – Linux och senare versioner Azure Synapse Analytics

I PolyBase för SQL Server finns det ingen hård gräns för antalet filer eller mängden data som kan efterfrågas. Frågeprestanda beror på mängden data, dataformat, hur data organiseras och komplexiteten i frågor och kopplingar.

Den här artikeln beskriver viktiga prestandaämnen och vägledning.

Statistik

Att samla in statistik om dina externa data är en av de viktigaste sakerna du kan göra för frågeoptimering. Ju mer instansen vet om dina data, desto snabbare kan den köra frågor. Frågeoptimeraren för SQL-motorn är en kostnadsbaserad optimerare. Den jämför kostnaden för olika frågeplaner och väljer sedan planen med den lägsta kostnaden. I de flesta fall väljer den den plan som körs snabbast.

Automatiskt skapande av statistik

Från och med SQL Server 2022 analyserar databasmotorn inkommande användarfrågor efter statistik som saknas. Om statistik saknas skapar frågeoptimeraren automatiskt statistik för enskilda kolumner i frågepredikatet eller kopplingsvillkoret för att förbättra kardinalitetsuppskattningarna för frågeplanen. Automatisk skapande av statistik görs synkront, så du kan observera något försämrade frågeprestanda om dina kolumner saknar statistik. Tiden för att skapa statistik för en enskild kolumn beror på storleken på de filer som är mål.

Skapa manuell statistik för OPENROWSET

Enkolumnsstatistik för sökvägen OPENROWSET kan skapas med hjälp av den sys.sp_create_openrowset_statistics lagrade proceduren genom att skicka en select-fråga med en enda kolumn som 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';

Som standard använder instansen 100% av data som anges i datauppsättningen för att skapa statistik. Du kan också ange urvalsstorleken som procent med hjälp av alternativen TABLESAMPLE. Om du vill skapa statistik med en kolumn för flera kolumner kör sys.sp_create_openrowset_statistics du för var och en av kolumnerna. Du kan inte skapa statistik med flera kolumner för sökvägen OPENROWSET.

Om du vill uppdatera befintlig statistik släpper du dem först med hjälp av den sys.sp_drop_openrowset_statistics lagrade proceduren och återskapar dem sedan med hjälp av 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 
';

Skapa manuell statistik för extern tabell

Syntaxen för att skapa statistik i externa tabeller liknar den som används för vanliga användartabeller. Om du vill skapa statistik för en kolumn anger du ett namn för statistikobjektet och namnet på kolumnen:

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

Alternativen WITH är obligatoriska och för exempelstorleken är FULLSCAN de tillåtna alternativen och SAMPLE n PERCENT.

  • Om du vill skapa statistik med en kolumn för flera kolumner kör CREATE STATISTICS du för var och en av kolumnerna.
  • Statistik för flera kolumner stöds inte.

Sök i partitionerade data

Gäller för Azure SQL Managed Instance och Azure Synapse Analytics.

När data är ordnade i mappar eller filer (kallas även partitioner) använder du partitionseliminering för att endast köra frågor mot specifika mappar och filer. Partitionseliminering minskar antalet filer och mängden data som frågan behöver läsa och bearbeta, vilket ger bättre prestanda.

Om du vill eliminera partitioner från frågekörningen använder du metadatafunktionen filepath() i satsen WHERE i frågan.

Skapa först en extern datakälla:

CREATE EXTERNAL DATA SOURCE NYCTaxiExternalDataSource
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'abs://nyctlc@azureopendatastorage.blob.core.windows.net'
);
GO

Följande exempelfråga läser datafiler för NYC Yellow Taxi endast för de tre sista månaderna 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;

Om dina lagrade data inte är partitionerade kan du överväga att partitionera dem för att förbättra frågeprestandan.

Om du använder externa tabeller filepath() och filename() funktioner stöds men inte i WHERE -satsen. Du kan fortfarande filtrera efter filename eller filepath om du använder dem i beräknade kolumner. Följande exempel visar detta:

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); 

Om dina lagrade data inte är partitionerade kan du överväga att partitionera dem för att förbättra frågeprestandan.

Flytta beräkning till Hadoop

Gäller för SQL Server 2016 (13.x), SQL Server 2017 (14.x) och SQL Server 2019 (endast 15.x)

PolyBase delegerar vissa beräkningar till den externa källan för att optimera den totala sökningen. Frågeoptimeraren fattar ett kostnadsbaserat beslut om att skicka beräkningen till Hadoop, om det förbättrar frågeprestandan. Frågeoptimeraren använder statistik för externa tabeller för att fatta det kostnadsbaserade beslutet. Push-beräkning skapar MapReduce-jobb och utnyttjar Hadoops distribuerade beräkningsresurser. Mer information finns i Pushdown-beräkningar i PolyBase.

Scale compute resources (Skala beräkningsresurser)

Gäller för SQL Server 2016 (13.x), SQL Server 2017 (14.x) och SQL Server 2019 (endast 15.x)

För att förbättra frågeprestandan kan du använda utskalningsgrupper för SQL Server PolyBase. Detta möjliggör parallell dataöverföring mellan SQL Server-instanser och Hadoop-noder och lägger till beräkningsresurser för att arbeta med externa data.

Viktigt!

Utskalningsgrupperna för Microsoft SQL Server PolyBase har dragits tillbaka. Skalbara gruppfunktioner har tagits bort från produkten i SQL Server 2022 (16.x) och senare versioner. PolyBase-datavirtualisering stöds fortfarande fullt ut som en uppskalningsfunktion i SQL Server. Mer information finns i Alternativ för stordata på Microsoft SQL Server-plattformen.