Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Ukázka kódu v tomto tématu ukazuje rychlý výkon tabulek optimalizovaných pro paměť. Zlepšení výkonu je zřejmé, když se k datům v tabulce optimalizované pro paměť přistupuje z tradičního interpretovaného jazyka Transact-SQL. Toto zlepšení výkonu je ještě větší, když se k datům v tabulce optimalizované pro paměť přistupuje z nativně zkompilované uložené procedury (NCSProc).
Podrobnější ukázku potenciálních vylepšení výkonu In-Memory OLTP najdete v In-Memory OLTP Ukázka výkonu v1.0.
Příklad kódu v tomto článku je jednovláknový a nevyužívá výhody souběžnosti In-Memory OLTP. Úloha, která používá souběžnost, uvidí vyšší zvýšení výkonu. Příklad kódu ukazuje pouze jeden aspekt zlepšení výkonu, konkrétně efektivitu přístupu k datům pro INSERT.
Zlepšení výkonu nabízené tabulkami optimalizovanými pro paměť je plně realizováno, když se k datům v tabulce optimalizované pro paměť přistupuje z NCSProc.
Příklad kódu
Jednotlivé kroky popisují následující pododdíly.
Krok 1a: Předpoklad, pokud používáte SQL Server
Kroky v této první pododdíle platí jenom v případě, že používáte SQL Server a neplatí, pokud používáte Azure SQL Database. Postupujte následovně:
K připojení k SQL Serveru použijte SQL Server Management Studio (SSMS.exe). Nebo jakýkoli nástroj podobný SSMS.exe je v pořádku.
Ručně vytvořte adresář S názvem C:\data\. Ukázkový Transact-SQL kód očekává, že adresář už existuje.
Spuštěním krátkého T-SQL vytvořte databázi a její skupinu souborů optimalizovanou pro paměť.
go
CREATE DATABASE imoltp; -- Transact-SQL
go
ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod]
CONTAINS MEMORY_OPTIMIZED_DATA;
ALTER DATABASE imoltp ADD FILE
(name = [imoltp_dir], filename= 'c:\data\imoltp_dir')
TO FILEGROUP imoltp_mod;
go
USE imoltp;
go
Krok 1b: Předpoklad, pokud používáte Azure SQL Database
Tato pododdíl platí jenom v případě, že používáte Azure SQL Database. Postupujte následovně:
Rozhodněte se, kterou existující testovací databázi použijete pro příklad kódu.
Pokud se rozhodnete vytvořit novou testovací databázi, vytvořte pomocí webu Azure Portal databázi s názvem imoltp.
Pokud chcete pokyny k použití webu Azure Portal pro tento postup, přečtěte si téma Začínáme se službou Azure SQL Database.
Krok 2: Vytvoření tabulek Memory-Optimized a NCSProc
Tento krok vytvoří tabulky optimalizované pro paměť a nativně zkompilovanou uloženou proceduru (NCSProc). Postupujte následovně:
Pomocí SSMS.exe se připojte k nové databázi.
V databázi spusťte následující příkaz T-SQL.
go
DROP PROCEDURE IF EXISTS ncsp;
DROP TABLE IF EXISTS sql;
DROP TABLE IF EXISTS hash_i;
DROP TABLE IF EXISTS hash_c;
go
CREATE TABLE [dbo].[sql] (
c1 INT NOT NULL PRIMARY KEY,
c2 NCHAR(48) NOT NULL
);
go
CREATE TABLE [dbo].[hash_i] (
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
c2 NCHAR(48) NOT NULL
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);
go
CREATE TABLE [dbo].[hash_c] (
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
c2 NCHAR(48) NOT NULL
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);
go
CREATE PROCEDURE ncsp
@rowcount INT,
@c NCHAR(48)
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
DECLARE @i INT = 1;
WHILE @i <= @rowcount
BEGIN;
INSERT INTO [dbo].[hash_c] VALUES (@i, @c);
SET @i += 1;
END;
END;
go
Krok 3: Spuštění kódu
Teď můžete spouštět dotazy, které demonstrují výkon tabulek optimalizovaných pro paměť. Postupujte následovně:
Pomocí SSMS.exe spusťte v databázi následující jazyk T-SQL.
Ignorujte veškerá rychlost nebo jiná data o výkonu, která tato první spuštění vygeneruje. První spuštění zajistí provedení několika jednorázových operací, jako jsou počáteční přidělení paměti.
Znovu použijte SSMS.exe k opětovnému spuštění následujícího T-SQL ve vaší databázi.
go
SET STATISTICS TIME OFF;
SET NOCOUNT ON;
-- Inserts, one at a time.
DECLARE @starttime DATETIME2 = sysdatetime();
DECLARE @timems INT;
DECLARE @i INT = 1;
DECLARE @rowcount INT = 100000;
DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678';
-- Harddrive-based table and interpreted Transact-SQL.
BEGIN TRAN;
WHILE @i <= @rowcount
BEGIN;
INSERT INTO [dbo].[sql] VALUES (@i, @c);
SET @i += 1;
END;
COMMIT;
SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT 'A: Disk-based table and interpreted Transact-SQL: '
+ cast(@timems AS VARCHAR(10)) + ' ms';
-- Interop Hash.
SET @i = 1;
SET @starttime = sysdatetime();
BEGIN TRAN;
WHILE @i <= @rowcount
BEGIN;
INSERT INTO [dbo].[hash_i] VALUES (@i, @c);
SET @i += 1;
END;
COMMIT;
SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT 'B: memory-optimized table with hash index and interpreted Transact-SQL: '
+ cast(@timems as VARCHAR(10)) + ' ms';
-- Compiled Hash.
SET @starttime = sysdatetime();
EXECUTE ncsp @rowcount, @c;
SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT 'C: memory-optimized table with hash index and native SP:'
+ cast(@timems as varchar(10)) + ' ms';
go
DELETE sql;
DELETE hash_i;
DELETE hash_c;
go
Dále jsou statistiky výstupního času vygenerované naším druhým testovacím spuštěním.
10453 ms , A: Disk-based table and interpreted Transact-SQL.
5626 ms , B: memory-optimized table with hash index and interpreted Transact-SQL.
3937 ms , C: memory-optimized table with hash index and native SP.