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
Azure SQL Database
Felügyelt Azure SQL-példány
A memóriaoptimalizált táblák a CREATE TABLE (Transact-SQL) használatával jönnek létre.
A memóriaoptimalizált táblák alapértelmezés szerint teljesen tartósak, és a (hagyományos) lemezalapú táblák tranzakcióihoz hasonlóan a memóriaoptimalizált táblák tranzakciói is teljesen atomiak, konzisztensek, izoláltak és tartósak (ACID). A memóriaoptimalizált táblák és a natívan lefordított tárolt eljárások csak a Transact-SQL funkciók egy részét támogatják.
Az SQL Server 2016-tól kezdve, valamint az Azure SQL Database-ben nincs korlátozás az In-Memory OLTP-re vonatkozó rendezésekre vagy kódlapokra.
A memóriaoptimalizált táblák elsődleges tárolója a fő memória. A táblázat sorait a rendszer felolvassa és memóriába írja. A táblaadatok második példánya lemezen marad, de csak tartóssági okokból. A tartós táblákról további információt az Memory-Optimized-objektumok tárolójának létrehozása és kezelése című témakörben talál. A memóriaoptimalizált táblákban lévő adatok csak az adatbázis helyreállítása során (például a kiszolgáló újraindítása után) olvashatók le a lemezről.
A még nagyobb teljesítménynövekedés érdekében In-Memory OLTP támogatja a tartós táblákat, amelyeknél a tranzakció tartóssága késleltetve van. A késleltetett tartós tranzakciókat a rendszer nem sokkal a tranzakció véglegesítése és a vezérlés az ügyfélnek való visszaadása után menti a lemezre. A megnövekedett teljesítményért cserébe a lemezen nem megmaradó véglegesített tranzakciók elvesznek egy kiszolgáló összeomlása vagy feladatátvétele során.
Az alapértelmezett tartós memóriaoptimalizált táblák mellett az SQL Server támogatja a nem tartós memóriaoptimalizált táblákat is, amelyek nincsenek naplózva, és adataik nem maradnak meg a lemezen. Ez azt jelenti, hogy a táblák tranzakcióihoz nincs szükség lemez I/O-ra, de az adatok elvesznek, ha a kiszolgáló összeomlik vagy feladatátvétel történik.
In-Memory OLTP integrálva van az SQL Serverrel, hogy zökkenőmentes felhasználói élményt nyújtson minden olyan területen, mint a fejlesztés, az üzembe helyezés, a kezelhetőség és a támogatottság. Az adatbázisok memórián belüli és lemezalapú objektumokat is tartalmazhatnak.
A memóriaoptimalizált táblák sorai verziószámozottak. Ez azt jelenti, hogy a táblázat minden sora több verzióval is rendelkezik. Minden sorverzió ugyanabban a táblaadat-struktúrában van fenntartva. A sorverzió lehetővé teszi az egyidejű olvasást és írást ugyanazon a soron. A párhuzamos olvasásokkal és írásokkal kapcsolatos további információkért tekintse meg a következőt: Tranzakciók Memory-Optimized táblákkal.
Az alábbi ábra a többverziós verziószámozást szemlélteti. Az ábrán egy három sorból álló táblázat látható, és mindegyik sor különböző verziókkal rendelkezik.
A táblázat három sort tartalmaz: r1, r2 és r3. Az r1 három, az r2 két, az r3 pedig négy verzióval rendelkezik. Ugyanannak a sornak a különböző verziói nem feltétlenül foglalják el egymást követő memóriahelyeket. A különböző sorverziók a táblázat adatstruktúrája egészében eloszthatók.
A memóriaoptimalizált táblaadat-struktúra sorverziók gyűjteményeként tekinthető meg. A lemezalapú táblák sorai lapok és mértékek szerint vannak rendezve, az egyes sorokat pedig oldalszámmal és oldaleltolással, a memóriaoptimalizált táblák sorverzióit pedig 8 bájtos memóriamutatókkal kezelik.
A memóriaoptimalizált táblák adatai kétféleképpen érhetők el:
Natívan lefordított tárolt eljárásokon keresztül.
Az értelmezett Transact-SQL használata natívan lefordított tárolt eljárásokon kívül. Ezek a Transact-SQL utasítások vagy értelmezett tárolt eljárásokban lehetnek, vagy alkalmi Transact-SQL utasításokként fordulhatnak elő.
Adatok elérése Memory-Optimized táblákban
A memóriaoptimalizált táblák natívan lefordított tárolt eljárásokból (natívan lefordított tárolt eljárások) érhetők el a leghatékonyabban. A memóriaoptimalizált táblák (hagyományos) Transact-SQL-sel is elérhetők. Az Transact-SQL az értelmezésben azt jelenti, hogy a memóriaoptimalizált táblákat natívan lefordított tárolt eljárások nélkül érjük el. Néhány példa az értelmezett Transact-SQL hozzáférésre: egy memóriaoptimalizált tábla elérése egy DML-eseményindítóból, alkalmi Transact-SQL köteg, nézet és táblaértékű függvény.
Az alábbi táblázat összefoglalja a natív és értelmezett Transact-SQL hozzáférést a különböző objektumokhoz.
| Tulajdonság | Natívan lefordított tárolt eljárás használatával történő hozzáférés | Értelmezett Transact-SQL Access | CLR-hozzáférés |
|---|---|---|---|
| Memóriaoptimalizált tábla | Igen | Igen | 1. szám |
| Memóriaoptimalizált táblázattípus | Igen | Igen | Nem |
| Natívan lefordított tárolt eljárás | A natívan lefordított tárolt eljárások beágyazása most már támogatott. Használhatja az EXECUTE szintaxist a tárolt eljárásokon belül, amíg a hivatkozott eljárás natív módon is lefordítva van. | Igen | Nem* |
1Nem érhető el memóriaoptimalizált tábla vagy natívan lefordított tárolt eljárás a környezeti kapcsolatból (a CLR-modul végrehajtásakor az SQL Serverről származó kapcsolat). Létrehozhat azonban egy másik kapcsolatot, amelyből hozzáférhet a memóriaoptimalizált táblákhoz és natív módon lefordított tárolt eljárásokhoz.
A memóriaoptimalizált táblák bizalmas adatai az Always Encrypted használatával védhetők. A következő korlátozások érvényesek:
- Az Always Encrypted biztonságos enklávékkal való használata esetén nem támogatott az enklávé-kompatibilis kulcsok használata a memóriaoptimalizált táblák oszlopaihoz. Ez azt jelenti, hogy a helyi titkosítás nem használható, és a kezdeti titkosítás az ügyfélen történik.
- Az Always Encrypted nem támogatott a memóriaoptimalizált tábla egyik oszlopában sem, ha a táblára natívan lefordított modul hivatkozik.
Teljesítmény és méretezhetőség
Az alábbi tényezők befolyásolják az In-Memory OLTP-vel elérhető teljesítménynövekedést:
Kommunikáció: A sok rövid tárolt eljáráshívást használó alkalmazások kisebb teljesítménynövekedést tapasztalhatnak egy olyan alkalmazáshoz képest, amelyben kevesebb hívás és több funkció van implementálva az egyes tárolt eljárásokban.
Transact-SQL végrehajtás: In-Memory OLTP a legjobb teljesítményt nyújt, ha natívan lefordított tárolt eljárásokat használ a tárolt eljárások vagy lekérdezések végrehajtása helyett. Az ilyen tárolt eljárásokból a memóriaoptimalizált táblák elérése előnyös lehet.
Tartományvizsgálat és pontkeresés: A memóriaoptimalizált nemclustered indexek támogatják a tartományvizsgálatokat és a rendezett vizsgálatokat. Pontkeresések esetén a memóriaoptimalizált kivonatindexek teljesítménye jobb, mint a memóriaoptimalizált nemclustered indexeké. A memóriaoptimalizált nemclustered indexek teljesítménye jobb, mint a lemezalapú indexek.
- Az SQL Server 2016-tól kezdődően egy memóriaoptimalizált tábla lekérdezési terve párhuzamosan is beolvassa a táblát. Ez javítja az elemzési lekérdezések teljesítményét.
- A kivonatindexek az SQL Server 2016-ban párhuzamosan is vizsgálhatóvá váltak.
- Az SQL Server 2016-ban a nemclustered indexek is párhuzamosan kereshetők.
Indexműveletek: Az indexműveletek nincsenek naplózva, és csak a memóriában léteznek.
Konkurencia: Azok az alkalmazások, amelyek teljesítményét a motorszintű egyidejűség, például a reteszes versengés vagy a blokkolás befolyásolja, jelentősen javul, amikor az alkalmazás In-Memory OLTP-re kerül.
Az alábbi táblázat felsorolja a relációs adatbázisokban gyakran előforduló teljesítmény- és méretezhetőségi problémákat, valamint azt, hogy In-Memory OLTP hogyan javíthatja a teljesítményt.
| Probléma | OLTP-hatás In-Memory |
|---|---|
| Teljesítmény Magas erőforrás-(CPU-, I/O-, hálózat- vagy memóriahasználat). |
központi feldolgozó egység A natívan lefordított tárolt eljárások jelentősen csökkenthetik a processzorhasználatot, mivel kevesebb utasítást igényelnek egy Transact-SQL utasítás végrehajtásához az értelmezett tárolt eljárásokhoz képest. In-Memory OLTP segíthet csökkenteni a kibővített számítási feladatok hardverberuházását, mivel egy kiszolgáló több kiszolgáló átviteli sebességét is képes biztosítani. Bemenet/Kimenet (I/O) Ha az adatok vagy indexlapok feldolgozása során I/O-szűk keresztmetszet jelentkezik, In-Memory OLTP csökkentheti a torlódást. Emellett az In-Memory OLTP-objektumok ellenőrzőpontozása folyamatos, és nem vezet az I/O-műveletek hirtelen növekedéséhez. Ha azonban a teljesítmény szempontjából kritikus táblák munkakészlete nem fér el a memóriában, In-Memory OLTP nem alkalmazható, mert az adatok memória-rezidensnek kell lenniük. Ha I/O-szűk keresztmetszetet tapasztal a naplózásban, akkor a In-Memory OLTP csökkentheti ezt, mivel kevesebb naplózást végez. Ha egy vagy több memóriaoptimalizált tábla nem tartós táblákként van konfigurálva, megszüntetheti az adatok naplózását. Memória In-Memory OLTP nem nyújt teljesítménybeli előnyt. In-Memory OLTP további nyomást helyezhet a memóriára, mivel az objektumoknak memória-rezidensnek kell lenniük. Hálózat In-Memory OLTP nem nyújt teljesítménybeli előnyt. Az adatokat az adatszintről az alkalmazásszintre kell továbbítani. |
| Skálázhatóság Az SQL Server-alkalmazások skálázási problémáinak többségét olyan egyidejűségi problémák okozzák, mint a zárolások, a rácsok és a spinlockok versengése. |
Reteszes versengés Általános helyzet az, hogy az index utolsó oldalán ütközés történik, amikor sorokat szúr be egyidejűleg kulcssorrendben. Mivel In-Memory OLTP nem vesz igénybe reteszelést az adatok elérésekor, a rendszer teljesen eltávolítja a reteszelési versengésekkel kapcsolatos méretezhetőségi problémákat. Spinlock tartási verseny Mivel In-Memory OLTP nem vesz igénybe zárolásokat az adatok elérésekor, a spinlock-versengésekkel kapcsolatos skálázhatósági problémák teljesen el lesznek távolítva. Kapcsolódó versengés zárolása Ha az adatbázis-alkalmazás blokkolási problémákat tapasztal az olvasási és írási műveletek között, In-Memory az OLTP eltávolítja a blokkolási problémákat, mivel az optimista egyidejűség-vezérlés új formáját használja az összes tranzakcióelkülönítési szint implementálásához. In-Memory OLTP nem használja a TempDB-t a sorverziók tárolására. Ha a skálázási problémát két írási művelet ütközése okozza, például két egyidejű tranzakció ugyanazt a sort próbálja frissíteni, In-Memory OLTP lehetővé teszi, hogy az egyik tranzakció sikeres legyen, és meghiúsuljon a másik tranzakció. A sikertelen tranzakciót explicit módon vagy implicit módon újra kell küldeni, és újra meg kell próbálkoznia a tranzakcióval. Mindkét esetben módosítania kell az alkalmazást. Ha az alkalmazás gyakran ütközik két írási művelet között, az optimista zárolás értéke csökken. Az alkalmazás nem alkalmas In-Memory OLTP-hez. A legtöbb OLTP-alkalmazás nem rendelkezik írási ütközésekkel, kivéve, ha az ütközés a zárolás eszkalációjának eredménye. |
Row-Level biztonsága a Memory-Optimized táblákban
Row-Level Biztonság támogatott a memóriaoptimalizált táblákban. A Row-Level biztonsági szabályzatok memóriaoptimalizált táblákra való alkalmazása lényegében megegyezik a lemezalapú táblákkal, azzal a kivétellel, hogy a biztonsági predikátumként használt beágyazott táblaértékeket natívan kell lefordítani (a WITH NATIVE_COMPILATION beállítással kell létrehozni). További részletekért tekintse meg a Row-Level biztonsági témakör funkcióközi kompatibilitási szakaszát.
A sorszintű biztonsághoz nélkülözhetetlen különböző beépített biztonsági függvények állnak rendelkezésre a memóriaoptimalizált táblákhoz. További információ: Beépített függvények natív fordítású modulokban.
EXECUTE AS CALLER – Mostantól minden natív modul támogatja és használja az EXECUTE AS CALLER parancsot alapértelmezés szerint, még akkor is, ha nincs megadva a tipp. Ennek az az oka, hogy az összes sorszintű biztonsági predikátumfüggvény az EXECUTE AS CALLER függvényt használja, így a függvény és a benne használt beépített függvények kiértékelése a hívó felhasználó kontextusában történik.
Az EXECUTE AS CALLER esetében van egy kisebb (körülbelül 10%) teljesítménycsökkenés, amelyet a hívó engedélyellenőrzései okoznak. Ha a modul kifejezetten meghatározza az EXECUTE AS OWNER vagy az EXECUTE AS SELF utasításokat, akkor ezek az engedélyellenőrzések és a kapcsolódó teljesítményköltségek elkerülhetők. A fenti lehetőségek és a már említett beépített függvények együttes használata azonban a szükséges környezetváltás miatt nagyobb teljesítménybeli találatot ér el.
Forgatókönyvek
A In-Memory OLTP teljesítményének javítására szolgáló tipikus forgatókönyvek rövid ismertetését azIn-Memory OLTP-ben találja.