Vytváření sestav napříč cloudovými databázemi se škálováním na více systémů (Preview)
Platí pro: Azure SQL Database
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 v horizontálně dělené databázi.
Rychlý start najdete v tématu Vytváření sestav napříč cloudovými databázemi se škálováním na více systémů.
Informace o nehardovaných databázích najdete v tématu Dotazování napříč cloudovými databázemi s různými schématy.
Požadavky
- Vytvořte mapu horizontálních oddílů pomocí klientské knihovny elastické databáze. Viz Správa mapování horizontálních oddílů. Nebo použijte ukázkovou aplikaci v části Začínáme s nástroji elastické databáze.
- Případně si přečtěte téma Migrace existujících databází do databází se škálováním na více instancí.
- Uživatel musí mít oprávnění ALTER ANY EXTERNAL DATA SOURCE. Toto oprávnění je součástí oprávnění ALTER DATABASE.
- K odkazování na podkladový zdroj dat jsou potřeba oprávnění ALTER ANY EXTERNAL DATA SOURCE.
Přehled
Tyto příkazy vytvářejí reprezentaci metadat vrstvy horizontálně dělených dat v databázi elastických dotazů.
- VYTVOŘENÍ HLAVNÍHO KLÍČE
- VYTVOŘENÍ PŘIHLAŠOVACÍCH ÚDAJŮ S ROZSAHEM DATABÁZE
- VYTVOŘENÍ EXTERNÍHO ZDROJE DAT
- 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 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 mapu horizontálních oddílů. 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 v klauzulích SCHEMA_NAME nebo OBJECT_NAME použijte název zobrazení katalogu nebo název zobrazení dynamické správy. (Viz následující příklad.)
Klauzule DISTRIBUTION určuje distribuci dat použitou pro tuto tabulku. Procesor dotazů využívá informace uvedené v klauzuli DISTRIBUTION k vytvoření nejúčinnějších plánů dotazů.
- Horizontální dělení znamená, že data se horizontálně rozdělují mezi databáze. Klíč dělení pro distribuci dat je parametr sharding_column_name>.<
- REPLIKOVANÉ 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é.
- ROUND_ROBIN znamená, že tabulka je horizontálně rozdělená pomocí metody distribuce závislé na aplikaci.
Odkaz na datovou vrstvu: Externí tabulka DDL odkazuje na externí zdroj dat. Externí zdroj dat určuje mapu horizontálních oddílů, která poskytuje externí tabulku s informacemi potřebnými 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á (1) horizontální dělení (horizontální dělení) a (2), že sklady, objednávky a řádky objednávek jsou horizontálně dělené podle sloupce ID skladu a že elastický dotaz může společně vyhledat spojení v horizontálních oddílech a zpracovat nákladnou část dotazu na horizontálních oddílech paralelně.
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 horizontálním oddílů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 v každém horizontálním oddílu.
- 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).
Sp_execute_remote používá 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í řetězec SQL Serveru připojte aplikaci, bi a nástroje pro integraci dat k databázi s definicemi externí tabulky. 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
- Ujistěte se, že databáze koncového bodu elastického dotazu získala přístup k databázi mapy horizontálních oddílů a všem horizontálním oddílů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í odstranění horizontálních oddílů, pokud by predikát přes klíč horizontálního dělení umožnil bezpečně vyloučit určité horizontální oddíly ze zpracování.
- Elastický dotaz je nejvhodnější pro dotazy, ve kterých je možné provádět většinu výpočtů na horizontálních oddílech. Obvykle získáte nejlepší výkon dotazů pomocí predikátů selektivního filtru, které je možné vyhodnotit na horizontálních oddílech nebo spojeních s klíči dělení, které je možné provést způsobem sladěným s oddíly u všech horizontálních oddílů. Jiné vzory dotazů můžou potřebovat načíst velké objemy dat z horizontálních oddílů do hlavního uzlu a můžou fungovat špatně.
Další kroky
- Přehled elastického dotazu najdete v přehledu elastických dotazů.
- Kurz vertikálního dělení najdete v tématu Začínáme s dotazem napříč databázemi (vertikální dělení).
- Syntaxe a ukázkové dotazy pro vertikálně dělená data najdete v tématu Dotazování svisle dělených dat).
- Kurz horizontálního dělení (horizontálního dělení) najdete v tématu Začínáme s elastickým dotazem pro horizontální dělení (horizontální dělení).
- Viz sp_execute _remote uložené procedury, která spouští příkaz Transact-SQL na jedné vzdálené službě Azure SQL Database nebo sadě databází, které slouží jako horizontální oddíly v horizontálním schématu dělení.