Megosztás a következőn keresztül:


Az In-Memory OLTP kezdeti területeinek felmérése

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Felügyelt Példány

Ez a cikk annak a fejlesztőnek készült, aki sietve szeretné megtanulni a Microsoft SQL Server és az Azure SQL Database In-Memory OLTP teljesítményfunkcióinak alapjait.

Az OLTP In-Memory esetében ez a cikk a következőket tartalmazza:

  • A funkciók gyors magyarázata.
  • Alapvető kódminták, amelyek implementálják a funkciókat.

Az SQL Server és az SQL Database csak kisebb eltéréseket mutat a In-Memory technológiák támogatásában.

Vadonban néhány blogger a In-Memory OLTP-re Hekatonkénthivatkozik.

A In-Memory funkciók előnyei

Az SQL Server olyan In-Memory funkciókat biztosít, amelyek nagyban javítják számos alkalmazásrendszer teljesítményét. A legegyértelmesebb szempontokat ebben a szakaszban ismertetjük.

Az OLTP funkciói (online tranzakciós feldolgozás)

Azok a rendszerek, amelyeknek egyszerre nagy mennyiségű SQL INSERT-t kell feldolgozniuk, kiváló jelöltek az OLTP-funkciókhoz.

  • A teljesítménymutatók azt mutatják, hogy az 5-20-szor gyorsabb sebességbeli fejlesztések a In-Memory funkciók elfogadásával érhetők el.

Azok a rendszerek, amelyek nehéz számításokat dolgoznak fel Transact-SQL-ban, kiváló jelöltek.

  • A nagy számítási feladatokhoz dedikált tárolt eljárások akár 99-szer gyorsabban is futtathatók.

Később az alábbi cikkeket tekintheti meg, amelyek az OLTP In-Memory teljesítménybeli nyereségét szemléltetik:

Az Operational Analytics funkciói

In-Memory Analytics olyan SQL SELECT-ekre utal, amelyek tranzakciós adatokat összesítenek, általában egy GROUP BY záradék belefoglalásával. Az oszlopcentrikus nevű indextípus központi szerepet jelent az operatív elemzésekben.

Két fő forgatókönyv létezik:

  • Batch Operational Analytics olyan összesítési folyamatokra utal, amelyek munkaidő után vagy másodlagos hardveren futnak, és a tranzakciós adatok másolatai vannak.
  • Valós idejű Üzemi Elemzések a tranzakciós számítási feladatokhoz használt elsődleges hardveren munkaidőben futó összesítési folyamatokra utal.

Ez a cikk az OLTP-ről szól, és nem az Elemzésről. További információ arról, hogy az oszlopcentrikus indexek hogyan hozzák az Elemzést az SQL-be:

Oszloptár

A kiváló blogbejegyzések sorozata elegánsan magyarázza az oszlopcentrikus indexeket több szempontból. A bejegyzések többsége részletesebben ismerteti a valós idejű üzemeltetési elemzés fogalmát, amelyet a columnstore támogat. Ezeket a bejegyzéseket Sunil Agarwal, a Microsoft programmenedzsere írta 2016 márciusában.

Valós idejű működési analitika

  1. Real-Time Operatív elemzés In-Memory technológiai
  2. Real-Time Operatív Analitika – A nem fürtözött columnstore index (NCCI) áttekintése
  3. Real-Time Operational Analytics: Egyszerű példa nem klaszterezett oszlophalmozó index (NCCI) használatával az SQL Server 2016-ban
  4. Real-Time Operational Analytics: DML-műveletek és nem klaszterezett oszlopstore index (NCCI) az SQL Server 2016-ban
  5. Real-Time Operational Analytics: Szűrt, nem fürtözött columnstore index (NCCI)
  6. Real-Time Operational Analytics: Tömörítési késleltetés lehetősége nem klaszterezett columnstore index esetén (NCCI)
  7. Real-Time Operational Analytics: Tömörítési késleltetési opció az NCCI-vel és a teljesítmény
  8. Real-Time Operational Analytics: Memory-Optimized táblák és oszlopcentrikus indexek

Oszlopalapú index töredezettségmentesítése

  1. oszlopcentrikus index töredezettségmentesítése a REORGANIZE paranccsal
  2. Oszlop tárolási index egyesítési szabályzat az REORGANIZE számára

Adatok tömeges importálása

  1. Klaszterezett oszloptároló: Tömeges betöltés
  2. Csoportosított oszlopalapú index: Adatbetöltési optimalizálások – Minimális naplózás
  3. Fürtözött oszlopra tömörített index: Adatbetöltés optimalizálása – Párhuzamos tömeges importálás

Az In-Memory OLTP funkciói

Nézzük meg In-Memory OLTP fő jellemzőit.

Memóriaoptimalizált táblák

A T-SQL-kulcsszó MEMORY_OPTIMIZED a CREATE TABLE utasításban az, hogy a rendszer hogyan hozza létre a táblát úgy, hogy az aktív memóriában, nem pedig lemezen legyen.

A memóriaoptimalizált táblák egyetlen reprezentációval rendelkezik az aktív memóriában, a másodlagos példány pedig a lemezen.

  • A lemezmásolás a kiszolgáló vagy az adatbázis leállítása, majd újraindítása után a rutinszerű helyreállításhoz szükséges. Ez a memória-plusz lemez kettősség teljesen rejtve van Ön és a kód elől.

Natívan lefordított modulok

A T-SQL-kulcsszó NATIVE_COMPILATION a CREATE PROCEDURE utasításban arra szolgál, hogy létrehozzunk egy natívan lefordított tárolt eljárást. A T-SQL-utasítások a natív proc első használatakor gépi kódra lesznek lefordítva minden alkalommal, amikor az adatbázis online állapotba kerül. A T-SQL-utasítások már nem bírják ki az összes utasítás lassú értelmezését.

  • Kompiláláskor olyan eredményeket láttunk, amelyek az értelmezett feldolgozás időtartamának századrészét is elérhetik.

A natív modul csak a memóriaoptimalizált táblákra hivatkozhat, és nem hivatkozhat lemezalapú táblákra.

A natívan lefordított moduloknak három típusa van:

Rendelkezésre állás az Azure SQL Database-ben

In-Memory OLTP és Columnstore az Azure SQL Database-ben érhető el. További információ: Teljesítmény optimalizálása az SQL DatabaseIn-Memory technológiáinak használatával.

1. Kompatibilitási szint biztosítása >= 130

Ez a szakasz számozott szakaszok sorozatát indítja el, amelyek együttesen mutatják be az In-Memory OLTP-funkciók implementálásához használható Transact-SQL szintaxist.

Először is fontos, hogy az adatbázis kompatibilitási szintje legalább 130 legyen. A következő a T-SQL-kód, amely az aktuális adatbázis jelenlegi kompatibilitási szintjét jeleníti meg.

SELECT d.compatibility_level
    FROM sys.databases as d
    WHERE d.name = Db_Name();

A következő a T-SQL-kód, amely szükség esetén frissíti a szintet.

ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL = 130;

2. Emelés pillanatképre

Ha egy tranzakció lemezalapú táblát és memóriaoptimalizált táblát is magában foglal, akkor a tárolók közötti tranzakció. Egy ilyen tranzakcióban elengedhetetlen, hogy a tranzakció memóriaoptimalizált része a SNAPSHOT nevű tranzakcióelkülönítési szinten működjön.

Ha megbízhatóan szeretné érvényesíteni ezt a szintet a tárolók közötti tranzakció memóriaoptimalizált tábláihoz, módosítsa az adatbázis-beállítást a következő T-SQL végrehajtásával.

ALTER DATABASE CURRENT
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;

3. Optimalizált FILEGROUP létrehozása

A Microsoft SQL Serveren a memóriaoptimalizált tábla létrehozása előtt először létre kell hoznia egy FILEGROUP fájlt, amelyet a CONTAINS MEMORY_OPTIMIZED_DATA deklarál. A FILEGROUP hozzá van rendelve az adatbázishoz. További részletek:

Az Azure SQL Database-ben nem kell ilyen FILEGROUP-t létrehozni, és nem is lehet létrehozni.

Az alábbi T-SQL-példaszkript lehetővé teszi az adatbázist In-Memory OLTP számára, és konfigurálja az összes javasolt beállítást. Az SQL Serverrel és az Azure SQL Database-sel is működik: enable-in-memory-oltp.sql.

Vegye figyelembe, hogy a MEMORY_OPTIMIZED_DATA-fájlcsoporttal rendelkező adatbázisok esetében nem minden SQL Server-funkció támogatott. A korlátozásokkal kapcsolatos részletekért lásd: nem támogatott SQL Server-szolgáltatások In-Memory OLTP-

4. Memóriaoptimalizált táblázat létrehozása

A kulcsfontosságú Transact-SQL kulcsszó a MEMORY_OPTIMIZED kulcsszó.

CREATE TABLE dbo.SalesOrder
    (
        SalesOrderId   integer   not null   IDENTITY
            PRIMARY KEY NONCLUSTERED,
        CustomerId   integer    not null,
        OrderDate    datetime   not null
    )
        WITH
            (MEMORY_OPTIMIZED = ON,
            DURABILITY = SCHEMA_AND_DATA);

Transact-SQL INSERT és SELECT utasítás egy memóriaoptimalizált táblához ugyanaz, mint egy normál táblához.

ALTER TABLE Memory-Optimized táblák esetén

ALTER TABLE... Az ADD/DROP képes oszlopokat hozzáadni vagy eltávolítani egy memóriaoptimalizált táblából vagy indexből.

  • A CREATE INDEX és a DROP INDEX nem futtatható memóriaoptimalizált táblán, használja az ALTER TABLE ... ADD/DROP INDEX helyett.
  • További információ: Memory-Optimized táblák módosítása.

A memóriaoptimalizált táblák és indexek megtervezése

5. Natívan lefordított tárolt eljárás létrehozása (natív proc)

A kulcsfontosságú kulcsszó a NATIVE_COMPILATION.

CREATE PROCEDURE ncspRetrieveLatestSalesOrderIdForCustomerId  
        @_CustomerId   INT  
        WITH  
            NATIVE_COMPILATION,  
            SCHEMABINDING  
    AS  
    BEGIN ATOMIC  
        WITH  
            (TRANSACTION ISOLATION LEVEL = SNAPSHOT,
            LANGUAGE = N'us_english')  
      
        DECLARE @SalesOrderId int, @OrderDate datetime;
      
        SELECT TOP 1  
                @SalesOrderId = s.SalesOrderId,  
                @OrderDate    = s.OrderDate  
            FROM dbo.SalesOrder AS s  
            WHERE s.CustomerId = @_CustomerId  
            ORDER BY s.OrderDate DESC;  
      
        RETURN @SalesOrderId;  
    END;  

A SCHEMABINDING kulcsszó azt jelenti, hogy a natív eljárásban hivatkozott táblákat nem lehet törölni, hacsak a natív eljárást nem törlik először. Részletekért lásd: Natívan lefordított tárolt eljárások létrehozása.

Vegye figyelembe, hogy nem kell natívan lefordított tárolt eljárást létrehoznia a memóriaoptimalizált táblák eléréséhez. A hagyományos tárolt eljárások és alkalmi kötegek memóriaoptimalizált tábláira is hivatkozhat.

6. Hajtsa végre a natív eljárást

Töltse fel a táblát két adatsorsal.

INSERT into dbo.SalesOrder  
        ( CustomerId, OrderDate )  
    VALUES  
        ( 42, '2013-01-13 03:35:59' ),
        ( 42, '2015-01-15 15:35:59' );

A natívan lefordított tárolt eljárásra irányuló EXECUTE-hívás a következő.

DECLARE @LatestSalesOrderId int, @mesg nvarchar(128);
      
EXECUTE @LatestSalesOrderId =  
    ncspRetrieveLatestSalesOrderIdForCustomerId 42;
      
SET @mesg = CONCAT(@LatestSalesOrderId,  
    ' = Latest SalesOrderId, for CustomerId = ', 42);
PRINT @mesg;  

Itt van a tényleges PRINT kimenet:

-- 2 = Latest SalesOrderId, for CustomerId = 42  

Útmutató a dokumentációhoz és a következő lépésekhez

Az előző egyszerű példák alapot nyújtanak az In-Memory OLTP fejlettebb funkcióinak megismeréséhez. Az alábbi szakaszok útmutatást nyújtanak azokról a különleges szempontokról, amelyeket érdemes lehet megismernie, és hogy hol láthatja az egyes részletek részleteit.

Hogyan működnek az OLTP-funkciók sokkal gyorsabban In-Memory segítségével?

Az alábbi alszakaszok röviden bemutatják, hogyan működnek az In-Memory OLTP-funkciók belsőleg a jobb teljesítmény érdekében.

A memóriaoptimalizált táblák gyorsabb teljesítménye

Kettős természet: A memóriaoptimalizált táblák kettős természetűek: az egyik az aktív memóriában, a másik a merevlemezen. Minden tranzakció a tábla mindkét ábrázolása számára le van kötve. A tranzakciók a sokkal gyorsabb aktív memóriaábrázoláson alapulnak. A memóriaoptimalizált táblák kihasználják az aktív memória nagyobb sebességét a lemezhez képest. Az aktív memória nagyobb fürgesége továbbá lehetővé teszi egy fejlettebb táblázatszerkezet kialakítását, amely a sebességre van optimalizálva. A fejlett struktúra oldal nélküli is, így elkerüli a reteszek és a spinlockok terhelését és versengését.

Nincs zárolás: A memóriaoptimalizált tábla egy optimista megközelítést alkalmaz az adatintegritás, valamint az egyidejűség és a magas átviteli sebesség versengő céljai között. A tranzakció során a tábla nem helyez zárolásokat a frissített adatsorok egyik verziójára sem. Ez jelentősen csökkentheti a versengést egyes nagy mennyiségű rendszerekben.

Sorverziók: A memóriaoptimalizált táblázat a zárolások helyett egy frissített sor új verzióját adja hozzá magában a táblában, nem pedig a tempdb-ben. Az eredeti sor a tranzakció véglegesítése után marad. A tranzakció során más folyamatok is beolvashatják a sor eredeti verzióját.

  • Ha egy sor több verziója is létrejön egy lemezalapú táblához, a sorverziók ideiglenesen a tempdb-ben lesznek tárolva.

Kevesebb naplózás: A frissített sorok előtti és utáni verziók a memóriaoptimalizált táblázatban vannak tárolva. A sorok párja a naplófájlba hagyományosan írt információk nagy részét tartalmazza. Ez lehetővé teszi, hogy a rendszer kevesebb információt és ritkábban írjon a naplóba. A tranzakciós integritás azonban biztosított.

A natív procek gyorsabb teljesítménye

Ha egy szabályosan értelmezett tárolt eljárást natívan lefordított tárolt eljárásmá alakít át, az jelentősen csökkenti a futtatás során végrehajtandó utasítások számát.

In-Memory funkciók kompromisszumoi

Ahogy a számítástechnikában is gyakran előfordul, a In-Memory funkciók által biztosított teljesítménynövekedés kompromisszumot jelent. A jobb funkciók olyan előnyöket biztosítanak, amelyek értékesebbek, mint a funkció többletköltségei. A kompromisszumokről a következő címen talál átfogó útmutatást:

A szakasz többi része felsorol néhány fontos tervezési és kompromisszumos szempontot.

Memóriaoptimalizált táblák kompromisszumoi

Memória becslése: Meg kell becsülnie a memóriaoptimalizált táblázat által felhasznált aktív memória mennyiségét. A számítógéprendszernek megfelelő memóriakapacitással kell rendelkeznie egy memóriaoptimalizált tábla üzemeltetéséhez. További részletek:

Nagy méretű tábla particionálása: A nagy memóriaigény kielégítésének egyik módja az, hogy a nagy méretű táblát olyan memóriabeli részekre particionáljuk, amelyek aktuális adatsorokat tárolnak, míg a lemezen lévő egyéb részek archivált sorokat tárolnak (például a teljes körűen kiszállított és befejezett értékesítési rendeléseket). Ez a particionálás manuális tervezési és megvalósítási folyamat. Lát:

A natív procek kompromisszumoi

  • A natívan lefordított tárolt eljárások nem férnek hozzá a lemezalapú táblákhoz. A natív proc csak memóriaoptimalizált táblákat tud elérni.
  • Amikor egy natív proc a kiszolgáló vagy adatbázis legutóbbi online állapotba helyezése után fut először, a natív procet egyszer újra kell állítani. Ez késést okoz a natív proc futtatása előtt.

Speciális szempontok a memóriaoptimalizált táblákhoz

Memory-Optimized Táblák indexei bizonyos szempontból eltérnek a hagyományos lemezen lévő táblák indexeitől. A kivonatindexek csak memóriaoptimalizált táblákon érhetők el.

Gondoskodnia kell arról, hogy elegendő aktív memória legyen a tervezett memóriaoptimalizált táblához és indexeihez. Lát:

A memóriaoptimalizált tábla meghatározható a TARTÓSSÁG = SCHEMA_ONLY értékkel.

  • Ez a szintaxis azt jelzi a rendszernek, hogy az adatbázis offline állapotba helyezésekor minden adatot elvet a memóriaoptimalizált táblából. Csak a tábladefiníció kerül tárolásra.
  • Amikor az adatbázis újra online állapotba kerül, a memóriaoptimalizált táblázat vissza lesz töltve az aktív memóriába, üres adatokkal.
  • SCHEMA_ONLY táblák kiváló alternatívát jelenthetnek a #temporary táblák helyett a tempdb-ben, ha több ezer sorról van szó.

A táblaváltozók memóriaoptimalizáltként is deklarálhatók. Lát:

A natívan lefordított modulok speciális szempontjai

Az Transact-SQL keresztül elérhető natívan lefordított modulok típusai a következők:

A natívan lefordított, felhasználó által definiált függvény (UDF) gyorsabban fut, mint egy értelmezett UDF. Íme néhány megfontolandó szempont az UDF-ekkel kapcsolatban:

  • Ha a T-SQL SELECT egy UDF-et használ, a rendszer mindig egyszer hívja meg az UDF-et a visszaadott soronként.
    • Az UDF-ek soha nem futnak beágyazottan, helyette mindig meghívásra kerülnek.
    • Az összeállított különbségtétel kevésbé jelentős, mint az összes UDF-hez kapcsolódó, ismétlődő hívások miatt fellépő többletterhelés.
    • Az UDF-hívások többletterhelése azonban gyakorlati szinten gyakran elfogadható.

A natív UDF-ek teljesítményével kapcsolatos tesztelési adatokért és magyarázatért lásd:

Dokumentációs útmutató memóriaoptimalizált táblákhoz

A memóriaoptimalizált táblákra vonatkozó speciális szempontokat ismertető további cikkek:

Dokumentációs útmutató natív procekhez

A következő cikk, valamint a tartalomjegyzékben (TOC) található gyermekcikkek ismertetik a natívan lefordított tárolt eljárások részleteit.

Az alábbi cikkek kódot kínálnak az In-Memory OLTP használatával elérhető teljesítménynövekedés bemutatásához: