Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
In-Memory OLTP is de belangrijkste technologie die beschikbaar is in SQL Server en SQL Database voor het optimaliseren van de prestaties van transactieverwerking, gegevensopname, gegevensbelasting en tijdelijke gegevensscenario's. Dit artikel bevat een overzicht van de technologie en beschrijft gebruiksscenario's voor In-Memory OLTP. Gebruik deze informatie om te bepalen of In-Memory OLTP geschikt is voor uw toepassing. Het artikel eindigt met een voorbeeld met In-Memory OLTP-objecten, verwijzingen naar een demo perf en verwijzingen naar resources die u kunt gebruiken voor de volgende stappen.
- Dit artikel bevat informatie over de In-Memory OLTP-technologie in zowel SQL Server als SQL Database.
- Zie Prestaties optimaliseren met behulp van in-memory technologieën in Azure SQL Database en Blog: In-Memory OLTP in Azure SQL Database voor meer informatie over in-memory gegevens in Azure SQL Database.
- Zie Prestaties optimaliseren met behulp van in-memory technologieën in Azure SQL Managed Instance voor meer informatie over in-memory gegevens in Azure SQL Managed Instance.
Overzicht van In-Memory OLTP
In-Memory OLTP kan goede prestatieverbeteringen bieden, voor de juiste werkbelastingen. Hoewel klanten in sommige gevallen tot 30X prestatieverbeteringen hebben gezien, hangt de hoeveelheid winst die u ziet, af van de workload.
Waar komt deze prestatiewinst vandaan? In wezen verbetert In-Memory OLTP de prestaties van transactieverwerking door gegevenstoegang en transactieuitvoering efficiënter te maken, en door conflicten tussen vergrendeling en vergrendeling te verwijderen tussen gelijktijdige uitvoering van transacties. In-Memory OLTP is niet snel omdat het in het geheugen is; het is snel vanwege optimalisatie rond in-memory gegevens. Algoritmen voor gegevensopslag, toegang en verwerking zijn helemaal opnieuw ontworpen om te profiteren van de nieuwste verbeteringen in het geheugen en hoge gelijktijdigheidscomputing.
Omdat gegevens zich in het geheugen bevinden, betekent dit niet dat u deze kwijtraakt wanneer er een fout opgetreden is. Standaard zijn alle transacties volledig duurzaam, wat betekent dat u dezelfde duurzaamheid garandeert dat u krijgt voor elke andere tabel in SQL Server: als onderdeel van transactiedoorvoering worden alle wijzigingen naar het transactielogboek op schijf geschreven. Als er op enig moment een fout optreedt nadat de transactie is doorgevoerd, zijn uw gegevens aanwezig wanneer de database weer online komt. Daarnaast werkt In-Memory OLTP met alle mogelijkheden voor hoge beschikbaarheid en herstel na noodgevallen van SQL Server, zoals beschikbaarheidsgroepen, failoverclusterexemplaren, back-up/herstel, enzovoort.
Als u In-Memory OLTP in uw database wilt gebruiken, gebruikt u een of meer van de volgende typen objecten:
- Tabellen die zijn geoptimaliseerd voor geheugen , worden gebruikt voor het opslaan van gebruikersgegevens. U declareert een tabel die is geoptimaliseerd voor geheugen tijdens het maken.
- Niet-duurzame tabellen worden gebruikt voor tijdelijke gegevens, voor caching of voor tussenliggende resultatenset (waarbij traditionele tijdelijke tabellen worden vervangen). Een niet-duurzame tabel is een tabel die is geoptimaliseerd voor geheugen en die is gedeclareerd met DUURZAAMHEID=SCHEMA_ONLY, wat betekent dat er geen I/O in rekening wordt gebracht bij wijzigingen in deze tabellen. Dit voorkomt het verbruik van IO-logboekbronnen voor gevallen waarin duurzaamheid geen probleem is.
- Tabeltypen die zijn geoptimaliseerd voor geheugen, worden gebruikt voor parameters met tabelwaarde (TVP's) en tussenliggende resultatensets in opgeslagen procedures. Tabeltypen die zijn geoptimaliseerd voor geheugen, kunnen worden gebruikt in plaats van traditionele tabeltypen. Tabelvariabelen en TVP's die zijn gedeclareerd met behulp van een tabeltype dat is geoptimaliseerd voor geheugen, nemen de voordelen over van niet-duurzame tabellen die zijn geoptimaliseerd voor geheugen: efficiënte gegevenstoegang en geen I/O.
- Systeemeigen gecompileerde T-SQL-modules worden gebruikt om de tijd die nodig is voor een afzonderlijke transactie verder te verminderen door cpu-cycli te verminderen die nodig zijn om de bewerkingen te verwerken. U declareert een Transact-SQL-module die systeemeigen moet worden gecompileerd tijdens het maken. Op dit moment kunnen de volgende T-SQL-modules systeemeigen worden gecompileerd: opgeslagen procedures, triggers en scalaire door de gebruiker gedefinieerde functies.
In-Memory OLTP is ingebouwd in SQL Server en SQL Database. Omdat deze objecten zich op een vergelijkbare manier gedragen als hun traditionele tegenhangers, kunt u vaak prestatievoordelen krijgen terwijl u slechts minimale wijzigingen aanbrengt in de database en de toepassing. Bovendien kunt u zowel voor geheugen geoptimaliseerde als traditionele schijftabellen in dezelfde database hebben en query's uitvoeren op de twee. Zie het voorbeeldscript Transact-SQL voor elk van deze typen objecten verderop in dit artikel.
Gebruiksscenario's voor In-Memory OLTP
In-Memory OLTP is geen go-fast-knop en is niet geschikt voor alle workloads. Tabellen die zijn geoptimaliseerd voor geheugen brengen uw CPU-gebruik bijvoorbeeld niet omlaag als de meeste query's aggregatie uitvoeren over grote gegevensbereiken. Columnstore-indexen helpen bij dat scenario.
Waarschuwing
Bekend probleem: Voor databases met tabellen die zijn geoptimaliseerd voor geheugen, kan het uitvoeren van een transactionele logboekback-up zonder herstel en later het uitvoeren van een herstelbewerking van een transactielogboek met herstel leiden tot een niet-reagerend databaseherstelproces. Dit probleem kan ook van invloed zijn op de functionaliteit van logboekverzending. Om dit probleem te omzeilen, kan het SQL Server-exemplaar opnieuw worden gestart voordat het herstelproces wordt gestart.
Hier volgt een lijst met scenario's en toepassingspatronen waarin we hebben gezien dat klanten succesvol zijn met In-Memory OLTP.
Verwerking van transacties met hoge doorvoer en lage latentie
Dit is het kernscenario waarvoor we In-Memory OLTP hebben gebouwd: ondersteuning bieden voor grote hoeveelheden transacties, met consistente lage latentie voor afzonderlijke transacties.
Veelvoorkomende workloadscenario's zijn: handel in financiële instrumenten, sportweddenschappen, mobiele gaming en advertentielevering. Een ander veelvoorkomend patroon is een 'catalogus' die regelmatig wordt gelezen en/of bijgewerkt. Een voorbeeld is waar u grote bestanden hebt, elk verdeeld over meerdere clusterknooppunten en u de locatie van elke shard van elk bestand in een tabel die is geoptimaliseerd voor geheugen catalogiseren.
Implementatieoverwegingen
Gebruik tabellen die zijn geoptimaliseerd voor geheugen voor uw kerntransactietabellen, dat wil gezegd, de tabellen met de meest prestatiekritieke transacties. Gebruik systeemeigen gecompileerde opgeslagen procedures om de uitvoering van de logica die is gekoppeld aan de zakelijke transactie te optimaliseren. Hoe meer logica u kunt pushen naar opgeslagen procedures in de database, hoe meer voordeel u ziet van In-Memory OLTP.
Ga als volgende aan de slag in een bestaande toepassing:
- Gebruik het rapport transactieprestatieanalyse om de objecten te identificeren die u wilt migreren.
- Gebruik de Memory Optimization Advisor en Native Compilation Advisor om u te helpen met migratie.
Gegevensopname, waaronder IoT (Internet of Things)
In-Memory OLTP is goed bij het opnemen van grote hoeveelheden gegevens uit veel verschillende bronnen tegelijk. En het is vaak nuttig om gegevens op te nemen in een SQL Server-database in vergelijking met andere bestemmingen, omdat SQL Server actieve query's maakt op basis van de gegevens snel en u realtime inzichten kunt krijgen.
Veelvoorkomende toepassingspatronen zijn:
- Sensorleeswaarden en -gebeurtenissen opnemen en meldingen en historische analyse toestaan.
- Batchupdates beheren, zelfs vanuit meerdere bronnen, terwijl de impact op de gelijktijdige leesworkload wordt geminimaliseerd.
Implementatieoverwegingen
Gebruik een tabel die is geoptimaliseerd voor geheugen voor de gegevensopname. Als de opname voornamelijk bestaat uit invoegingen (in plaats van updates) en In-Memory OLTP-opslagvoetafdruk van de gegevens een probleem is, ofwel
- Gebruik een taak om regelmatig batch-offloadgegevens naar een schijftabel met een geclusterde columnstore-index te gebruiken met behulp van een taak die wel
INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>; of - Gebruik een tijdelijke tabel die is geoptimaliseerd voor geheugen om historische gegevens te beheren. In deze modus worden historische gegevens op schijf bewaard en wordt gegevensverplaatsing beheerd door het systeem.
De opslagplaats met SQL Server-voorbeelden bevat een smart grid-toepassing die gebruikmaakt van een tijdelijke tabel die is geoptimaliseerd voor geheugen, een tabeltype dat is geoptimaliseerd voor geheugen en een systeemeigen opgeslagen procedure, om de opname van gegevens te versnellen, terwijl de In-Memory OLTP-opslagvoetafdruk van de sensorgegevens wordt beheerd:
Cache- en sessiestatus
De In-Memory OLTP-technologie maakt de database-engine in SQL Server- of Azure SQL-databases een aantrekkelijk platform voor het onderhouden van de sessiestatus (bijvoorbeeld voor een ASP.NET-toepassing) en voor caching.
ASP.NET sessiestatus is een geslaagde use case voor In-Memory OLTP. Met SQL Server stond één klant op het punt om 1,2 miljoen aanvragen per seconde te bereiken. Ondertussen zijn ze begonnen met het gebruik van In-Memory OLTP voor de cachebehoeften van alle toepassingen in de middellaag in de onderneming. Details: Hoe bwin SQL Server 2016 (13.x) gebruikt In-Memory OLTP om ongekende prestaties en schaal te bereiken
Implementatieoverwegingen
U kunt niet-duurzame tabellen die zijn geoptimaliseerd voor geheugen gebruiken als een eenvoudig sleutel-waardearchief door een BLOB op te slaan in een kolom varbinary(max). U kunt ook een semi-gestructureerde cache implementeren met JSON-ondersteuning in SQL Server en SQL Database. Ten slotte kunt u een volledige relationele cache maken via niet-duurzame tabellen met een volledig relationeel schema, waaronder verschillende gegevenstypen en beperkingen.
Aan de slag met het optimaliseren van geheugen ASP.NET sessiestatus met behulp van de scripts die zijn gepubliceerd op GitHub om de objecten te vervangen die zijn gemaakt door de ingebouwde SQL Server-sessiestatusprovider: aspnet-session-state
Casestudy van klanten
- bwin verhoogde doorvoer met ASP.NET sessiestatus nog verder en implementeerde een enterprise-wide mid-tier caching systeem, met In-Memory OLTP in SQL Server 2016 (13.x): How bwin is using SQL Server 2016 (13.x) In-Memory OLTP om ongekende prestaties en schaal te bereiken.
tempdb-objectvervanging
Gebruik niet-duurzame tabellen en tabeltypen die zijn geoptimaliseerd voor geheugen om uw traditionele tempdb structuren te vervangen, zoals tijdelijke tabellen, tabelvariabelen en parameters met tabelwaarden (TVP's).
Tabelvariabelen en niet-duurzame tabellen die zijn geoptimaliseerd voor geheugen, verminderen doorgaans de CPU en verwijderen logboek-I/O, in vergelijking met traditionele tabelvariabelen en #temp tabel.
Implementatieoverwegingen
Aan de slag: de prestaties van tijdelijke tabellen en tabellenvariabelen verbeteren met behulp van geheugenoptimalisatie.
Casestudy van klanten
- Eén klant kon de prestaties met 40%verbeteren, door traditionele TVP's te vervangen door op geheugen geoptimaliseerde TVPs: High Speed IoT Data Ingestion Using In-Memory OLTP in Azure
ETL (transformatiebelasting extraheren)
ETL-werkstromen omvatten vaak het laden van gegevens in een faseringstabel, transformaties van de gegevens en laden in de uiteindelijke tabellen.
Gebruik niet-duurzame tabellen die zijn geoptimaliseerd voor geheugen voor de fasering van gegevens. Ze verwijderen alle IO's volledig en maken gegevenstoegang efficiënter.
Implementatieoverwegingen
Als u transformaties uitvoert op de faseringstabel als onderdeel van de werkstroom, kunt u systeemeigen opgeslagen procedures gebruiken om deze transformaties te versnellen. Als u deze transformaties parallel kunt uitvoeren, profiteert u van extra schaalvoordelen van de geheugenoptimalisatie.
Voorbeeldscript
Voordat u In-Memory OLTP kunt gaan gebruiken, moet u een MEMORY_OPTIMIZED_DATA bestandsgroep maken. Daarnaast raden we u aan om databasecompatibiliteitsniveau 130 (of hoger) te gebruiken en de databaseoptie MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT in te stellen op AAN.
U kunt het script op de volgende locatie gebruiken om de bestandsgroep te maken in de standaardgegevensmap en de aanbevolen instellingen te configureren:
Het volgende voorbeeldscript illustreert In-Memory OLTP-objecten die u in uw database kunt maken.
Begin eerst met het configureren van de database voor In-Memory OLTP.
-- configure recommended DB option
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;
GO
U kunt tabellen met verschillende duurzaamheid maken:
-- 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
U kunt een tabeltype maken als een in-memory tabel.
-- 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
U kunt een systeemeigen gecompileerde opgeslagen procedure maken. Zie Systeemeigen gecompileerde opgeslagen procedures aanroepen vanuit Data Access-toepassingen voor meer informatie.
-- 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
Verwante inhoud
- In-Memory OLTP-technologieën voor snellere T-SQL-prestaties
- Voordelen van prestatie- en resourcegebruik van In-Memory OLTP in Azure SQL Database
- Prestaties van tijdelijke tabellen en tabellenvariabelen verbeteren met behulp van geheugenoptimalisatie
- Demonstratie: Prestatieverbetering van In-Memory OLTP
- Voorbeelddatabase voor In-Memory OLTP
- Demo met behulp van In-Memory OLTP vindt u op: in-memory-oltp-perf-demo-v1.0
- Video van 17 minuten waarin In-Memory OLTP wordt uitgelegd en de demo wordt weergegeven
- In-Memory OLTP-overzicht en gebruiksscenario's
- Prestaties optimaliseren met behulp van In-Memory Technologies in Azure SQL
- tijdelijke tabellenSystem-Versioned met Memory-Optimized tabellen
- De voor geheugen geoptimaliseerde bestandsgroep
- Script om In-Memory OLTP in te schakelen en aanbevolen opties in te stellen