当前位置: > 数据库 > SQL Server 2016 >

SQL Server 2016新特性: In-Memory OLTP

时间:2016-06-05 20:57来源:linux.it.net.cn 作者:IT

内存中OLTP有助于OLTP工作负荷实现显著的性能改进,并减少了处理时间。可以通过将表声明成“内存中优化”来启用内存中OLTP的功能。内存优化表完全支持事务,并且可以使用Transact-SQL进行访问。 Transact-SQL存储过程可以被编译成机器代码从而进一步提升内存优化表的性能。引擎针对高并发进行设计,并使阻塞最小化。

下面的示例(取自MSDN),展示了如何通过T-SQL创建memory-optimized filegroup、Memory-Optimized Tables,最终可以看到基于磁盘表和内存优化表之间的性能差异,及Native SP带来的进一步性能提升。

 

  1.  创建数据库,及其内存优化文件组(memory-optimized filegroup

 

[sql] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. CREATE DATABASE imoltp;     
  2. go  
  3.   
  4. ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod]  
  5.     CONTAINS MEMORY_OPTIMIZED_DATA;  
  6.   
  7. ALTER DATABASE imoltp ADD FILE  
  8.     (name = [imoltp_dir], filename= 'c:\data\imoltp_dir')  
  9.     TO FILEGROUP imoltp_mod;  
  10. go  
  11.   
  12. USE imoltp;  
  13. go  

 

 

2创建Memory-OptimizedTables, and NCSProc

 

 
  1. go  
  2. DROP PROCEDURE IF EXISTS ncsp;  
  3. DROP TABLE IF EXISTS sql;  
  4. DROP TABLE IF EXISTS hash_i;  
  5. DROP TABLE IF EXISTS hash_c;  
  6. go  
  7.   
  8. CREATE TABLE [dbo].[sql] (  
  9.   c1 INT NOT NULL PRIMARY KEY,  
  10.   c2 NCHAR(48) NOT NULL  
  11. );  
  12. go  
  13.   
  14. CREATE TABLE [dbo].[hash_i] (  
  15.   c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),  
  16.   c2 NCHAR(48) NOT NULL  
  17. WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);  
  18. go  
  19.   
  20. CREATE TABLE [dbo].[hash_c] (  
  21.   c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),  
  22.   c2 NCHAR(48) NOT NULL  
  23. WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);  
  24. go  
  25.   
  26. CREATE PROCEDURE ncsp  
  27.     @rowcount INT,  
  28.     @c NCHAR(48)  
  29.   WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
  30.   AS   
  31.   BEGIN ATOMIC   
  32.   WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
  33.   DECLARE @i INT = 1;  
  34.   WHILE @i <= @rowcount  
  35.   BEGIN;  
  36.     INSERT INTO [dbo].[hash_c] VALUES (@i, @c);  
  37.     SET @i += 1;  
  38.   END;  
  39. END;  
  40. Go  

 

 

3执行下面的T-SQL,可看到内存优化表的性能状况

 

 
  1. go  
  2. SET STATISTICS TIME OFF;  
  3. SET NOCOUNT ON;  
  4.   
  5. -- Inserts, one at a time.  
  6.   
  7. DECLARE @starttime DATETIME2 = sysdatetime();  
  8. DECLARE @timems INT;  
  9. DECLARE @i INT = 1;  
  10. DECLARE @rowcount INT = 1000000;  
  11. DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678';  
  12.   
  13. -- Harddrive-based table and interpreted Transact-SQL.  
  14.   
  15. BEGIN TRAN;  
  16.   WHILE @i <= @rowcount  
  17.   BEGIN;  
  18.     INSERT INTO [dbo].[sql] VALUES (@i, @c);  
  19.     SET @i += 1;  
  20.   END;  
  21. COMMIT;  
  22.   
  23. SET @timems = datediff(ms, @starttime, sysdatetime());  
  24. SELECT 'A: Disk-based table and interpreted Transact-SQL: '  
  25.     + cast(@timems AS VARCHAR(10)) + ' ms';  
  26.   
  27. -- Interop Hash.  
  28.   
  29. SET @i = 1;  
  30. SET @starttime = sysdatetime();  
  31.   
  32. BEGIN TRAN;  
  33.   WHILE @i <= @rowcount  
  34.     BEGIN;  
  35.       INSERT INTO [dbo].[hash_i] VALUES (@i, @c);  
  36.       SET @i += 1;  
  37.     END;  
  38. COMMIT;  
  39.   
  40. SET @timems = datediff(ms, @starttime, sysdatetime());  
  41. SELECT 'B: memory-optimized table with hash index and interpreted Transact-SQL: '  
  42.     + cast(@timems as VARCHAR(10)) + ' ms';  
  43.   
  44. -- Compiled Hash.  
  45.   
  46. SET @starttime = sysdatetime();  
  47.   
  48. EXECUTE ncsp @rowcount, @c;  
  49.   
  50. SET @timems = datediff(ms, @starttime, sysdatetime());  
  51. SELECT 'C: memory-optimized table with hash index and native SP:'  
  52.     + cast(@timems as varchar(10)) + ' ms';  
  53. go  
  54.   
  55. DELETE sql;  
  56. DELETE hash_i;  
  57. DELETE hash_c;  
  58. go  

 

 

执行结果:



 

(责任编辑:IT)
------分隔线----------------------------