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


In-Memory OLTP áttekintése és használati forgatókönyvei

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

In-Memory OLTP az SQL Serverben és az SQL Database-ben elérhető premier technológia a tranzakciófeldolgozás, az adatbetöltés, az adatbetöltés és az átmeneti adatforgatókönyvek teljesítményének optimalizálásához. Ez a cikk áttekintést nyújt a technológiáról, és ismerteti az OLTP In-Memory használati forgatókönyveit. Ezen információk segítségével megállapíthatja, hogy In-Memory OLTP megfelel-e az alkalmazásnak. A cikk egy olyan példával zárul, amely In-Memory OLTP-objektumokat, egy perf bemutatóra mutató hivatkozást és a következő lépésekhez használható erőforrásokra mutató hivatkozásokat mutat be.

In-Memory OLTP áttekintése

In-Memory OLTP nagy teljesítménynövekedést biztosít a megfelelő számítási feladatokhoz. Bár az ügyfelek bizonyos esetekben akár 30X-os teljesítménynövekedést is láthattak, az a számítási feladattól függ, hogy mennyi nyereséget lát.

Honnan származik ez a teljesítménynövekedés? Az In-Memory OLTP lényegében javítja a tranzakciók feldolgozásának teljesítményét azáltal, hogy hatékonyabbá teszi az adathozzáférést és a tranzakciók végrehajtását, valamint eltávolítja a tranzakciók egyidejű végrehajtása közötti zárolási és reteszelési versengést. In-Memory OLTP nem gyors, mert memóriában van; a memóriabeli adatok optimalizálása miatt gyors. Az adattárolási, hozzáférési és feldolgozási algoritmusokat az alapoktól kezdve újratervezték, hogy kihasználhassák a memóriabeli és magas egyidejűségi számítástechnika legújabb fejlesztéseit.

Most, csak azért, mert az adatok a memóriában élnek, nem jelenti azt, hogy elveszíti azokat, ha hiba történik. Alapértelmezés szerint minden tranzakció teljesen tartós, ami azt jelenti, hogy ugyanolyan tartóssági garanciával rendelkezik az SQL Server bármely más táblájához: a tranzakció véglegesítésének részeként minden módosítást a rendszer a tranzakciónaplóba ír a lemezen. Ha a tranzakció véglegesítése után bármikor hiba lép fel, az adatok ott lesznek, amikor az adatbázis újra online állapotba kerül. Emellett az In-Memory OLTP az SQL Server összes magas rendelkezésre állási és vészhelyreállítási funkciójával működik, például a rendelkezésre állási csoportokkal, a feladatátvevő fürtpéldányokkal, a biztonsági mentéssel/visszaállítással stb.

Ha In-Memory OLTP-t szeretne használni az adatbázisban, az alábbi típusú objektumok közül egyet vagy többet használ:

  • A rendszer memóriaoptimalizált táblákat használ a felhasználói adatok tárolására. Deklarálhat egy táblát, hogy a létrehozáskor memóriaoptimalizált legyen.
  • A nem tartós táblák átmeneti adatokhoz használatosak, gyorsítótárazáshoz vagy köztes eredményhalmazhoz (hagyományos ideiglenes táblák helyett). A nem tartós táblák olyan memóriaoptimalizált táblák, amelyek a DURABILITY=SCHEMA_ONLY deklarálva vannak, ami azt jelenti, hogy ezeknek a tábláknak a módosításai nem járnak IO-val. Ez elkerüli a napló I/O-erőforrások használatát olyan esetekben, amikor a tartósság nem okoz gondot.
  • A memóriaoptimalizált táblázattípusokat táblaértékű paraméterekhez (TVP-khez) és köztes eredményhalmazokhoz használják a tárolt eljárásokban. A memóriaoptimalizált táblázattípusok hagyományos táblázattípusok helyett használhatók. A memóriaoptimalizált táblázattípussal deklarált táblázatváltozók és TVP-k öröklik a nem tartós memóriaoptimalizált táblák előnyeit: a hatékony adathozzáférést és az IO-t.
  • A natívan lefordított T-SQL-modulok az egyes tranzakciókhoz szükséges időt tovább csökkentik a műveletek feldolgozásához szükséges CPU-ciklusok csökkentésével. Deklarál egy Transact-SQL modult natív fordításra a létrehozáskor. Jelenleg a következő T-SQL-modulok állíthatók össze natív módon: tárolt eljárások, triggerek és skaláris, felhasználó által definiált függvények.

In-Memory OLTP az SQL Serverbe és az SQL Database-be van beépítve. Mivel ezek az objektumok a hagyományos társaikhoz hasonlóan viselkednek, gyakran teljesítménybeli előnyöket érhet el, miközben csak minimális módosításokat hajthat végre az adatbázison és az alkalmazásban. Emellett memóriaoptimalizált és hagyományos lemezalapú táblák is lehetnek ugyanabban az adatbázisban, és lekérdezéseket futtathat a kettő között. A cikk későbbi részében tekintse meg az ilyen típusú objektumok Transact-SQL példaszkriptet .

Használati forgatókönyvek In-Memory OLTP-hez

In-Memory OLTP nem egy varázslatos gyors gomb, és nem minden számítási feladathoz alkalmas. A memóriaoptimalizált táblák például nem vonják le a processzorhasználatot, ha a lekérdezések többsége nagy adattartományokon végez összesítést. Az oszlopcentrikus indexek segítenek ebben a forgatókönyvben.

Caution

Ismert probléma: A memóriaoptimalizált táblákkal rendelkező adatbázisok esetében a tranzakciós naplók helyreállítása nélkül végzett biztonsági mentés, majd a tranzakciónapló helyreállításának későbbi végrehajtása a helyreállítással nem válaszoló adatbázis-visszaállítási folyamatot eredményezhet. Ez a probléma a naplók szállítási funkcióját is befolyásolhatja. A probléma megoldásához az SQL Server-példány újraindulhat a visszaállítási folyamat elindítása előtt.

Az alábbi lista azokat a forgatókönyveket és alkalmazásmintákat tartalmazza, amelyekben láthattuk, hogy az ügyfelek sikeresek In-Memory OLTP-vel.

Nagy átviteli sebesség és kis késésű tranzakciófeldolgozás

Ez az alapvető forgatókönyv, amelyhez In-Memory OLTP-t hoztunk létre: nagy mennyiségű tranzakciót támogatunk, és az egyes tranzakciók esetében konzisztensen alacsony késéssel.

A számítási feladatok gyakori forgatókönyvei a következők: pénzügyi eszközök kereskedelme, sportfogadás, mobil játék és hirdetéskézbesítés. Egy másik gyakori minta egy "katalógus", amelyet gyakran olvasnak és/vagy frissítenek. Ilyenek például a nagyméretű fájlok, amelyek több fürtcsomóponton vannak elosztva, és az egyes fájlok egyes szegmenseinek helyét egy memóriaoptimalizált táblában katalogizálja.

Implementálási szempontok

Használjon memóriaoptimalizált táblákat az alaptranzakciós táblákhoz, vagyis a leginkább teljesítménykritikus tranzakciókat tartalmazó táblákhoz. Natívan lefordított tárolt eljárások használata az üzleti tranzakcióhoz társított logika végrehajtásának optimalizálásához. Minél több logikát tud leküldni az adatbázisban tárolt eljárásokba, annál jobban kihasználhatja In-Memory OLTP-t.

Egy meglévő alkalmazás első lépései:

  1. A tranzakcióteljesítmény-elemzési jelentéssel azonosíthatja a migrálni kívánt objektumokat.
  2. A migráláshoz használja a memóriaoptimalizálási tanácsadót és a natív fordítási tanácsadót .

Adatbetöltés, beleértve az IoT-t (internetkapcsolat)

In-Memory OLTP jó választás nagy mennyiségű adat egyidejű betöltéséhez számos különböző forrásból. Az adatok sql server-adatbázisba való betöltése gyakran előnyös más célhelyekhez képest, mivel az SQL Server gyorsan futtat lekérdezéseket az adatokon, és lehetővé teszi a valós idejű elemzéseket.

Gyakori alkalmazásminták a következők:

  • Az érzékelői adatok és események betöltése, valamint az értesítések és az előzményelemzés engedélyezése.
  • Kötegelt frissítések kezelése akár több forrásból is, miközben minimalizálja az egyidejű olvasási számítási feladatra gyakorolt hatást.

Implementálási szempontok

Használjon memóriaoptimalizált táblázatot az adatbetöltéshez. Ha a betöltés többnyire beszúrásokból (nem frissítésekből) áll, és az adatok OLTP-tárolási lábnyomának In-Memory aggodalomra ad okot, vagy

Az SQL Server-minták tárháza tartalmaz egy intelligens rácsalkalmazást, amely egy időbeli memóriaoptimalizált táblát, egy memóriaoptimalizált táblázattípust és egy natívan lefordított tárolt eljárást használ az adatbetöltés felgyorsításához, miközben kezeli az érzékelőadatok In-Memory OLTP-tárolási lábnyomát:

Gyorsítótárazás és munkamenet állapota

Az In-Memory OLTP technológia vonzó platformtá teszi az SQL Server vagy az Azure SQL-adatbázisok adatbázismotorját a munkamenet-állapot (például egy ASP.NET-alkalmazás) fenntartásához és gyorsítótárazáshoz.

ASP.NET munkamenet állapota az OLTP In-Memory sikeres használati esete. Az SQL Serverrel egy ügyfél másodpercenként 1,2 millió kérést akart elérni. Addig is In-Memory OLTP-t kezdtek használni a vállalat összes középszintű alkalmazásának gyorsítótárazási igényeihez. Részletek: Hogyan használja a bwin az SQL Server 2016 (13.x) In-Memory OLTP-t a példátlan teljesítmény és skálázás érdekében

Implementálási szempontok

A nem tartós memóriaoptimalizált táblákat egyszerű kulcs-érték tárolóként használhatja egy BLOB varbinary(max) oszlopban való tárolásával. Egy részben strukturált gyorsítótárat is implementálhat JSON-támogatással az SQL Serverben és az SQL Database-ben. Végül létrehozhat egy teljes relációs gyorsítótárat nem tartós táblákon keresztül, teljes relációs sémával, beleértve a különböző adattípusokat és korlátozásokat.

Ismerkedés a memóriaoptimalizált ASP.NET munkamenet-állapottal a GitHubon közzétett szkriptek használatával a beépített SQL Server-munkamenetállapot-szolgáltató által létrehozott objektumok lecseréléséhez: aspnet-session-state

Ügyféleset-vizsgálat

tempdb objektum cseréje

Használjon nem tartós táblákat és memóriaoptimalizált táblázattípusokat a hagyományos tempdb alapú struktúrák, például az ideiglenes táblák, a táblázatváltozók és a táblaértékű paraméterek (TVP-k) helyére.

A memóriaoptimalizált táblázatváltozók és a nem tartós táblák általában csökkentik a processzort, és teljesen eltávolítják a napló IO-t a hagyományos táblázatváltozókkal és #temp táblázattal összehasonlítva.

Implementálási szempontok

Első lépések: A temp table és a táblaváltozó teljesítményének javítása memóriaoptimalizálással.

Ügyféleset-vizsgálat

ETL (Átalakítási terhelés kinyerve)

Az ETL-munkafolyamatok gyakran magukban foglalják az adatok átmeneti táblába való betöltését, az adatok átalakítását és a végső táblákba való betöltést.

Használjon nem tartós memóriaoptimalizált táblákat az adat-előkészítéshez. Teljesen eltávolítják az összes IO-t, és hatékonyabbá teszik az adathozzáférést.

Implementálási szempontok

Ha a munkafolyamat részeként átalakításokat hajt végre az előkészítési táblán, natívan lefordított tárolt eljárásokkal felgyorsíthatja ezeket az átalakításokat. Ha ezeket az átalakításokat párhuzamosan is végrehajthatja, a memóriaoptimalizálás további skálázási előnyökkel jár.

Példaszkript

Az In-Memory OLTP használatának megkezdése előtt létre kell hoznia egy MEMORY_OPTIMIZED_DATA fájlcsoportot. Emellett javasoljuk, hogy használja a 130-es (vagy magasabb) adatbázis-kompatibilitási szintet, és állítsa be az adatbázis-beállítást, MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON értékre.

A következő helyen található szkripttel létrehozhatja a fájlcsoportot az alapértelmezett adatmappában, és konfigurálhatja az ajánlott beállításokat:

Az alábbi példaszkript In-Memory adatbázisában létrehozható OLTP-objektumokat mutatja be.

Először konfigurálja az adatbázist In-Memory OLTP-hez.

-- configure recommended DB option
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;
GO

Különböző tartósságú táblákat hozhat létre:

-- memory-optimized table
CREATE TABLE dbo.table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON);
GO
-- non-durable table
CREATE TABLE dbo.temp_table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON,
      DURABILITY=SCHEMA_ONLY);
GO

Táblatípust memóriabeli táblázatként is létrehozhat.

-- memory-optimized table type
CREATE TYPE dbo.tt_table1 AS TABLE
( c1 INT IDENTITY,
  c2 NVARCHAR(MAX),
  is_transient BIT NOT NULL DEFAULT (0),
  INDEX ix_c1 HASH (c1) WITH (BUCKET_COUNT=1024))
WITH (MEMORY_OPTIMIZED=ON);
GO

Létrehozhat natívan lefordított tárolt eljárást. További információ: Natívan lefordított tárolt eljárások meghívása adatelérési alkalmazásokból.

-- natively compiled stored procedure
CREATE PROCEDURE dbo.usp_ingest_table1
  @table1 dbo.tt_table1 READONLY
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC
    WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT,
          LANGUAGE=N'us_english')

  DECLARE @i INT = 1

  WHILE @i > 0
  BEGIN
    INSERT dbo.table1
    SELECT c2
    FROM @table1
    WHERE c1 = @i AND is_transient=0

    IF @@ROWCOUNT > 0
      SET @i += 1
    ELSE
    BEGIN
      INSERT dbo.temp_table1
      SELECT c2
      FROM @table1
      WHERE c1 = @i AND is_transient=1

      IF @@ROWCOUNT > 0
        SET @i += 1
      ELSE
        SET @i = 0
    END
  END

END
GO
-- sample execution of the proc
DECLARE @table1 dbo.tt_table1;
INSERT @table1 (c2, is_transient) VALUES (N'sample durable', 0);
INSERT @table1 (c2, is_transient) VALUES (N'sample non-durable', 1);
EXECUTE dbo.usp_ingest_table1 @table1=@table1;
SELECT c1, c2 from dbo.table1;
SELECT c1, c2 from dbo.temp_table1;
GO