Dela via


Använda lagrade procedurer för dedikerade SQL-pooler i Azure Synapse Analytics

Den här artikeln innehåller tips för att utveckla dedikerade SQL-poollösningar genom att implementera lagrade procedurer.

Vad du kan förvänta dig

Dedikerad SQL-pool stöder många av de T-SQL-funktioner som används i SQL Server. Ännu viktigare är att det finns utskalningsspecifika funktioner som du kan använda för att maximera lösningens prestanda.

För att hjälpa dig att upprätthålla skalbarheten och prestandan för en dedikerad SQL-pool finns det dessutom ytterligare funktioner som har beteendeskillnader.

Introduktion till lagrade procedurer

Lagrade procedurer är ett bra sätt att kapsla in SQL-koden, som lagras nära dina dedikerade SQL-pooldata. Lagrade procedurer hjälper också utvecklare att modularisera sina lösningar genom att kapsla in koden i hanterbara enheter, vilket underlättar bättre återanvändning av kod. Varje lagrad procedur kan också acceptera parametrar för att göra dem ännu mer flexibla.

Dedikerad SQL-pool ger en förenklad och strömlinjeformad implementering av lagrade procedurer. Den största skillnaden jämfört med SQL Server är att den lagrade proceduren inte är förkompilerad kod.

I allmänhet är kompileringstiden för informationslager liten jämfört med den tid det tar att köra frågor mot stora datavolymer. Det är viktigare att se till att koden för lagrad procedur är korrekt optimerad för stora frågor.

Tips

Målet är att spara timmar, minuter och sekunder, inte millisekunder. Därför är det bra att tänka på lagrade procedurer som containrar för SQL-logik.

När en dedikerad SQL-pool kör den lagrade proceduren parsas, översätts och optimeras SQL-uttrycken vid körning. Under den här processen konverteras varje instruktion till distribuerade frågor. SQL-koden som körs mot data skiljer sig från den fråga som skickas.

Kapsling av lagrade procedurer

När lagrade procedurer anropar andra lagrade procedurer, eller kör dynamisk SQL, sägs den inre lagrade proceduren eller kodanropet vara kapslat.

Den dedikerade SQL-poolen stöder högst åtta kapslingsnivåer. Kapslingsnivån i SQL Server är däremot 32.

Anropet för den lagrade proceduren på den översta nivån motsvarar kapslingsnivå 1.

EXEC prc_nesting

Om den lagrade proceduren också gör ytterligare ett EXEC-anrop ökar kapslingsnivån till två.

CREATE PROCEDURE prc_nesting
AS
EXEC prc_nesting_2  -- This call is nest level 2
GO
EXEC prc_nesting

Om den andra proceduren sedan kör en dynamisk SQL ökar kapslingsnivån till tre.

CREATE PROCEDURE prc_nesting_2
AS
EXEC sp_executesql 'SELECT 'another nest level'  -- This call is nest level 2
GO
EXEC prc_nesting

Dedikerad SQL-pool stöder för närvarande inte @@NESTLEVEL. Därför måste du spåra kapslingsnivån. Det är osannolikt att du kommer att överskrida gränsen på åtta kapslade nivåer. Men om du gör det måste du omarbeta koden så att den passar kapslingsnivåerna inom den här gränsen.

INFOGA.. UTFÖRA

Dedikerad SQL-pool tillåter inte att du använder resultatuppsättningen för en lagrad procedur med en INSERT-instruktion. Det finns dock en alternativ metod som du kan använda. Ett exempel finns i artikeln om temporära tabeller.

Begränsningar

Det finns vissa aspekter av transact-SQL-lagrade procedurer som inte implementeras i en dedikerad SQL-pool, som är följande:

  • temporära lagrade procedurer
  • numrerade lagrade procedurer
  • utökade lagrade procedurer
  • LAGRADE CLR-procedurer
  • krypteringsalternativ
  • replikeringsalternativ
  • tabellvärdesparametrar
  • skrivskyddade parametrar
  • standardparametrar
  • körningskontexter
  • return-instruktion

Nästa steg

Fler utvecklingstips finns i Utvecklingsöversikt.