osvědčené postupy načítání dat do vyhrazeného fondu SQL ve službě Azure Synapse Analytics

V tomto článku najdete doporučení a optimalizace výkonu pro načítání dat.

Příprava dat v Azure Storage

pokud chcete minimalizovat latenci, najděte vrstvu úložiště a vyhrazený fond SQL.

Při exportu dat do formátu souboru ORC může dojít k chybám s nedostatkem paměti Java, pokud se zde nacházejí velké textové sloupce. Toto omezení můžete obejít tím, že importujete jen podmnožinu sloupců.

Základová databáze nemůže načíst řádky, které mají více než 1 000 000 bajtů dat. Když vkládáte data do textových souborů v úložišti Azure Blob nebo ve službě Azure Data Lake Store, musí tyto soubory obsahovat méně než 1 000 000 bajtů dat. Toto omezení platí bez ohledu na schéma tabulky.

Všechny formáty souborů mají jiné výkonové charakteristiky. Pokud chcete docílit nejrychlejšího načtení, použijte komprimované textové soubory s oddělovači. Rozdíl mezi výkonem kódování UTF-8 a UTF-16 je minimální.

Velké komprimované soubory rozdělte do menších komprimovaných souborů.

Spuštění zátěže s dostatečnými výpočetními prostředky

Největší rychlosti při načítání dosáhnete, když budete spouštět vždy jen jednu úlohu načtení dat. Pokud to není možné, spouštějte souběžně co nejmenší počet úloh. pokud očekáváte velkou úlohu načítání, zvažte možnost škálovat svůj vyhrazený fond SQL před jeho zatížením.

Pokud chcete spouštět načítání s odpovídajícími výpočetními prostředky, vytvořte uživatele načítání vyhrazené pro spouštění načítání. Přiřaďte každého uživatele načítání do konkrétní třídy prostředku nebo skupiny úloh. Pokud chcete spustit zátěž, přihlaste se jako jeden z uživatelů načítání a potom spusťte načtení. Načítání se spustí s využitím třídy prostředků tohoto uživatele. Tato metoda je jednodušší než se pokoušet o změnu třídy prostředků uživatele podle aktuálních potřeb třídy prostředků.

Vytvořit uživatele načítání

Tento příklad vytvoří uživatele načítání klasifikovaného na konkrétní skupinu úloh. Prvním krokem je připojení k předloze a vytvoření přihlášení.

   -- Connect to master
   CREATE LOGIN loader WITH PASSWORD = 'a123STRONGpassword!';

Připojení do vyhrazeného fondu SQL a vytvořte uživatele. Následující kód předpokládá, že jste připojeni k databázi s názvem mySampleDataWarehouse. Ukazuje, jak vytvořit uživatele s názvem Loader a přidělí uživateli oprávnění k vytváření tabulek a načtení pomocí příkazu copy. Pak klasifikuje uživatele na skupinu úloh dataloads s maximálními prostředky.

   -- Connect to the dedicated SQL pool
   CREATE USER loader FOR LOGIN loader;
   GRANT ADMINISTER DATABASE BULK OPERATIONS TO loader;
   GRANT INSERT ON <yourtablename> TO loader;
   GRANT SELECT ON <yourtablename> TO loader;
   GRANT CREATE TABLE TO loader;
   GRANT ALTER ON SCHEMA::dbo TO loader;
   
   CREATE WORKLOAD GROUP DataLoads
   WITH ( 
       MIN_PERCENTAGE_RESOURCE = 0
       ,CAP_PERCENTAGE_RESOURCE = 100
       ,REQUEST_MIN_RESOURCE_GRANT_PERCENT = 100
    );

   CREATE WORKLOAD CLASSIFIER [wgcELTLogin]
   WITH (
         WORKLOAD_GROUP = 'DataLoads'
       ,MEMBERNAME = 'loader'
   );



Důležité

toto je extrémní příklad přidělení 100% prostředků fondu SQL do jediného zatížení. To vám poskytne maximální souběžnost 1. Uvědomte si, že by se to mělo používat jenom při počátečním zatížení, kdy budete muset vytvořit další skupiny úloh s vlastní konfigurací pro vyvážení prostředků napříč vašimi úlohami.

Pokud chcete spustit zatížení s prostředky pro načtení skupiny úloh, přihlaste se jako zavaděč a spusťte zátěž.

Povolení načtení více uživatelů

Často je potřeba, aby data do datového skladu načítalo více uživatelů. načítání pomocí CREATE TABLE jako SELECT (Transact-SQL) vyžaduje oprávnění k řízení databáze. Oprávnění CONTROL poskytuje přístup pro řízení ke všem schématům. Pravděpodobně ale nebudete chtít, aby všichni uživatelé, kteří načítají data, měli oprávnění CONTROL pro přístup ke všem schématům. K omezení oprávnění slouží příkaz DENY CONTROL.

Představte si například schémata databáze schema_A pro oddělení A a schema_B pro oddělení B. Uživatelé databáze user_A a user_B budou uživateli pro načítání PolyBase v oddělení A, respektive oddělení B. Oba uživatelé mají k databázi udělená oprávnění CONTROL. Autoři schémat A a B nyní svá schémata uzamknou pomocí příkazu DENY:

   DENY CONTROL ON SCHEMA :: schema_A TO user_B;
   DENY CONTROL ON SCHEMA :: schema_B TO user_A;

User_A a user_B jsou nyní uzamčeny ze schématu jiné oddělení.

Načítání do pracovní tabulky

Pokud chcete při přesunu dat do tabulky datového skladu dosáhnout největší načítací rychlosti, načtěte data do pracovní tabulky. Pracovní tabulku definujte jako haldu a jako způsob distribuce použijte kruhové dotazování (round robin).

Myslete na to, že načítání je většinou dvoufázový proces, kdy napřed načtete data do pracovní tabulky a pak je vložíte do tabulky v provozním datovém skladu. Pokud provozní tabulka používá k distribuci algoritmus hash, může být celková doba načtení a vložení dat kratší, než když k definici pracovní tabulky použijete distribuci hash. Načítání do pracovní tabulky trvá déle, ale druhý krok, který spočívá ve vkládání řádků do provozní tabulky, nepřesouvá data prostřednictvím distribuce.

Načíst do indexu columnstore

Indexy columnstore vyžadují hodně paměti, aby mohly komprimovat data do vysoce kvalitních skupin řádků. Kvůli zajištění co nejlepší účinnosti komprese a indexování musí index columnstore do každé skupiny řádků zkomprimovat maximální počet 1 048 576 řádků. V případě nedostatku paměti nemusí index columnstore dosahovat maximální míry komprese. Tato dopad na výkon dotazů. Podrobné informace najdete v tématu Optimalizace paměti pro columnstore.

  • Pokud chcete zajistit, aby měl nahrávající uživatel dostatek paměti pro dosažení maximální míry komprese, použijte uživatele načítání, kteří jsou členy střední nebo velké třídy prostředků.
  • Načtěte dostatek dat pro úplně naplnění nových skupin řádků. Při hromadném načítání se každých 1 048 576 řádků komprimuje přímo do columnstore jako úplné skupiny řádků. Při načítání méně než 102 400 řádků se řádky odesílají do tabulky deltastore, kde se řádky uchovávají v indexu B-stromu. Pokud načtete příliš málo řádků, můžou se všechny dostat do indexu deltastore, a nebudou se okamžitě komprimovat do formátu columnstore.

Zvýšit velikost dávky při použití rozhraní SQLBulkCopy API nebo BCP

načtení pomocí příkazu COPY poskytne nejvyšší propustnost s vyhrazenými SQL fondy. Pokud nemůžete použít kopírování pro načtení a musí používat rozhraní SqLBulkCopy API nebo BCP, měli byste zvážit zvýšení propustnosti zvětšením velikosti dávky.

Tip

Pro určení optimální kapacity velikosti dávky je velikost dávky mezi 100 až 1 milion řádků doporučeným směrným plánem.

Spravovat selhání načítání

Načtení s použitím externí tabulky může selhat s chybou Query aborted-- the maximum reject threshold was reached while reading from an external source (Dotaz byl přerušen – při čtení z externího zdroje byla dosažena maximální prahová hodnota pro odmítnutí). Tato zpráva znamená, že vaše externí data obsahují nezapsané záznamy. Datový záznam se považuje za nezapsaný, pokud se typy dat nebo čísla sloupců neshodují s definicemi sloupců externí tabulky nebo pokud data neodpovídají zadanému formátu externího souboru.

Pokud chcete nezapsané záznamy opravit, ujistěte se, že jsou definice formátů externí tabulky a externího souboru správné a že externí data těmto definicím odpovídají. V případě, že je sada externích záznamů dat čistá, můžete pro své dotazy odmítat tyto záznamy pomocí možností odmítnutí v možnosti vytvořit externí tabulku .

Vložení dat do produkční tabulky

Při jednorázovém načtení malé tabulky příkazem INSERT nebo i při pravidelně se opakujícím načítání funkcí look-up pravděpodobně vystačíte s následujícím příkazem: INSERT INTO MyLookup VALUES (1, 'Type 1'). Vkládání typu Singleton ale není tak efektivní jako provádění hromadného zatížení.

Pokud máte za den tisíce nebo více samostatných vložení, vytvořte z nich dávku, abyste je mohli načíst hromadně. Vyvíjejte své procesy tak, aby samostatná vkládání připojovaly do souboru, a pak vytvořte další proces, který tento soubor bude pravidelně načítat.

Vytvoření statistiky po načtení

Chcete-li zlepšit výkon dotazů, je důležité vytvořit statistiku pro všechny sloupce všech tabulek po prvním načtení nebo v datech dojde k významným změnám. Vytváření statistik můžete provést ručně nebo můžete povolit Automatické vytváření statistik.

Podrobné vysvětlení statistiky najdete v tématu Statistika. Následující příklad ukazuje, jak ručně vytvořit statistiku pro pět sloupců Customer_Speed tabulky.

create statistics [SensorKey] on [Customer_Speed] ([SensorKey]);
create statistics [CustomerKey] on [Customer_Speed] ([CustomerKey]);
create statistics [GeographyKey] on [Customer_Speed] ([GeographyKey]);
create statistics [Speed] on [Customer_Speed] ([Speed]);
create statistics [YearMeasured] on [Customer_Speed] ([YearMeasured]);

Obměna klíčů úložiště

Osvědčeným postupem zabezpečení je pravidelně měnit přístupový klíč k úložišti objektů blob. Ke svému účtu úložiště objektů Blob máte dva klíče úložiště, abyste je mohli střídat.

Obměna klíčů účtu služby Azure Storage:

Pro každý účet úložiště, jehož klíč se změnil, vydejte příkaz ALTER DATABASE SCOPED CREDENTIAL.

Příklad:

Původní klíč je vytvořený.

CREATE DATABASE SCOPED CREDENTIAL my_credential WITH IDENTITY = 'my_identity', SECRET = 'key1'

Proveďte otočení klíče 1 do klíče 2.

ALTER DATABASE SCOPED CREDENTIAL my_credential WITH IDENTITY = 'my_identity', SECRET = 'key2'

V příslušných externích zdrojích dat se nevyžadují žádné další změny.

Další kroky