sql >> Database teknologi >  >> RDS >> Access

Oprettelse og adgang til OLTP-databaser og tabeller i hukommelsen

Dette er den anden artikel i en serie af artikler om SQL Server In-Memory OLTP.

Den indledende artikel - SQL Server In-Memory OLTP introducerede kort det grundlæggende i den nye Hekaton-motor. I denne del vil vi fokusere på praksis. For at være mere specifik vil vi se, hvordan man opretter In-Memory-optimerede databaser og tabeller, og også hvordan man vurderer dem ved hjælp af T-SQL.

Forudsætninger for at begynde at bruge hukommelsesoptimerede databaser

In-memory OLTP installeres automatisk med en 64-bit Enterprise- eller Developer-udgave af SQL Server 2014 eller SQL Server 2016. SQL Server 32-bit-udgaven leverer ikke In-Memory OLTP-komponenter.

Så hvis du har 64-bit udviklerudgave af SQL Server installeret på din computer, kan du begynde at oprette databaser og datastrukturer, der gemmer hukommelsesoptimerede data uden tilføjelsesopsætning.

Hver enkelt database, der skal indeholde hukommelsesoptimerede tabeller, bør indeholde én MEMORY_OPTIMIZED_DATA filgruppe. Denne filgruppe indeholder en eller flere containere. Hver enkelt container gemmer data og/eller deltafiler. SQL Server bruger disse filer til at gendanne de hukommelsesoptimerede tabeller. Containere kan placeres på de forskellige disk-arrays,
på samme måde som FILESTREAM-filgrupper.

Syntaksen for at skabe hukommelsesoptimeret filgruppe er næsten den samme som for en traditionel FILESTREAM filgruppe, med flere forskelle:

  1. Der kan kun oprettes én hukommelsesoptimeret filgruppe til en database.
  2. Indstillingen CONTAINS MEMORY_OPTIMIZED_DATA skal angives eksplicit.

Du kan oprette filgruppen i processen med at oprette en 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'
)

Alternativt kan du tilføje MEMORY_OPTIMIZED_DATA filgruppen til en eksisterende database og derefter tilføje filer til denne filgruppe.

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

Internt bruger In-Memory OLTP en streaming-mekanisme baseret på FILESTREAM-teknologien, som er godt tilpasset til sekventiel I/O-adgang.

Oprettelse af hukommelsesoptimerede tabeller

Nu har vi alt, hvad vi behøver for at begynde at skabe hukommelsesoptimerede objekter. Lad os oprette en hukommelsesoptimeret tabel.

Syntaksen til oprettelse af in-memory-optimerede tabeller er meget lig en til oprettelse af diskbaserede tabeller. Der er dog et par udvidelser og begrænsninger:

  1. MEMORY_OPTIMIZED =ON-udtrykket identificerer en tabel som optimeret i hukommelsen.
  2. In-memory-optimerede tabeller understøtter ikke alle de datatyper, som traditionelle tabeller understøtter. Følgende datatyper understøttes ikke:
  • datotidsforskydning
  • geografi
  • geometri
  • hierarchyid
  • rowversion
  • XML
  • sql_variant
  • Brugerdefinerede typer

En hukommelsesoptimeret tabel kan oprettes med følgende holdbarhedsværdier:SCHEMA_AND_DATA eller SCHEMA_ONLY. SCHEMA_AND_DATA er standardværdien.
Hvis du angiver SCHEMA_ONLY, vil alle ændringer i tabellen ikke blive logget, og tabeldataene gemmes ikke på disken.

Hver enkelt hukommelsesoptimeret tabel skal indeholde mindst ét ​​indeks. Bemærk, at PRIMARY KEY-begrænsningen implicit opretter et indeks. En holdbar hukommelsesoptimeret tabel kræver altid en PRIMARY KEY-begrænsning.

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);

Sammensatte indekser kan tilføjes, når alle kolonner er oprettet:

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);

Når du opretter den in-memory-optimerede tabel, opretter In-Memory OLTP-motoren DML-rutiner for at få adgang til den tabel. Den indlæser rutiner som DLL-filer. For en specifik handling kalder SQL Server en påkrævet DLL-fil.

Ændring af tabeller og indekser

Det var umuligt at ÆNDRE tabeller før SQL Server 2016. For at lave skemaændringer var du nødt til at droppe og genskabe tabellen i hukommelsen.

I den nye udgivelse af SQL Server er ALTER TABLE delvist understøttet.

SQL Server 2016 giver dig mulighed for at udføre off-line operationer:tilføje og slette (ændre) kolonner, indekser og begrænsninger. Det er nu også muligt at arbejde med tabeller i hukommelsen ved at bruge SSMS-tabeldesigneren eller dbForge Studio til SQL Server-tabeleditor.

Bemærk at ALTER TABLE kræver ombygning af tabellen. Det er derfor, du skal være sikker på, at du har nok hukommelse, før du udfører denne operation. Under genopbygningen genindsættes hver enkelt række i den nye tabel, og tabellen er ikke tilgængelig, mens ALTER-handlingen udføres.

Du kan indføre flere ændringer i en enkelt tabel og kombinere dem i en enkelt ALTER TABLE-sætning. Du kan TILFØJE kolonner, indekser og begrænsninger, og du kan FRA kolonner, indekser og begrænsninger. Bemærk, at du ikke kan kombinere ADD og DROP kommandoer sammen i en enkelt 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

Tabeltyper og tabelvariabler

SQL Server 2016 giver dig mulighed for at oprette hukommelsesoptimerede tabeltyper, som du kan bruge, mens du definerer en tabelvariabel:

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

Denne variabel gemmes kun i hukommelsen. In-memory-optimerede tabeller og tabeltyper bruger de samme datastrukturer, så dataadgangen bliver mere effektiv sammenlignet med diskbaserede tabelvariabler.

For flere detaljer henvises til følgende MSDN blogindlæg:Forbedring af temperaturtabel og tabelvariabel ydeevne ved hjælp af hukommelsesoptimering

Oversigt

In-Memory OLTP er en relativt ung teknologi, der er designet til at fungere med enorme og meget travle OLTP-systemer, der understøtter hundredvis eller endda tusindvis af samtidige brugere. Den blev introduceret i SQL Server 2014 og udviklet sig i SQL Server 2016.
Samtidig indeholder teknologien en række restriktioner og begrænsninger.
Ikke alle T-SQL-funktioner og datatyper understøttes af hukommelse- optimerede tabeller, sådanne tabeller kan ikke indeholde rækker, der overstiger 8060 bytes, og understøtter heller ikke
ROW-OVERFLOW og LOB-lagring. Du kan ikke ændre tabeller og indekser (i SQL Server 2014), når først tabellen er oprettet.
På trods af dette forventer vi, at yderligere versioner af In-Memory OLTP vil have færre begrænsninger!

Læs også:

Brug af indekser i SQL Server-hukommelsesoptimerede tabeller


  1. mysqli:kan det forberede flere forespørgsler i en erklæring?

  2. Fra Stored Procedure returnerer du OUT parameter &OUT cursor &parse resultat (Oracle)

  3. Guide til design af database til lagerstyringssystem i MySQL

  4. SQL:slet alle data fra alle tilgængelige tabeller