Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Felügyelt Azure SQL-példány
Ez a cikk néhány olyan tervezési lehetőséget ismertet, amelyek javítják az SQL Server és a .NET-keretrendszer közös nyelvi futtatókörnyezettel (CLR) való integrációjának teljesítményét.
A fordítási folyamat
Az SQL-kifejezések fordítása során, amikor egy felügyelt rutinra mutató hivatkozás történik, létrejön egy közös köztes nyelv (CIL) csonk. Ez a csonk olyan kódot tartalmaz, amely a rutinparaméterek SQL Serverről a CLR-be való visszaállítására, a függvény meghívására és az eredmény visszaadására szolgál. Ez a ragasztó kód a paraméter típusán és a paraméter irányán alapul (, , vagy hivatkozási).
A ragasztókód lehetővé teszi a típusspecifikus optimalizálást, és biztosítja az SQL Server szemantikájának hatékony érvényesítését, például a nullitást, a korlátozási aspektusokat, az értékenkénti értéket és a standard kivételkezelést. Az argumentumok pontos típusaihoz tartozó kód létrehozásával elkerülheti a kényszerítési vagy burkolóobjektum-létrehozási költségeket (az úgynevezett "boxing") a meghívás határán.
A létrehozott csonk ezután natív kódra lesz lefordítva, és az SQL Server által futtatott adott hardverarchitektúrához van optimalizálva a CLR igény szerinti (JIT) fordítási szolgáltatásaival. A JIT-szolgáltatásokat a rendszer metódusszinten hívja meg, és lehetővé teszi, hogy az SQL Server üzemeltetési környezete egyetlen összeállítási egységet hozzon létre, amely kiterjed az SQL Server és a CLR végrehajtására is. A csonk fordítása után az eredményül kapott függvénymutató lesz a függvény futásidejű implementációja. Ez a kódgenerálási módszer biztosítja, hogy a futtatáskor ne legyenek további meghívási költségek a tükrözéshez vagy a metaadatokhoz való hozzáféréshez.
Gyors áttűnések az SQL Server és a CLR között
A fordítási folyamat egy függvénymutatót eredményez, amely futtatáskor meghívható natív kódból. A skaláris értékű, felhasználó által definiált függvények esetében ez a függvényhívás soronként történik. Az SQL Server és a CLR közötti váltás költségeinek minimalizálása érdekében a felügyelt hívásokat tartalmazó utasítások indítási lépéssel azonosítják a célalkalmazás tartományát. Ez az azonosítási lépés csökkenti az egyes sorok áttűnésének költségeit.
Teljesítménnyel kapcsolatos szempontok
Az alábbi szakasz az SQL Server CLR-integrációjával kapcsolatos teljesítménybeli szempontokat foglalja össze. További információ: CLR-integráció használata az SQL Server 2005. A felügyelt kód teljesítményével kapcsolatos információkért lásd: .NET-alkalmazások teljesítményének és méretezhetőségének javítása.
Felhasználó által definiált függvények
A CLR-függvények gyorsabb meghívási útvonalat használhatnak, mint Transact-SQL felhasználó által definiált függvényeket. Emellett a felügyelt kód döntő teljesítménnyel rendelkezik a Transact-SQL szemben az eljárási kód, a számítások és a sztringek kezelése terén. A számításigényes és adathozzáférést nem végző CLR-függvények a felügyelt kódban jobban meg vannak írva. Transact-SQL függvények azonban hatékonyabban hajtják végre az adathozzáférést, mint a CLR-integráció.
Felhasználó által definiált összesítések
A felügyelt kód jelentősen felülmúlhatja a kurzoralapú összesítést. A felügyelt kód általában valamivel lassabban teljesít, mint a beépített SQL Server-összesítő függvények. Javasoljuk, hogy ha létezik natív beépített összesítő függvény, használja azt. Azokban az esetekben, amikor a szükséges összesítés natív módon nem támogatott, fontolja meg a CLR felhasználó által definiált összesítését egy kurzoralapú implementáción keresztül teljesítménybeli okokból.
Streamelő táblaértékelt függvények
Az alkalmazásoknak gyakran vissza kell adniuk egy táblát egy függvény meghívása miatt. Ilyenek például a táblázatos adatok beolvasása egy fájlból egy importálási művelet részeként, valamint a vesszővel tagolt értékek relációs ábrázolássá alakítása. Ezt általában úgy teheti meg, hogy materializálja és feltölti az eredménytáblát, mielőtt a hívó felhasználhatja. A CLR sql serverbe való integrálása egy új bővíthetőségi mechanizmust vezet be, amelyet egy streamelési táblaértékű függvénynek (STVF) nevezünk. A felügyelt STVF-ek jobban teljesítenek, mint a hasonló kiterjesztett tárolt eljárás implementációi.
Az STVF-ek felügyelt függvények, amelyek IEnumerable felületet adnak vissza.
IEnumerable metódusok segítségével navigálhat az STVF által visszaadott eredményhalmazban. Az STVF meghívásakor a visszaadott IEnumerable közvetlenül csatlakozik a lekérdezési tervhez. A lekérdezési terv IEnumerable metódusokat hív meg, amikor sorokat kell beolvasnia. Ez az iterációs modell lehetővé teszi, hogy az eredmények közvetlenül az első sor létrehozása után legyenek felhasználva, ahelyett, hogy a teljes táblázat feltöltéséig várakoznak. Emellett jelentősen csökkenti a függvény meghívásával felhasznált memóriát.
Tömbök és kurzorok
Ha Transact-SQL kurzoroknak olyan adatokat kell átkelniük, amelyek tömbként könnyebben kifejezhetők, a felügyelt kód jelentős teljesítménynövekedéssel használható.
Sztringadatok
Az SQL Server karakteradatai, például a varchar, SqlString vagy SqlChars típusúak lehetnek a felügyelt függvényekben.
SqlString változók a teljes érték egy példányát hozzák létre a memóriába.
SqlChars változók olyan streamelési felületet biztosítanak, amellyel jobb teljesítményt és méretezhetőséget érhetünk el, ha nem hozunk létre egy példányt a teljes értékből a memóriába. Ez fontossá válik a nagyméretű objektumadatok (LOB) esetében. Emellett a kiszolgáló XML-adatai a SqlXml.CreateReader()által visszaadott streamelési felületen keresztül is elérhetők.
CLR és kiterjesztett tárolt eljárások
Azok a Microsoft.SqlServer.Server alkalmazásprogramozási felületek (API-k), amelyek lehetővé teszik, hogy a felügyelt eljárások eredményhalmazokat küldjenek vissza az ügyfélnek, jobban teljesítenek, mint a kiterjesztett tárolt eljárások által használt Open Data Services (ODS) API-k. Ezenkívül a System.Data.SqlServer API-k olyan adattípusokat támogatnak, mint például xml, varchar(max), nvarchar(max)és varbinary(max), míg az ODS API-k nem lettek kiterjesztve ezen adattípusok támogatására.
Felügyelt kóddal az SQL Server kezeli az erőforrások, például a memória, a szálak és a szinkronizálás használatát. Ennek az az oka, hogy az erőforrásokat elérhetővé tevő felügyelt API-k az SQL Server erőforrás-kezelőjén felül vannak implementálva. Ezzel szemben az SQL Server nem tekinti meg és nem szabályozza a kiterjesztett tárolt eljárás erőforrás-használatát. Ha például egy kiterjesztett tárolt eljárás túl sok processzor- vagy memóriaerőforrást használ fel, akkor ezt nem lehet észlelni vagy szabályozni az SQL Serverrel. A felügyelt kóddal azonban az SQL Server észleli, hogy egy adott szál hosszú ideje nem engedett, majd kényszeríti a feladatot a hozamra, hogy más munka ütemezhető legyen. A felügyelt kód használata tehát jobb méretezhetőséget és rendszererőforrás-használatot biztosít.
A felügyelt kód többletterhelést jelenthet a végrehajtási környezet fenntartásához és a biztonsági ellenőrzések végrehajtásához. Ez a helyzet például akkor, ha az SQL Serveren belül fut, és a felügyelt kódról a natív kódra való váltás számos áttűnésre van szükség (mivel az SQL Servernek további karbantartást kell végeznie a szálspecifikus beállításokon a natív kódra való áttéréskor és visszalépéskor). A kiterjesztett tárolt eljárások tehát jelentősen felülmúlhatják az SQL Serveren futó felügyelt kódot azokban az esetekben, amikor gyakori átmenetek vannak a felügyelt és a natív kód között.
Jegyzet
Ne dolgozzon ki új kiterjesztett tárolt eljárásokat, mert ez a funkció elavult.
Natív szerializálás felhasználó által definiált típusokhoz
A felhasználó által definiált típusok (UDT-k) bővíthetőségi mechanizmusként lettek kialakítva a skaláris típusrendszer számára. Az SQL Server a Format.Nativenevű UDT-k szerializálási formátumát implementálja. A fordítás során a rendszer megvizsgálja a típus szerkezetét, hogy létrehozhassa az adott típusdefinícióhoz testre szabott CIL-t.
Az SQL Server alapértelmezett implementációja a natív szerializálás. A felhasználó által definiált szerializálás meghív egy metódust, amelyet a típus szerzője határoz meg a szerializáláshoz.
Format.Native szerializálást kell használni, ha lehetséges, a legjobb teljesítmény érdekében.
Összehasonlítható UT-k normalizálása
A relációs műveletek, például az UDT-k rendezése és összehasonlítása, közvetlenül az érték bináris ábrázolására működnek. Ez az UDT állapotának normalizált (bináris sorrendben rendezett) lemezen való tárolásával érhető el.
A normalizálásnak két előnye van:
Ez jelentősen olcsóbbá teszi az összehasonlítási műveletet azáltal, hogy elkerüli a típuspéldány felépítését és a metódushívási többletterhelést.
Létrehoz egy bináris tartományt az UDT számára, amely lehetővé teszi hisztogramok, indexek és hisztogramok építését a típus értékeihez.
A normalizált UDT-k tehát hasonló teljesítményprofillal rendelkeznek, mint a natív beépített típusok olyan műveletek esetében, amelyek nem járnak metódushívással.
Méretezhető memóriahasználat
Annak érdekében, hogy a felügyelt szemétgyűjtés jól teljesíthessen és skálázható legyen az SQL Serveren, kerülje a nagy, egyszeri lefoglalást. A 88 kilobájtnál (KB) nagyobb foglalások a Nagy objektum halomra kerülnek, ami miatt a szemétgyűjtés végrehajtása és skálázása rosszabb, mint sok kisebb foglalás. Ha például nagy többdimenziós tömböt kell lefoglalnia, jobb, ha egy szaggatott (pontozott) tömböt foglal le.