Megosztás:


PolyBase teljesítménnyel kapcsolatos szempontok az SQL Serverhez

A következőkre vonatkozik: SQL Server 2016 (13.x) és újabb verziók Windows SQL Server 2017-en (14.x) és újabb verziók linuxos Azure Synapse Analyticsen

Az SQL Server PolyBase-ben nincs korlátozva a fájlok száma vagy a lekérdezhető adatok mennyisége. A lekérdezési teljesítmény függ az adatok mennyiségétől, az adatformátumtól, az adatok rendszerezésének módjától, valamint a lekérdezések és illesztések összetettségétől.

Ez a cikk fontos teljesítménytémaköröket és útmutatást tartalmaz.

statisztika

A külső adatok statisztikáinak gyűjtése az egyik legfontosabb teendő a lekérdezésoptimalizáláshoz. Minél többet tud a példány az adatokról, annál gyorsabban hajthat végre lekérdezéseket. Az SQL-motor lekérdezésoptimalizálója egy költségalapú optimalizáló. Összehasonlítja a különböző lekérdezési tervek költségeit, majd a legalacsonyabb költséggel választja ki a csomagot. A legtöbb esetben a leggyorsabban végrehajtó tervet választja ki.

Statisztikák automatikus létrehozása

Az SQL Server 2022-től kezdve az adatbázismotor elemzi a hiányzó statisztikák bejövő felhasználói lekérdezéseit. Ha a statisztikák hiányoznak, a lekérdezésoptimalizáló automatikusan létrehozza a lekérdezési predikátum vagy illesztés feltétel egyes oszlopainak statisztikáit a lekérdezésterv számosságbecsléseinek javítása érdekében. A statisztikák automatikus létrehozása szinkron módon történik, így az oszlopok hiányzó statisztikái esetén a lekérdezési teljesítmény némileg csökkenthet. Az egyetlen oszlop statisztikáinak létrehozásához szükséges idő a megcélzott fájlok méretétől függ.

OPENROWSET manuális statisztikák létrehozása

Az OPENROWSET-elérési út egyoszlopos statisztikái a sys.sp_create_openrowset_statistics tárolt eljárással hozhatók létre úgy, hogy paraméterként egyetlen oszlopot adnak át a választó lekérdezésnek:

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

A példány alapértelmezés szerint az adathalmazban megadott adatok 100% használ statisztikák létrehozásához. A mintaméretet tetszés szerint százalékként is megadhatja a TABLESAMPLE beállításaival. Több oszlophoz egyoszlopos statisztikák létrehozásához hajtsa végre a sys.sp_create_openrowset_statistics parancsot az egyes oszlopoknál. Az OPENROWSET elérési úthoz nem hozhat létre többoszlopos statisztikát.

A meglévő statisztikák frissítéséhez először törölje őket a sys.sp_drop_openrowset_statistics tárolt eljárással, majd hozza létre újra őket a sys.sp_create_openrowset_statistics segítségével.

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

Külső táblázathoz manuális statisztikák létrehozása

A külső táblák statisztikáinak létrehozásához használt szintaxis a szokásos felhasználói táblákhoz hasonló. Ha statisztikákat szeretne létrehozni egy oszlopon, adja meg a statisztikai objektum nevét és az oszlop nevét:

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

A WITH beállítások kötelezőek, a mintamérethez pedig az engedélyezett beállítások FULLSCAN és SAMPLE n PERCENTa .

  • Több oszlophoz egyoszlopos statisztikák létrehozásához hajtsa végre a CREATE STATISTICS parancsot az egyes oszlopoknál.
  • A többoszlopos statisztikák nem támogatottak.

Particionált adatok lekérdezése

Az alábbiakra vonatkozik: Azure SQL Felügyelt Példány és Azure Synapse Analytics.

Ha az adatok mappákba vagy fájlokba (más néven partíciókba) lesznek rendezve, a partíciók eltávolításával csak bizonyos mappákat és fájlokat kérdezhet le. A partíciók megszüntetése csökkenti a fájlok számát és a lekérdezéshez szükséges adatok mennyiségét, ami jobb teljesítményt eredményez.

A partíciók lekérdezés végrehajtásából való eltávolításához használja a metaadatfüggvényt filepath() a WHERE lekérdezés záradékában.

Először hozzon létre egy külső adatforrást:

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

Az alábbi minta lekérdezés csak 2017 utolsó három hónapjára vonatkozóan olvassa be az NYC Yellow Taxi adatfájljait:

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;

Ha a tárolt adatok nincsenek particionálva, fontolja meg a particionálást a lekérdezési teljesítmény javítása érdekében.

Ha külső táblákat használ, a filepath() és filename() függvények támogatottak, de a WHERE záradékban nem szerepelhetnek. Továbbra is szűrhet filename vagy filepath szerint, ha ezeket számított oszlopokban használja. Az alábbi példa a következőket mutatja be:

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

Ha a tárolt adatok nincsenek particionálva, fontolja meg a particionálást a lekérdezési teljesítmény javítása érdekében.

Számítás áthelyezése a Hadoop rendszerbe

A következőkre vonatkozik: SQL Server 2016 (13.x), SQL Server 2017 (14.x) és SQL Server 2019 (csak 15.x)

A PolyBase leküld néhány számítást a külső forrásba a teljes lekérdezés optimalizálása érdekében. A lekérdezésoptimalizáló költségalapú döntést hoz, hogy leküldi a számítást a Hadoopnak, ha ez javítja a lekérdezés teljesítményét. A lekérdezésoptimalizáló a külső táblák statisztikáit használja a költségalapú döntés meghozatalához. A leküldéses számítások MapReduce-feladatokat hoznak létre, és kihasználják a Hadoop elosztott számítási erőforrásait. További információért lásd: Leküldéses számítások a PolyBase-ben.

Számítási erőforrások méretezése

A következőkre vonatkozik: SQL Server 2016 (13.x), SQL Server 2017 (14.x) és SQL Server 2019 (csak 15.x)

A lekérdezési teljesítmény javítása érdekében használhatja az SQL Server PolyBase horizontális felskálázási csoportjait. Ez párhuzamos adatátvitelt tesz lehetővé az SQL Server-példányok és a Hadoop-csomópontok között, és számítási erőforrásokat ad hozzá a külső adatokon való üzemeltetéshez.

Fontos

A Microsoft SQL Server PolyBase kibővített csoportjait kivonták. A kibővített csoport funkciói el lettek távolítva a termékből az SQL Server 2022 (16.x) és újabb verzióiban. A PolyBase adatvirtualizálása továbbra is teljes mértékben támogatott az SQL Server vertikális felskálázási funkciójaként. További információkért tekintse meg a Nagy adathalmaz-beállításokat a Microsoft SQL Server platformon.