Návrh tabulek s využitím vyhrazeného fondu SQL v Azure Synapse Analytics

Tento článek obsahuje klíčové úvodní koncepty návrhu tabulek ve vyhrazeném fondu SQL.

Určení kategorie tabulky

Schéma star uspořádá data do tabulek faktů a dimenzí. Některé tabulky se používají pro integraci nebo přípravu dat předtím, než se přesunou do tabulky faktů nebo dimenzí. Při návrhu tabulky se rozhodněte, jestli data tabulky patří do tabulky faktů, dimenzí nebo integrační tabulky. Toto rozhodnutí informuje příslušnou strukturu a distribuci tabulek.

  • Tabulky faktů obsahují kvantitativní data, která se běžně generují v transakčním systému a pak se načítají do vyhrazeného fondu SQL. Například maloobchodní firma každý den generuje prodejní transakce a pak načte data do vyhrazené tabulky faktů fondu SQL pro analýzu.

  • Tabulky dimenzí obsahují data atributů, která se můžou měnit, ale obvykle se mění jen zřídka. Například jméno a adresa zákazníka jsou uloženy v tabulce dimenzí a aktualizovány pouze v případě, že se změní profil zákazníka. Pokud chcete minimalizovat velikost velké tabulky faktů, nemusí být jméno a adresa zákazníka v každém řádku tabulky faktů. Místo toho může tabulka faktů a tabulka dimenzí sdílet ID zákazníka. Dotaz může tyto dvě tabulky spojit a přidružit profil a transakce zákazníka.

  • Tabulky integrace poskytují místo pro integraci nebo přípravu dat. Integrační tabulku můžete vytvořit jako běžnou tabulku, externí tabulku nebo dočasnou tabulku. Můžete například načíst data do pracovní tabulky, provádět transformace dat v přípravné fázi a pak je vložit do produkční tabulky.

Názvy schémat a tabulek

Schémata představují dobrý způsob, jak seskupit tabulky, které se používají podobným způsobem, dohromady. Pokud migrujete více databází z místního řešení do vyhrazeného fondu SQL, je nejvhodnější migrovat všechny tabulky faktů, dimenzí a integrací do jednoho schématu ve vyhrazeném fondu SQL.

Můžete například uložit všechny tabulky v ukázkovém vyhrazeném fondu SQL WideWorldImportersDW do jednoho schématu s názvem wwi. Následující kód vytvoří uživatelem definované schéma s názvem wwi.

CREATE SCHEMA wwi;

Pokud chcete zobrazit uspořádání tabulek ve vyhrazeném fondu SQL, můžete jako předpony názvů tabulek použít fact, dim a int. V následující tabulce jsou uvedeny některé názvy schématu a tabulek pro WideWorldImportersDW.

Tabulka WideWorldImportersDW Typ tabulky Vyhrazený fond SQL
City (Město) Dimenze Wwi. DimCity
Objednávka Fact Wwi. Pořadí faktů

Trvalost tabulek

Tabulky ukládají data trvale ve službě Azure Storage, dočasně ve službě Azure Storage nebo v úložišti dat mimo vyhrazený fond SQL.

Běžná tabulka

Běžná tabulka ukládá data ve službě Azure Storage jako součást vyhrazeného fondu SQL. Tabulka a data zůstanou zachovány bez ohledu na to, jestli je relace otevřená. Následující příklad vytvoří běžnou tabulku se dvěma sloupci.

CREATE TABLE MyTable (col1 int, col2 int );  

Dočasná tabulka

Dočasná tabulka existuje pouze po dobu trvání relace. Dočasnou tabulku můžete použít k tomu, abyste ostatním uživatelům zabránili v zobrazení dočasných výsledků a také snížili potřebu čištění.

Dočasné tabulky využívají místní úložiště, které nabízí rychlý výkon. Další informace najdete v tématu Dočasné tabulky.

Externí tabulka

Externí tabulka odkazuje na data umístěná v objektu blob služby Azure Storage nebo v Azure Data Lake Store. Při použití s příkazem CREATE TABLE AS SELECT naimportuje výběr z externí tabulky data do vyhrazeného fondu SQL.

Externí tabulky jsou proto užitečné pro načítání dat. Kurz načítání najdete v tématu Použití PolyBase k načtení dat z úložiště objektů blob v Azure.

Typy dat

Vyhrazený fond SQL podporuje nejčastěji používané datové typy. Seznam podporovaných datových typů najdete v tématu o datových typech v odkazu CREATE TABLE v příkazu CREATE TABLE. Pokyny k používání datových typů najdete v tématu Datové typy.

Distribuované tabulky

Základní funkcí vyhrazeného fondu SQL je způsob, jakým může ukládat a pracovat s tabulkami napříč distribucemi. Vyhrazený fond SQL podporuje tři metody distribuce dat: kruhové dotazování (výchozí), hash a replikované.

Distribuované zatřiďovací tabulky (distribuce hodnot hash)

Distribuovaná tabulka hash distribuuje řádky na základě hodnoty v distribučním sloupci. Distribuovaná tabulka hash je navržená tak, aby dosahovala vysokého výkonu u dotazů ve velkých tabulkách. Při výběru distribučního sloupce je potřeba vzít v úvahu několik faktorů.

Další informace najdete v tématu Pokyny k návrhu distribuovaných tabulek.

Replikované tabulky

Replikovaná tabulka má úplnou kopii tabulky dostupnou na každém výpočetním uzlu. Dotazy běží na replikovaných tabulkách rychle, protože spojení replikovaných tabulek nevyžadují přesun dat. Replikace ale vyžaduje další úložiště a není praktická pro velké tabulky.

Další informace najdete v tématu Pokyny k návrhu replikovaných tabulek.

Tabulky kruhového dotazování

Tabulka kruhového dotazování rovnoměrně distribuuje řádky tabulky napříč všemi rozděleními. Řádky jsou rozděleny náhodně. Načítání dat do tabulky kruhového dotazování je rychlé. Mějte na paměti, že dotazy můžou vyžadovat větší přesun dat než ostatní metody distribuce.

Další informace najdete v tématu Pokyny k návrhu distribuovaných tabulek.

Běžné metody distribuce pro tabulky

Kategorie tabulky často určuje, kterou možnost pro distribuci tabulky zvolit.

Kategorie tabulky Doporučená možnost distribuce
Fact Použijte distribuci hodnot hash s clusterovaným indexem columnstore. Výkon se zvýší, když jsou dvě tabulky hash spojeny ve stejném distribučním sloupci.
Dimenze Používejte replikované pro menší tabulky. Pokud jsou tabulky příliš velké na to, aby je bylo možné ukládat do jednotlivých výpočetních uzlů, použijte distribuovanou hodnotu hash.
Příprava Pro pracovní tabulku použijte kruhové dotazování. Zatížení pomocí CTAS je rychlé. Jakmile jsou data v pracovní tabulce, použijte příkaz INSERT... VYBERTE a přesuňte data do produkčních tabulek.

Poznámka

Doporučení k nejlepší strategii distribuce tabulek na základě vašich úloh najdete v tématu Azure Synapse SQL Distribution Advisor.

Oddíly tabulky

Dělená tabulka ukládá a provádí operace s řádky tabulky podle oblastí dat. Tabulka může být například rozdělená podle dne, měsíce nebo roku. Výkon dotazů můžete zlepšit odstraněním oddílů, což omezuje prohledávání dotazů na data v rámci oddílu. Data můžete také udržovat prostřednictvím přepínání oddílů. Vzhledem k tomu, že data ve fondu SQL jsou už distribuovaná, může příliš mnoho oddílů zpomalit výkon dotazů. Další informace najdete v pokynech k dělení. Při přepínání oddílů na oddíly tabulky, které nejsou prázdné, zvažte použití možnosti TRUNCATE_TARGET v příkazu ALTER TABLE , pokud chcete stávající data zkrátit. Následující kód přepne v transformovaných denních datech na SalesFact, který přepíše všechna existující data.

ALTER TABLE SalesFact_DailyFinalLoad SWITCH PARTITION 256 TO SalesFact PARTITION 256 WITH (TRUNCATE_TARGET = ON);  

Indexy Columnstore

Ve výchozím nastavení vyhrazený fond SQL ukládá tabulku jako clusterovaný index columnstore. Tato forma úložiště dat dosahuje vysoké komprese dat a výkonu dotazů u velkých tabulek.

Clusterovaný index columnstore je obvykle nejlepší volbou, ale v některých případech je vhodnou strukturou úložiště clusterovaný index nebo halda.

Tip

Tabulka haldy může být zvlášť užitečná pro načítání přechodných dat, například pracovní tabulky, která se transformuje na konečnou tabulku.

Seznam funkcí columnstore najdete v tématu Novinky v indexech columnstore. Pokud chcete zvýšit výkon indexu columnstore, přečtěte si téma Maximalizace kvality skupiny řádků pro indexy columnstore.

Statistika

Optimalizátor dotazů používá statistiky na úrovni sloupců při vytváření plánu pro provedení dotazu.

Pokud chcete zlepšit výkon dotazů, je důležité mít statistiky o jednotlivých sloupcích, zejména o sloupcích používaných ve spojeních dotazů. Vytváření statistik probíhá automaticky.

Statistiky se neaktualizují automaticky. Aktualizujte statistiky po přidání nebo změně významného počtu řádků. Například aktualizovat statistiku po načtení. Další informace najdete v doprovodných materiálech ke statistikám.

Primární klíč a jedinečný klíč

PRIMÁRNÍ KLÍČ se podporuje pouze v případech, kdy se používají neclusterované klíče i NEVYNUCOVANÉ. Omezení UNIQUE je podporováno pouze s použitím funkce NOT Vynucováno. Projděte si omezení tabulek vyhrazeného fondu SQL.

Příkazy pro vytváření tabulek

Tabulku můžete vytvořit jako novou prázdnou tabulku. Můžete také vytvořit a naplnit tabulku výsledky příkazu select. Níže jsou uvedené příkazy T-SQL pro vytvoření tabulky.

Příkaz T-SQL Popis
CREATE TABLE Vytvoří prázdnou tabulku definováním všech sloupců a možností tabulky.
VYTVOŘENÍ EXTERNÍ TABULKY Vytvoří externí tabulku. Definice tabulky je uložená ve vyhrazeném fondu SQL. Data tabulky se ukládají ve službě Azure Blob Storage nebo Azure Data Lake Store.
CREATE TABLE AS SELECT Naplní novou tabulku výsledky příkazu select. Sloupce a datové typy tabulky jsou založené na výsledcích příkazu select. Pokud chcete importovat data, můžete tento příkaz vybrat z externí tabulky.
CREATE EXTERNAL TABLE AS SELECT Vytvoří novou externí tabulku exportováním výsledků příkazu select do externího umístění. Umístěním je buď Azure Blob Storage, nebo Azure Data Lake Store.

Sladění zdrojových dat s vyhrazeným fondem SQL

Tabulky vyhrazeného fondu SQL se naplní načtením dat z jiného zdroje dat. Pro úspěšné načtení musí počet a datové typy sloupců ve zdrojových datech odpovídat definici tabulky ve vyhrazeném fondu SQL. Zajištění sladění dat může být při návrhu tabulek nejtěžší.

Pokud data pocházejí z více úložišť dat, načtete je do vyhrazeného fondu SQL a uložíte je do tabulky integrace. Jakmile jsou data v tabulce integrace, můžete k provádění transformačních operací využít výkon vyhrazeného fondu SQL. Jakmile jsou data připravená, můžete je vložit do produkčních tabulek.

Nepodporované funkce tabulek

Vyhrazený fond SQL podporuje mnoho funkcí tabulky, ale ne všechny, které nabízejí jiné databáze. Následující seznam obsahuje některé funkce tabulky, které nejsou ve vyhrazeném fondu SQL podporované:

Dotazy na velikost tabulky

Poznámka

Pokud chcete získat přesné počty z dotazů v této části, ujistěte se, že údržba indexů probíhá v pravidelných intervalech a po změnách velkých dat.

Jedním jednoduchým způsobem, jak identifikovat prostor a řádky spotřebované tabulkou v každé z 60 distribucí, je použít DBCC PDW_SHOWSPACEUSED.

DBCC PDW_SHOWSPACEUSED('dbo.FactInternetSales');

Použití příkazů DBCC však může být docela omezující. Zobrazení dynamické správy (DMV) zobrazují podrobnější informace než příkazy DBCC. Začněte vytvořením tohoto zobrazení:

CREATE VIEW dbo.vTableSizes
AS
WITH base
AS
(
SELECT
 GETDATE()                                                             AS  [execution_time]
, DB_NAME()                                                            AS  [database_name]
, s.name                                                               AS  [schema_name]
, t.name                                                               AS  [table_name]
, QUOTENAME(s.name)+'.'+QUOTENAME(t.name)                              AS  [two_part_name]
, nt.[name]                                                            AS  [node_table_name]
, ROW_NUMBER() OVER(PARTITION BY nt.[name] ORDER BY (SELECT NULL))     AS  [node_table_name_seq]
, tp.[distribution_policy_desc]                                        AS  [distribution_policy_name]
, c.[name]                                                             AS  [distribution_column]
, nt.[distribution_id]                                                 AS  [distribution_id]
, i.[type]                                                             AS  [index_type]
, i.[type_desc]                                                        AS  [index_type_desc]
, nt.[pdw_node_id]                                                     AS  [pdw_node_id]
, pn.[type]                                                            AS  [pdw_node_type]
, pn.[name]                                                            AS  [pdw_node_name]
, di.name                                                              AS  [dist_name]
, di.position                                                          AS  [dist_position]
, nps.[partition_number]                                               AS  [partition_nmbr]
, nps.[reserved_page_count]                                            AS  [reserved_space_page_count]
, nps.[reserved_page_count] - nps.[used_page_count]                    AS  [unused_space_page_count]
, nps.[in_row_data_page_count]
    + nps.[row_overflow_used_page_count]
    + nps.[lob_used_page_count]                                        AS  [data_space_page_count]
, nps.[reserved_page_count]
 - (nps.[reserved_page_count] - nps.[used_page_count])
 - ([in_row_data_page_count]
         + [row_overflow_used_page_count]+[lob_used_page_count])       AS  [index_space_page_count]
, nps.[row_count]                                                      AS  [row_count]
from
    sys.schemas s
INNER JOIN sys.tables t
    ON s.[schema_id] = t.[schema_id]
INNER JOIN sys.indexes i
    ON  t.[object_id] = i.[object_id]
    AND i.[index_id] <= 1
INNER JOIN sys.pdw_table_distribution_properties tp
    ON t.[object_id] = tp.[object_id]
INNER JOIN sys.pdw_table_mappings tm
    ON t.[object_id] = tm.[object_id]
INNER JOIN sys.pdw_nodes_tables nt
    ON tm.[physical_name] = nt.[name]
INNER JOIN sys.dm_pdw_nodes pn
    ON  nt.[pdw_node_id] = pn.[pdw_node_id]
INNER JOIN sys.pdw_distributions di
    ON  nt.[distribution_id] = di.[distribution_id]
INNER JOIN sys.dm_pdw_nodes_db_partition_stats nps
    ON nt.[object_id] = nps.[object_id]
    AND nt.[pdw_node_id] = nps.[pdw_node_id]
    AND nt.[distribution_id] = nps.[distribution_id]
    AND i.[index_id] = nps.[index_id]
LEFT OUTER JOIN (select * from sys.pdw_column_distribution_properties where distribution_ordinal = 1) cdp
    ON t.[object_id] = cdp.[object_id]
LEFT OUTER JOIN sys.columns c
    ON cdp.[object_id] = c.[object_id]
    AND cdp.[column_id] = c.[column_id]
WHERE pn.[type] = 'COMPUTE'
)
, size
AS
(
SELECT
   [execution_time]
,  [database_name]
,  [schema_name]
,  [table_name]
,  [two_part_name]
,  [node_table_name]
,  [node_table_name_seq]
,  [distribution_policy_name]
,  [distribution_column]
,  [distribution_id]
,  [index_type]
,  [index_type_desc]
,  [pdw_node_id]
,  [pdw_node_type]
,  [pdw_node_name]
,  [dist_name]
,  [dist_position]
,  [partition_nmbr]
,  [reserved_space_page_count]
,  [unused_space_page_count]
,  [data_space_page_count]
,  [index_space_page_count]
,  [row_count]
,  ([reserved_space_page_count] * 8.0)                                 AS [reserved_space_KB]
,  ([reserved_space_page_count] * 8.0)/1000                            AS [reserved_space_MB]
,  ([reserved_space_page_count] * 8.0)/1000000                         AS [reserved_space_GB]
,  ([reserved_space_page_count] * 8.0)/1000000000                      AS [reserved_space_TB]
,  ([unused_space_page_count]   * 8.0)                                 AS [unused_space_KB]
,  ([unused_space_page_count]   * 8.0)/1000                            AS [unused_space_MB]
,  ([unused_space_page_count]   * 8.0)/1000000                         AS [unused_space_GB]
,  ([unused_space_page_count]   * 8.0)/1000000000                      AS [unused_space_TB]
,  ([data_space_page_count]     * 8.0)                                 AS [data_space_KB]
,  ([data_space_page_count]     * 8.0)/1000                            AS [data_space_MB]
,  ([data_space_page_count]     * 8.0)/1000000                         AS [data_space_GB]
,  ([data_space_page_count]     * 8.0)/1000000000                      AS [data_space_TB]
,  ([index_space_page_count]  * 8.0)                                   AS [index_space_KB]
,  ([index_space_page_count]  * 8.0)/1000                              AS [index_space_MB]
,  ([index_space_page_count]  * 8.0)/1000000                           AS [index_space_GB]
,  ([index_space_page_count]  * 8.0)/1000000000                        AS [index_space_TB]
FROM base
)
SELECT *
FROM size
;

Souhrn prostoru tabulky

Tento dotaz vrátí řádky a mezery po tabulce. Umožňuje zobrazit, které tabulky jsou největší a jestli se jedná o kruhové dotazování, replikaci nebo distribuci hodnot hash. V případě tabulek distribuovaných za hash dotaz zobrazí distribuční sloupec.

SELECT
     database_name
,    schema_name
,    table_name
,    distribution_policy_name
,      distribution_column
,    index_type_desc
,    COUNT(distinct partition_nmbr) as nbr_partitions
,    SUM(row_count)                 as table_row_count
,    SUM(reserved_space_GB)         as table_reserved_space_GB
,    SUM(data_space_GB)             as table_data_space_GB
,    SUM(index_space_GB)            as table_index_space_GB
,    SUM(unused_space_GB)           as table_unused_space_GB
FROM
    dbo.vTableSizes
GROUP BY
     database_name
,    schema_name
,    table_name
,    distribution_policy_name
,      distribution_column
,    index_type_desc
ORDER BY
    table_reserved_space_GB desc
;

Prostor tabulky podle typu distribuce

SELECT
     distribution_policy_name
,    SUM(row_count)                as table_type_row_count
,    SUM(reserved_space_GB)        as table_type_reserved_space_GB
,    SUM(data_space_GB)            as table_type_data_space_GB
,    SUM(index_space_GB)           as table_type_index_space_GB
,    SUM(unused_space_GB)          as table_type_unused_space_GB
FROM dbo.vTableSizes
GROUP BY distribution_policy_name
;

Prostor tabulky podle typu indexu

SELECT
     index_type_desc
,    SUM(row_count)                as table_type_row_count
,    SUM(reserved_space_GB)        as table_type_reserved_space_GB
,    SUM(data_space_GB)            as table_type_data_space_GB
,    SUM(index_space_GB)           as table_type_index_space_GB
,    SUM(unused_space_GB)          as table_type_unused_space_GB
FROM dbo.vTableSizes
GROUP BY index_type_desc
;

Souhrn distribučního prostoru

SELECT
    distribution_id
,    SUM(row_count)                as total_node_distribution_row_count
,    SUM(reserved_space_MB)        as total_node_distribution_reserved_space_MB
,    SUM(data_space_MB)            as total_node_distribution_data_space_MB
,    SUM(index_space_MB)           as total_node_distribution_index_space_MB
,    SUM(unused_space_MB)          as total_node_distribution_unused_space_MB
FROM dbo.vTableSizes
GROUP BY     distribution_id
ORDER BY    distribution_id
;

Další kroky

Po vytvoření tabulek pro vyhrazený fond SQL je dalším krokem načtení dat do tabulky. Kurz načítání najdete v tématu Načítání dat do vyhrazeného fondu SQL a v tématu Strategie načítání dat pro vyhrazený fond SQL v Azure Synapse Analytics.