sql >> Database >  >> RDS >> Access

In-memory OLTP-databases en -tabellen maken en openen

Dit is het tweede artikel in een reeks artikelen over SQL Server In-Memory OLTP.

Het inleidende artikel — SQL Server In-Memory OLTP, introduceerde kort de basis van de nieuwe Hekaton-engine. In dit deel richten we ons op de praktijk. Om specifieker te zijn, zullen we zien hoe u in-Memory geoptimaliseerde databases en tabellen kunt maken, en ook hoe u deze kunt beoordelen met behulp van T-SQL.

Vereisten om voor geheugen geoptimaliseerde databases te gaan gebruiken

In-memory OLTP wordt automatisch geïnstalleerd met een 64-bits Enterprise- of Developer-editie van SQL Server 2014 of SQL Server 2016. SQL Server 32-bits editie biedt geen In-Memory OLTP-componenten.

Als u dus de 64-bits Developer-editie van SQL Server op uw computer hebt geïnstalleerd, kunt u beginnen met het maken van databases en gegevensstructuren waarin voor het geheugen geoptimaliseerde gegevens worden opgeslagen zonder extra instellingen.

Elke database die voor geheugen geoptimaliseerde tabellen gaat bevatten, moet één MEMORY_OPTIMIZED_DATA bestandsgroep bevatten. Deze bestandsgroep bevat een of meerdere containers. Elke afzonderlijke container slaat gegevens en/of deltabestanden op. SQL Server gebruikt deze bestanden om de voor geheugen geoptimaliseerde tabellen te herstellen. Containers kunnen op de verschillende schijfarrays worden geplaatst,
vergelijkbaar met FILESTREAM-bestandsgroepen.

De syntaxis voor het maken van een voor geheugen geoptimaliseerde bestandsgroep is bijna hetzelfde als voor een traditionele FILESTREAM-bestandsgroep, met de verschillende verschillen:

  1. Er kan slechts één voor geheugen geoptimaliseerde bestandsgroep worden gemaakt voor een database.
  2. De optie CONTAINS MEMORY_OPTIMIZED_DATA moet expliciet worden opgegeven.

U kunt de bestandsgroep maken tijdens het maken van een database:

CREATE DATABASE InMemoryDemo
ON PRIMARY
(
NAME = N'InMemoryDemo',
FILENAME = N'D:\Data\InMemoryOLTPDemo.mdf'
),
FILEGROUP IMOFG CONTAINS MEMORY_OPTIMIZED_DATA
(
NAME = N'InMemoryDemo_Data',
FILENAME = N'D:\IMOFG\InMemoryDemo_Data.mdf'
)

U kunt ook de bestandsgroep MEMORY_OPTIMIZED_DATA toevoegen aan een bestaande database en vervolgens bestanden aan die bestandsgroep toevoegen.

-- Adding the containers
ALTER DATABASE
  DemoDB ADD FILE
  (
  NAME = 'DemoDB_Mod',
  FILENAME = 'D:\Data\DemoDB_Mod'
  )
  TO FILEGROUP DemoDB_Mod

Intern gebruikt In-Memory OLTP een streamingmechanisme op basis van de FILESTREAM-technologie, dat goed is aangepast voor sequentiële I/O-toegang.

Voor het geheugen geoptimaliseerde tabellen maken

Nu hebben we alles wat we nodig hebben om voor geheugen geoptimaliseerde objecten te maken. Laten we een voor geheugen geoptimaliseerde tabel maken.

De syntaxis voor het maken van in het geheugen geoptimaliseerde tabellen lijkt sterk op die voor het maken van op schijf gebaseerde tabellen. Er zijn echter een paar uitbreidingen en beperkingen:

  1. De clausule MEMORY_OPTIMIZED =ON identificeert een tabel als geoptimaliseerd in het geheugen.
  2. In-memory-geoptimaliseerde tabellen ondersteunen niet alle gegevenstypen die traditionele tabellen ondersteunen. De volgende gegevenstypen worden niet ondersteund:
  • datetimeoffset
  • geografie
  • geometrie
  • hiërarchie
  • rijversie
  • XML
  • sql_variant
  • Door de gebruiker gedefinieerde typen

Er kan een voor geheugen geoptimaliseerde tabel worden gemaakt met de volgende duurzaamheidswaarden:SCHEMA_AND_DATA of SCHEMA_ONLY. SCHEMA_AND_DATA is de standaardwaarde.
Als u SCHEMA_ONLY opgeeft, worden alle wijzigingen aan de tabel niet geregistreerd en worden de tabelgegevens niet op de schijf opgeslagen.

Elke tabel met geoptimaliseerd geheugen moet ten minste één index bevatten. Merk op dat de PRIMARY KEY-beperking impliciet een index creëert. Een duurzame tabel met geoptimaliseerd geheugen vereist altijd een PRIMARY KEY-beperking.

CREATE TABLE dbo.Person (
  [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED
 ,[City] VARCHAR(32) NULL
 ,[Country] VARCHAR(32) NULL
 ,[State_Province] VARCHAR(32) NULL
 ,[LastModified] DATETIME NOT NULL
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);

Сsamengestelde indexen kunnen worden toegevoegd wanneer alle kolommen zijn gemaakt:

CREATE TABLE dbo.Person (
  [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED
 ,[City] VARCHAR(32) NULL
 ,[Country] VARCHAR(32) NULL
 ,[State_Province] VARCHAR(32) NULL
 ,[LastModified] DATETIME NOT NULL
 ,INDEX T1_INDX_C1C2 NONCLUSTERED ([Name], [City])
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);

Wanneer u de in-memory geoptimaliseerde tabel maakt, maakt de In-Memory OLTP-engine DML-routines om toegang te krijgen tot die tabel. Het laadt routines als DLL-bestanden. Voor een specifieke bewerking roept SQL Server een vereist DLL-bestand aan.

Tabellen en indexen wijzigen

Vóór SQL Server 2016 was het onmogelijk om tabellen te WIJZIGEN. Om schemawijzigingen aan te brengen, moest u de tabel in het geheugen verwijderen en opnieuw maken.

In de nieuwe release van SQL Server wordt ALTER TABLE gedeeltelijk ondersteund.

SQL Server 2016 biedt u de mogelijkheid om offline bewerkingen uit te voeren:kolommen, indexen en beperkingen toevoegen en verwijderen (wijzigen). Het is nu ook mogelijk om met tabellen in het geheugen te werken met behulp van de SSMS-tabelontwerper of dbForge Studio voor SQL Server-tabeleditor.

Merk op dat ALTER TABLE het opnieuw opbouwen van de tabel vereist. Daarom moet u er zeker van zijn dat u voldoende geheugen hebt voordat u deze bewerking uitvoert. Tijdens de herbouwbewerking wordt elke afzonderlijke rij opnieuw in de nieuwe tabel ingevoegd en is de tabel niet beschikbaar terwijl de ALTER-bewerking wordt uitgevoerd.

U kunt meerdere wijzigingen aanbrengen in een enkele tabel en deze combineren in een enkele ALTER TABLE-instructie. U kunt kolommen, indexen en beperkingen TOEVOEGEN en u kunt kolommen, indexen en beperkingen DROPPEN. Houd er rekening mee dat u de ADD- en DROP-commando's niet kunt combineren in een enkele ALTER TABLE.

-- index operations
-- change hash index bucket count
ALTER TABLE dbo.TableName ALTER INDEX IX_Name REBUILD WITH (BUCKET_COUNT = 131072);
GO
-- add index
ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName);
GO
-- drop index
ALTER TABLE dbo.TableName DROP INDEX IX_Name;
GO
-- add multiple indexes
ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName),
 INDEX IX_Name2 NONCLUSTERED (ColName2);
GO
-- Add a new column and an index 
ALTER TABLE dbo.TableName ADD Date DATETIME, INDEX IX_Name NONCLUSTERED (ColName);
GO
-- Drop a column
ALTER TABLE dbo.TableName DROP COLUMN ColName;
GO

Tabeltypen en tabelvariabelen

SQL Server 2016 biedt u de mogelijkheid om voor geheugen geoptimaliseerde tabeltypen te maken die u kunt gebruiken bij het definiëren van een tabelvariabele:

CREATE TYPE TypeName
AS TABLE (
Col1 SMALLINT NOT NULL,
Col2 INT NOT NULL,
Col3 INT NOT NULL,
Col4 INT NOT NULL,
INDEX IX_Col1 NONCLUSTERED HASH (Col1)
WITH (BUCKET_COUNT = 131072),
INDEX IX_Col1 NONCLUSTERED (Col2))
WITH (MEMORY_OPTIMIZED = ON);
GO
DECLARE @VariableName TypeName;
GO

Deze variabele wordt alleen in het geheugen opgeslagen. In-memory geoptimaliseerde tabellen en tabeltypen gebruiken dezelfde gegevensstructuren, dus de gegevenstoegang zal efficiënter zijn in vergelijking met schijfgebaseerde tabelvariabelen.

Raadpleeg de volgende MSDN-blogpost voor meer informatie:Verbetering van de prestaties van tijdelijke tabellen en tabelvariabelen met behulp van geheugenoptimalisatie

Samenvatting

De In-Memory OLTP is een relatief jonge technologie die is ontworpen om te werken met enorme en zeer drukke OLTP-systemen die honderden of zelfs duizenden gelijktijdige gebruikers ondersteunen. Het werd geïntroduceerd in SQL Server 2014 en evolueerde in SQL Server 2016.
Tegelijk bevat de technologie een aantal beperkingen en beperkingen.
Niet alle T-SQL-functies en gegevenstypen worden ondersteund door geheugen- geoptimaliseerde tabellen, dergelijke tabellen mogen geen rijen bevatten die groter zijn dan 8060 bytes, en bieden ook geen ondersteuning voor
ROW-OVERFLOW en LOB-opslag. U kunt tabellen en indexen (in SQL Server 2014) niet meer wijzigen als de tabel eenmaal is gemaakt.
Desondanks verwachten we dat verdere versies van In-Memory OLTP minder beperkingen zullen hebben!

Lees ook:

Indexen gebruiken in voor geheugen geoptimaliseerde tabellen voor SQL Server


  1. Hoe kan ik twee MySQL-tabellen samenvoegen?

  2. Een tabel maken in MySQL

  3. Is het mogelijk om een ​​enkele query in orakel te beëindigen zonder de sessie te beëindigen?

  4. Hoe een reeks te maken als deze niet bestaat