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:
- Der kan kun oprettes én hukommelsesoptimeret filgruppe til en database.
- 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:
- MEMORY_OPTIMIZED =ON-udtrykket identificerer en tabel som optimeret i hukommelsen.
- 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