it-swarm-eu.dev

Mohu spustit uloženou proceduru a okamžitě se vrátit bez čekání na dokončení?

Máme uloženou proceduru, kterou mohou uživatelé spustit ručně, aby získali některá aktualizovaná čísla pro sestavu, která se neustále používá po celý den.

Mám druhou uloženou proceduru, která by měla být spuštěna po spuštění první uložené procedury, protože je založena na číslech získaných z této první uložené procedury, ale spuštění trvá déle a je pro samostatný proces, takže nechci donutí uživatele čekat, až bude spuštěna tato 2. uložená procedura.

Existuje způsob, jak jednu uloženou proceduru spustit druhou uloženou proceduru a okamžitě se vrátit bez čekání na výsledky?

Používám SQL Server 2005.

41
Rachel

Vypadá to, že toho lze dosáhnout několika způsoby, ale našel jsem nejjednodušší způsob, jak Martinův návrh nastavení procedury v SQL úloze a její spuštění pomocí asynchronního sp_start_job = příkaz z mé uložené procedury.

EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'

Toto funguje pouze pro mě, protože pro svou uloženou proceduru nemusím specifikovat žádné parametry.

Další návrhy, které mohou fungovat v závislosti na vaší situaci, jsou

  • Používám návrh SQL Service Broker jako Martin a Sebastian . Toto je pravděpodobně nejlepší návrh, pokud vám nevadí složitost jeho nastavení a učení, jak to funguje.
  • Spuštění procesu asynchronně v kódu, který je zodpovědný za provedení uložené procedury, jako Mr.Brownstone navrhl .

    Není to špatný nápad, ale v mém případě je uložená procedura vyvolána z více míst, takže nalezení všech těchto míst a zajištění, že nazývají druhou proceduru, se nezdálo být praktické. Také druhá uložená procedura je velmi kritická a zapomněl ji spustit, může to způsobit některé velké problémy pro naši společnost.

  • Proveďte první postup, aby nastavil příznak, a nastavte opakující se úlohu, abyste tento příznak zkontrolovali a spustili, pokud je nastaven, jako doporučil Jimbo . Nejsem velkým fanouškem pracovních míst, které běží nepřetržitě a kontroluji změny každých pár minut, ale rozhodně se vyplatí uvažovat v závislosti na vaší situaci.
28
Rachel

Tato stará otázka si zaslouží komplexnější odpověď. Některé z nich jsou uvedeny v jiných odpovědích/komentářích, jiné mohou nebo nemusí fungovat pro konkrétní situaci OP, ale mohou fungovat pro ostatní, kteří hledají asynchronní volání uložených proců z SQL.

Jednoduše řečeno: TSQL nedělá (sama o sobě) mají schopnost spustit asynchronně další operace TSQL .

To neznamená, že stále nemáte mnoho možností:

  • Úlohy agenta SQL : Vytvořte více úloh SQL a buď je naplánujte, aby se spouštěly v požadovaném čase, nebo je spusťte asynchronně z „hlavního řízení“ uloženého proc použitím sp_start_job. Pokud potřebujete programově sledovat jejich průběh, ujistěte se, že všechny úlohy aktualizují vlastní tabulku JOB_PROGRESS (nebo můžete zkontrolovat, zda již skončily pomocí nezdokumentované funkce xp_sqlagent_enum_jobs jak je popsáno v tento vynikající článek Gregory A. Larsen). Musíte vytvořit tolik samostatných úloh, kolikrát chcete, aby byly spuštěny paralelní procesy, i když běží stejný uložený proces s různými parametry.
  • Balíček SSIS : Pro komplikovanější asynchronní scénáře vytvořte balíček SSIS s jednoduchým tokem úkolů větvení. SSIS spustí tyto úkoly v jednotlivých spidech, které bude SQL provádět paralelně. Volání balíčku SSIS z úlohy agenta SQL.
  • Vlastní aplikace : Napište jednoduchou vlastní aplikaci ve vašem jazyce (C #, Powershell atd.) Pomocí asynchronních metod poskytovaných tímto jazykem. Volání proc uloženého SQL na každé vlákno aplikace.
  • Automatizace OLE : V SQL použijte sp_oacreate a sp_oamethod zahájit nový proces volající si navzájem uložené proc, jak je popsáno v tento článek , také Gregory A. Larsen.
  • Service Broker : Podívejte se na použití Service Broker , dobrý příklad asynchronního provedení v tomto článk .
  • CLR Parallel Execution : Použijte příkazy CLR Parallel_AddSql a Parallel_Execute jak je popsáno v tento článek Alan Kaplan (pouze SQL2005 +).
  • Naplánované úlohy systému Windows : Uvedené pro úplnost, ale nejsem fanouškem této možnosti.

Kdybych to byl já, pravděpodobně bych použil více úloh SQL Agent Jobs v jednodušších scénářích a balíček SSIS ve složitějších scénářích.

Ve vašem případě zní volání úloh SQL Agent jako jednoduchá a zvládnutelná volba.

Jeden poslední komentář : SQL se již pokouší paralelizovat jednotlivé operace, kdykoli může *. To znamená, že spuštění 2 úkolů současně místo za sebou není zárukou, že bude dokončena dříve. Pečlivě otestujte, zda skutečně něco zlepšuje nebo ne.

Měli jsme vývojáře, který vytvořil balíček DTS =================================================================================================================

* Předpokládané výchozí nastavení. To lze upravit změnou maximálního stupně paralelismu nebo masky spřažení serveru nebo pomocí nápovědy MAXDOP dotazu.

8
BradC

Můžete použít servisního makléře společně s aktivací ve frontě. S tím byste mohli poslat parametry pro volání procedury do fronty. To zabere tolik času jako vložka. Poté, co je transakce potvrzena a případně ještě několik sekund, by aktivace automaticky vyvolala proceduru příjemce asynchronně. Pak musí jen převzít parametry fronty a provést požadovanou práci.

8
Sebastian Meine

Ano, jedna metoda:

  1. Po dokončení první uložené procedury vloží záznam se všemi informacemi potřebnými ke spuštění druhé uložené procedury
  2. Druhá uložená procedura běží jako úloha, každou minutu nebo v jakou dobu se rozhodnete
  3. Zkontroluje vložené záznamy, provede jeho proces a označí záznam jako úplný
6
Jimbo

Další možností by bylo získat první uloženou proceduru, která se zapíše do tabulky auditu, když se dokončí, a umístit na auditovací tabulku spouštěč, který spustí druhou uloženou proceduru, když se zapíše kontrolní tabulka. Není třeba průběžně dotazovat a není třeba další úloha SQL Server Agent.

1
paco