Zprávy ve škálovaných cloudových databázích (Preview)

Platí pro:Azure SQL Database

Důležité

Elastický dotaz v režimu správce map segmentů (horizontální oddílení) pomocí EXTERNAL DATA SOURCE typu SHARD_MAP_MANAGER dosahuje konce podpory 31. března 2027. Po tomto datu budou stávající úlohy nadále fungovat, ale už nebudou dostávat podporu a vytváření nových externích zdrojů dat typu SHARD_MAP_MANAGER už nebude možné. Pro možnosti migrace si přečtěte průvodce migrací z režimu správce map elastických dotazů.

Horizontálně dělené databáze distribuují řádky napříč škálovanou datovou vrstvou. Schéma je stejné u všech zúčastněných databází, označovaných také jako horizontální dělení. Pomocí elastického dotazu můžete vytvářet sestavy, které pokrývají všechny databáze ve shardované databázi.

Diagram fungování dotazů napříč shardy.

Pro rychlý start si přečtěte Sestava napříč cloudovými databázemi s rozšířenou kapacitou (náhled).

Informace o nehardovaných databázích najdete v tématu Dotazování napříč cloudovými databázemi s různými schématy (Preview).

Požadavky

Přehled

Tyto příkazy vytvářejí reprezentaci metadat vrstvy horizontálně dělených dat v databázi elastických dotazů.

  1. VYTVOŘENÍ HLAVNÍHO KLÍČE
  2. VYTVOŘENÍ PŘIHLAŠOVACÍCH ÚDAJŮ S ROZSAHEM DATABÁZE
  3. VYTVOŘENÍ EXTERNÍHO ZDROJE DAT
  4. VYTVOŘENÍ EXTERNÍ TABULKY

1.1 Vytvoření hlavního klíče a přihlašovacích údajů s vymezeným oborem databáze

Přihlašovací údaje používá elastický dotaz pro připojení ke vzdáleným databázím.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE DATABASE SCOPED CREDENTIAL [<credential_name>]  WITH IDENTITY = '<username>',  
SECRET = '<password>';

Poznámka:

Ujistěte se, že "<uživatelské jméno>" neobsahuje žádnou příponu "@servername".

1.2 Vytvoření externích zdrojů dat

Syntaxe:

<External_Data_Source> ::=
    CREATE EXTERNAL DATA SOURCE <data_source_name> WITH
        (TYPE = SHARD_MAP_MANAGER,
                   LOCATION = '<fully_qualified_server_name>',
        DATABASE_NAME = '<shardmap_database_name>',
        CREDENTIAL = <credential_name>,
        SHARD_MAP_NAME = '<shardmapname>'
               ) [;]

Příklad

CREATE EXTERNAL DATA SOURCE MyExtSrc
WITH
(
    TYPE=SHARD_MAP_MANAGER,
    LOCATION='myserver.database.windows.net',
    DATABASE_NAME='ShardMapDatabase',
    CREDENTIAL= SMMUser,
    SHARD_MAP_NAME='ShardMap'
);

Načtení seznamu aktuálních externích zdrojů dat:

select * from sys.external_data_sources;

Externí zdroj dat odkazuje na vaši mapu shards. Elastický dotaz pak použije externí zdroj dat a podkladovou mapu horizontálních oddílů k vytvoření výčtu databází, které se účastní datové vrstvy.

Stejné přihlašovací údaje slouží ke čtení mapy horizontálních oddílů a k přístupu k datům v horizontálních oddílech během zpracování elastického dotazu.

1.3 Vytvoření externích tabulek

Syntaxe:

CREATE EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] table_name  
    ( { <column_definition> } [ ,...n ])
    { WITH ( <sharded_external_table_options> ) }
) [;]  

<sharded_external_table_options> ::=
  DATA_SOURCE = <External_Data_Source>,
  [ SCHEMA_NAME = N'nonescaped_schema_name',]
  [ OBJECT_NAME = N'nonescaped_object_name',]
  DISTRIBUTION = SHARDED(<sharding_column_name>) | REPLICATED |ROUND_ROBIN

Příklad

CREATE EXTERNAL TABLE [dbo].[order_line](
     [ol_o_id] int NOT NULL,
     [ol_d_id] tinyint NOT NULL,
     [ol_w_id] int NOT NULL,
     [ol_number] tinyint NOT NULL,
     [ol_i_id] int NOT NULL,
     [ol_delivery_d] datetime NOT NULL,
     [ol_amount] smallmoney NOT NULL,
     [ol_supply_w_id] int NOT NULL,
     [ol_quantity] smallint NOT NULL,
      [ol_dist_info] char(24) NOT NULL
)

WITH
(
    DATA_SOURCE = MyExtSrc,
     SCHEMA_NAME = 'orders',
     OBJECT_NAME = 'order_details',
    DISTRIBUTION=SHARDED(ol_w_id)
);

Načtení seznamu externích tabulek z aktuální databáze:

SELECT * from sys.external_tables;

Odstranění externích tabulek:

DROP EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] table_name[;]

Poznámky

Klauzule DATA_SOURCE definuje externí zdroj dat (mapování horizontálních oddílů), který se používá pro externí tabulku.

Klauzule SCHEMA_NAME a OBJECT_NAME mapují definici externí tabulky na tabulku v jiném schématu. Pokud toto vynecháte, předpokládá se, že schéma vzdáleného objektu je dbo a jeho název je považován za stejný jako název externí tabulky, který je definován. To je užitečné, pokud je název vzdálené tabulky již převzat v databázi, ve které chcete vytvořit externí tabulku. Chcete například definovat externí tabulku, abyste získali agregované zobrazení zobrazení katalogu nebo zobrazení dynamické správy na datové vrstvě s horizontálním navýšením kapacity. Vzhledem k tomu, že zobrazení katalogu a zobrazení dynamické správy již existují místně, nemůžete použít jejich názvy pro definici externí tabulky. Místo toho použijte jiný název a použijte název zobrazení katalogu nebo názvu DMV ve klauzulích SCHEMA_NAME a/nebo OBJECT_NAME. (Viz příklad později.)

Klauzule DISTRIBUTION určuje distribuci dat použitou pro tuto tabulku. Procesor dotazů využívá informace uvedené v DISTRIBUTION klauzuli k vytvoření nejúčinnějších plánů dotazů.

  1. SHARDED znamená, že data jsou horizontálně rozdělena mezi databáze. Klíč dělení pro distribuci dat je parametr <sharding_column_name>.
  2. REPLICATED znamená, že v každé databázi jsou přítomny stejné kopie tabulky. Je vaší zodpovědností zajistit, aby repliky byly v databázích stejné.
  3. ROUND_ROBIN znamená, že tabulka je horizontálně rozdělena pomocí metody distribuce závislé na aplikaci.

Odkaz na datovou vrstvu: Externí tabulka DDL odkazuje na externí zdroj dat. Externí zdroj dat určuje shard mapu, která poskytuje externí tabulce informace potřebné k vyhledání všech databází ve vaší datové vrstvě.

Bezpečnostní aspekty

Uživatelé s přístupem k externí tabulce automaticky získají přístup k podkladovým vzdáleným tabulkám v rámci přihlašovacích údajů zadaných v definici externího zdroje dat. Vyhněte se nežádoucímu zvýšení oprávnění prostřednictvím přihlašovacích údajů externího zdroje dat. Pro externí tabulku použijte funkci GRANT nebo REVOKE, jako by šlo o běžnou tabulku.

Po definování externího zdroje dat a externích tabulek teď můžete pro externí tabulky použít úplný T-SQL.

Příklad: Dotazování vodorovných dělených databází

Následující dotaz provádí třícestné spojení mezi sklady, objednávkami a řádky objednávek a používá několik agregací a selektivní filtr. Předpokládá se (1) horizontální dělení (sharding) a (2), že sklady, objednávky a řádky objednávek jsou rozděleny podle sloupce ID skladu a že elastický dotaz může zajistit společnou lokalizaci spojení na shardy a zpracovat nákladnou část dotazu paralelně na shardech.

    select  
         w_id as warehouse,
         o_c_id as customer,
         count(*) as cnt_orderline,
         max(ol_quantity) as max_quantity,
         avg(ol_amount) as avg_amount,
         min(ol_delivery_d) as min_deliv_date
    from warehouse
    join orders
    on w_id = o_w_id
    join order_line
    on o_id = ol_o_id and o_w_id = ol_w_id
    where w_id > 100 and w_id < 200
    group by w_id, o_c_id

Uložená procedura pro vzdálené spouštění T-SQL: sp_execute_remote

Elastický dotaz také zavádí uloženou proceduru, která poskytuje přímý přístup k shardům. Uložená procedura se nazývá sp_execute_remote a lze ji použít ke spouštění vzdálených uložených procedur nebo kódu T-SQL ve vzdálených databázích. Přebírá následující parametry:

  • Název zdroje dat (nvarchar): Název externího zdroje dat typu RDBMS.
  • Dotaz (nvarchar): Dotaz T-SQL, který se má spustit na každém shardu.
  • Deklarace parametru (nvarchar) – volitelné: Řetězec s definicemi datového typu pro parametry použité v parametru dotazu (například sp_executesql)
  • Seznam hodnot parametrů – volitelný: Seznam hodnot parametrů oddělený čárkami (například sp_executesql)

Používá sp_execute_remote externí zdroj dat zadaný v parametrech vyvolání ke spuštění daného příkazu T-SQL ve vzdálených databázích. Používá přihlašovací údaje externího zdroje dat pro připojení k databázi správce shardmap a vzdáleným databázím.

Příklad:

    EXEC sp_execute_remote
        N'MyExtSrc',
        N'select count(w_id) as foo from warehouse'

Možnosti připojení pro nástroje

Pomocí běžných připojovacích řetězců SQL Serveru připojte aplikaci, BI a nástroje pro integraci dat k databázi, která zahrnuje definice externích tabulek. Ujistěte se, že sql Server je podporovaný jako zdroj dat pro váš nástroj. Pak na databázi elastických dotazů odkazujte stejně jako na jakoukoli jinou databázi SQL Serveru připojenou k nástroji a použijte externí tabulky z vašeho nástroje nebo aplikace, jako by se jednalo o místní tabulky.

Osvědčené postupy

  • Externí zdroje dat konfigurujte pouze pro důvěryhodné koncové body. Omezte odchozí síť, aby logický server nezávisle povolil seznamem schválené cílové FQDN. Pro více informací viz Zabezpečené externí zdroje dat.
  • Ujistěte se, že databáze koncového bodu elastického dotazu získala přístup k databázi shardmap a všem shardům prostřednictvím bran firewall služby SQL Database.
  • Ověřte nebo vynucujte distribuci dat definovanou externí tabulkou. Pokud se vaše skutečná distribuce dat liší od distribuce zadané v definici tabulky, můžou dotazy přinést neočekávané výsledky.
  • Elastický dotaz v současné době neprovádí eliminaci fragmentů, pokud by predikáty nad fragmentačním klíčem umožnily bezpečně vyloučit určité fragmenty ze zpracování.
  • Elastický dotaz je nejvhodnější pro dotazy, ve kterých lze většinu výpočtů provádět na shardách. Obvykle dosáhnete nejlepšího výkonu dotazů pomocí selektivních filtrů, které lze vyhodnotit na shardech, nebo spojení přes klíče pro dělení, které lze provádět sladěným způsobem s particionováním na všech shardech. Jiné vzory dotazů můžou potřebovat načíst velké objemy dat z dílů do hlavního uzlu a mohou mít nízký výkon.