演示:内存中 OLTP 的性能改进
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
本主题中的代码示例演示了内存优化表的快速性能。 从传统、已解释的 Transact-SQL 访问内存优化表中的数据时,此性能改进非常明显。 从本机编译存储过程 (NCSProc) 访问内存优化表中的数据时,此性能改进甚至更明显。
若要查看有关内存中 OLTP 潜在性能改进的更全面的演示,请参阅 In-Memory OLTP Performance Demo v1.0(内存中 OLTP 性能演示 v1.0)。
本文中的代码示例是单线程的,未能利用内存中 OLTP 的并发利益。 使用并发的工作负荷将带来更高的性能提升。 此代码示例仅显示性能改进的一个方面,即提高了针对插入的数据访问效率。
从 NCSProc 访问内存优化表中的数据时,将完全实现内存优化表提供的性能改进。
代码示例
以下各小节介绍了每个步骤。
步骤 1a:先决条件(如果使用 SQL Server)
此第一个小节中的步骤仅适用于在 SQL Server 中运行的情况,而不适用于在 Azure SQL 数据库中运行的情况。 请执行以下操作:
使用 SQL Server Management Studio (SSMS.exe) 连接到 SQL Server。 或也可使用任何类似于 SSMS.exe 的工具。
手动创建一个名为 C:\data 的目录。 示例 Transact-SQL 代码预期目录已预先存在。
运行短 T-SQL 以创建数据库及其内存优化的文件组。
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
步骤 1b:先决条件(如果使用 Azure SQL 数据库)
此小节仅适用于使用 Azure SQL 数据库的情况。 请执行以下操作:
决定将用于代码示例的现有测试数据库。
如果你决定创建一个新的测试数据库,请使用 Azure 门户 创建一个名为 imoltp的数据库。
如果需要有关使用 Azure 门户来实现这一操作的说明,请参阅 Azure SQL Database 入门。
步骤 2:创建内存优化表和 NCSProc
此步骤创建内存优化表和本机编译的存储过程 (NCSProc)。 请执行以下操作:
使用 SSMS.exe 连接到新的数据库。
在数据库中运行以下 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
步骤 3:运行代码
现在,你可以执行将演示内存优化表性能的查询。 请执行以下操作:
使用 SSMS.exe 在数据库中运行以下 T-SQL。
忽略此首次运行生成的任何速度数据或其他性能数据。 第一次运行确保执行几个仅完成一次的操作,如内存的初始分配。
同样,使用 SSMS.exe 在数据库中重新运行以下 T-SQL。
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
接下来是我们的第二次测试运行所生成的输出时间统计信息。
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.