sql >> Databáze >  >> RDS >> Sqlserver

Dynamický SQL vs uložená procedura

Dynamický SQL a uložené procedury jsou dvě nejdůležitější součásti SQL Serveru. V tomto článku se podíváme na výhody a nevýhody každého z nich a na to, kdy je použít.

Výkon

Odpověď na tuto otázku zná každý. Uložené procedury překonávají dynamické SQL z hlediska výkonu. Uložená procedura je uložena v mezipaměti v paměti serveru a její provádění je mnohem rychlejší než dynamické SQL. Pokud jsou všechny zbývající proměnné udržovány konstantní, uložená procedura překonává dynamické SQL.

Oddělení obav

Pokud jde o oddělení problémů, uložené procedury porazí dynamické SQL.

Uložené procedury vám umožňují udržet logiku databáze oddělenou od vaší obchodní logiky. Pokud tedy dojde k chybě ve vaší obchodní logice, stačí změnit kód aplikace. A naopak, pokud dojde k problému s logikou vaší databáze, je třeba upravit pouze uloženou proceduru. Pokud je navíc uložená procedura aktualizována, není nutné kód aplikace znovu kompilovat a nasazovat.

Pokud ve svém klientském kódu používáte dynamické dotazy SQL, budete muset aktualizovat kód aplikace, pokud v dotazu SQL dojde k chybě. To znamená, že budete muset znovu zkompilovat a nasadit kód aplikace.

Provoz v síti

Uložené procedury produkují méně síťového provozu než dynamické SQL, protože provedení uložené procedury vyžaduje pouze zaslání názvu procedury a parametrů (pokud existují).

Provádění dynamického SQL vyžaduje odeslání celého dotazu přes síť, což zvyšuje síťový provoz, zejména pokud je dotaz velmi rozsáhlý.

Útoky SQL Injection

Uložené procedury nejsou zranitelné vůči útokům SQL Injection.

Dynamické SQL dotazy jsou zranitelné vůči útokům SQL injection, pokud se nepoužívají parametrizované dotazy, a parametrizované dotazy nelze použít s dynamickým SQL, pokud je jako parametr předán název tabulky nebo sloupce.

V tomto případě je řešením, že funkci kódového názvu lze použít k zabránění útokům SQL injection.

Opětovná použitelnost plánů dotazů uložených v mezipaměti

Uložené procedury zlepšují výkon databáze, protože umožňují opětovné použití plánů dotazů uložených v mezipaměti. V případě dynamického SQL budete muset použít parametrizované dotazy ke zvýšení znovupoužitelnosti plánu dotazů uložených v mezipaměti. Při absenci parametrizovaných plánů dotazů SQL server automaticky detekuje parametry a generuje plány dotazů v mezipaměti, což vede ke zlepšení výkonu.

Zde je vhodné zmínit, že pouze systémy OLTP těží z opakované použitelnosti plánu dotazů uložených v mezipaměti. V případě OLAP systémů, volba optimalizátoru změny, OLAP systém těží z jedinečného plánu.

Údržba

Uložené procedury se statickým SQL se snadněji udržují. Například v případě statického SQL v uložené proceduře lze před spuštěním zachytit syntaktické chyby. V případě dynamického SQL uvnitř uložených procedur nelze před provedením dotazu zachytit syntaktické chyby.

Kromě toho jsou uložené procedury spíše funkcemi, jsou definovány jednou a pak mohou být volány kdekoli ve skriptu. Pokud tedy chcete aktualizovat uloženou proceduru, stačí ji aktualizovat pouze na jednom místě. Všechny části aplikace volající uloženou proceduru budou mít přístup k aktualizované verzi. Nevýhodou však je, že tyto části aplikace mohou být ovlivněny i tam, kde aktualizovanou uloženou proceduru nechcete. V případě dynamického SQL možná budete muset napsat SQL skript na více místech, ale v takových případech aktualizace skriptu na jednom místě neovlivní druhé. Rozhodnutí mezi použitím uložené procedury a dynamického SQL závisí na funkčnosti aplikace.

Zabezpečení

Pokud k databázi přistupuje více aplikací, je bezpečnější používat uložené procedury než dynamické SQL.

Uložené procedury poskytují další vrstvu zabezpečení, zatímco uživatelský kontext je jediný způsob, jak řídit oprávnění pro dynamické skripty SQL. Celkově vzato je zabezpečení dynamického SQL pracné ve srovnání s uloženými procedurami.

Identifikace závislostí

V relační databázi jsou tabulky závislé na jiných tabulkách v databázi.

Zvažte scénář, kdy chcete odstranit tabulku, ale předtím, než to uděláte, chcete zjistit všechny závislosti tabulky. Nebo jednoduše řečeno, chcete najít dotazy, které přistupují k tabulce, kterou chcete odstranit. V těchto případech můžete použít uloženou proceduru sp_depends.

Sp_depends však dokáže rozpoznat pouze ty závislosti, kde se v uložené proceduře používá statický SQL. V případě dynamického SQL, který je závislý na tabulce, nelze tuto závislost zjistit pomocí uložené procedury sp_depends. Podívejme se na to v praxi pomocí jednoduchého příkladu.

Příprava fiktivních dat

Pojďme vytvořit fiktivní data, která nám pomohou vysvětlit koncept závislostí ve statickém a dynamickém SQL.

CREATE DATABASE deptest;USE deptestCREATE TABLE student( Id int primární klíč identity, Jméno VARCHAR(50) NOT NULL, Gender VARCHAR(50) NOT NULL, Age int)INSERT INTO studentVALUES('James', 'Male', 20 ),('Helene', 'Žena', 20),('Sofia', 'Žena', 20),('Ed', 'Muž', 20),('Ron', 'Žena', 20) 

Nyní máme testovací databázi obsahující tabulku a některá testovací data. Nyní vytvoříme dvě uložené procedury, které přistupují k tabulce studentů.

První uložená procedura používá statické SQL k načtení všech záznamů ze studentské tabulky:

POUŽÍVEJTE deptestGOCREATE PROC spStatProcASBEGIN SELECT * FROM studentEND

Spusťte skript výše. Tento skript vytvoří uloženou proceduru „spStatProc“ v databázi deptest.

Vytvořme další uloženou proceduru, která obsahuje dynamické SQL, které načte všechny záznamy ze studentské tabulky.

POUŽÍVEJTE deptestGOCREATE PROC spDynProcASBEGIN DECLARE @query NVARCHAR(100) SET @query ='SELECT * FROM student' EXECUTE sp_execute @query END

Tento skript vytvoří uloženou proceduru „spDynProc“ uvnitř databáze deptest. Tato uložená procedura používá dynamický příkaz SQL k načtení všech záznamů ze studentské tabulky.

Nyní máme dvě uložené procedury, které jsou závislé na studentské tabulce. Jeden z nich obsahuje statické SQL a druhý obsahuje dynamické SQL.

Pokud však provedete uloženou proceduru sp_depends a předáte ji jako parametr tabulku student, uvidíte, že načte pouze uloženou proceduru „spStatProc“. To proto, že obsahuje statické SQL. Uložená procedura „spDynProc“ bude ignorována, protože obsahuje dynamické SQL.

Spusťte následující skript.

POUŽÍVEJTE deptestGOEXECUTE sp_depends student

Získá následující výstup:

[id tabulky=40 /]

Můžete vidět, že sp_depends nebyl schopen nahlásit závislost „spDynProc“ a oznámil pouze „spStatProc“.

Složitost

Uložené procedury mohou být extrémně složité, pokud používáte velký počet filtrů a mezi filtry je více klauzulí AND a OR. Na druhou stranu pomocí dynamického SQL můžete dynamicky generovat klauzule WHERE v závislosti na typu filtrů. Díky tomu je dynamické SQL lepší volbou, pokud chcete implementovat extrémně složitou logiku.

Závěr

Celkově uložená procedura překonává dynamické SQL téměř ve všech aspektech. Jsou rychlejší, bezpečné a snadno se udržují a vyžadují menší síťový provoz. Obecně platí, že uložené procedury by se měly používat ve scénářích, kde nemusíte upravovat své dotazy a vaše dotazy nejsou příliš složité. Pokud však ve svém dotazu často měníte názvy tabulek, názvy sloupců nebo počet parametrů, je dynamické SQL lepší volbou díky své jednodušší implementační strategii.

Užitečné odkazy

  • Dynamické SQL versus uložené procedury
  • Dynamického SQL se nebojte
  • Vytváření vysoce výkonných uložených procedur
  • Kurzy o uložených procedurách

  1. mysql PDO jak svázat LIKE

  2. Úvod do zpracování výjimek PL/SQL v databázi Oracle

  3. Jak vytvořím generátor řádků v MySQL?

  4. Proč je nejlepší uložit telefonní číslo jako řetězec vs. celé číslo?