Spuštění více než 1 procedury v 1 čas nemusí být tak jednoduchá úloha jak se zdá, zejména pokud jednotlivé procedury mají mezi sebou závislosti – tzn nějaká sada procedur podmiňuje spuštění jiných procedur. Jak tedy udělat paralelismus (Parallelism)? Když si zrekapitulujeme možnosti které se nám nabízejí:
- Parallelism procedur v jedné session v SQL skriptu – Nejde
- Parallelism procedur v rámci stepů 1 Jobu – Nejde
- Parallelism procedur přes více jobů – Lze, ale nekontrolujeme závislosti
Napadá někoho ještě něco dalšího? Mě už jen SSIS package (SQL Server Integration Services).
Paralelismus (parallelism) a paralelní zpracování dat – spuštění více SQL procedur a skriptů současně s kontrolou závislostí přes SSIS
Spuštění více transakcí v 1 čas není až takový problém (viz. předchozí shrnutí). Můžeme založit více jobů, které budou mít schedule nastavený na stejný čas. Tato varianta je vhodná pro případ, kdy mezi procedurami nebo SQL skripty nemáme žádné závislosti. V případě, že závislosti máme, tak je vhodné použít buď nějaký externí nástroj nebo využít integrovaný nástroj SSIS (SQL Server Integration Services). Jak na to?
Zadání příkladu: Mějme 4 procedury (A,B,C,D) z nichž každá běží jinou dobu. Procedury A,B,C jsou na sobě nezávislé a je možné je pustit paralelně. Procedura D musí počkat na to, až všechny ostatní procedury úspěšně doběhnou a teprve až potom ji můžeme spustit.
Vytvořme si testovací procedury
- Procedure_A poběží 1 vteřinu
- Procedure_B poběží 20 vteřin
- Procedure_C poběží 40 vteřin
- Až po doběhnutí všech procedur pouštíme Procedure_D
CREATE PROCEDURE Procedure_A
AS
--Procedura běží 1 vteřinu
WAITFOR DELAY '0:00:01'
Print 'End of Procedure_A'
GO
CREATE PROCEDURE Procedure_B
AS
--Procedura běží 20 vteřin
WAITFOR DELAY '0:00:20'
Print 'End of Procedure_B'
GO
CREATE PROCEDURE Procedure_C
AS
--Procedura běží 40 vteřin
WAITFOR DELAY '0:00:40'
Print 'End of Procedure_C'
GO
CREATE PROCEDURE Procedure_D
AS
Print 'End of Procedure_D'
Založíme si prázdného SSIS projektu a package (balíčku)
Projekt je vytvořen v Visual studio (SSDT) 2017, ale lze založit v libovolné verzi SQL Server data tools.
Z SSIS Toolboxu (nalevo) přetáhneme do prostřední oblasti “Execute SQL Task”
A to vše pro každou zprocedur, to znamená 4x. Text každého taxku přejmenujeme na název procedury a šipky z procedur A,B,C vedeme do procedury D.
Nejdříve si musíme založit Connection managera na náš SQL server (viz. obrázek). Klikneme pravým tlačítkem do oblasti Connection managers – new OLE DB connection – Vyplníme název SQL Server instance a název databáze – následně potvrdíme OK
Provedeme nastavení prvního Execute SQL Tasku (Procedure_A)
- Poklikáme na task
- V okně nastavíme náš connection manager
- V sekci SQK statement klikneme na tři tečky
- Do dalšího okna vyplníme EXEC Procedure_A
Tímto je nastavení hotové a podobně postupujeme pro všechny ostatní tasky
Po nastavení všech tasků z předchozího kroku by vám měly zmiznout křížky
To znamená, že tasky jsou validní = funguje connection manager a SQL skripty jsou validní. SSIS package je připraven. Můžeme vyzkoušet, jestli paralelní zpracování dat funguje
Finální otestování paralelního zpracování dat
Spustíme task a pozorujeme co se děje. Vidíme, že procedury A,B,C se spustili v 1 moment a procedura D čeká, než doběhne poslední z procedur A,B,C (viz obrázky).