SQL Server笔记 -- 第68章:内存中 OLTP(Hekaton)

68.1 声明内存优化表变量

为获得更高性能,可将表变量改为内存优化。传统表变量示例:

sql 复制代码
DECLARE @tvp TABLE (
  col1 INT NOT NULL,
  col2 CHAR(10)
);

使用内存优化版本,需先创建内存优化表类型,再声明变量:

sql 复制代码
CREATE TYPE dbo.memTypeTable AS TABLE (
  Col1 INT NOT NULL INDEX ix1,
  Col2 CHAR(10)
) WITH (MEMORY_OPTIMIZED = ON);
GO

DECLARE @tvp memTypeTable;
INSERT INTO @tvp VALUES (1,'1'),(2,'2'),(3,'3'),(4,'4'),(5,'5'),(6,'6');
SELECT * FROM @tvp;

68.2 创建内存优化表

sql 复制代码
-- 创建示例数据库
CREATE DATABASE SQL2016_Demo
ON PRIMARY (
  NAME = N'SQL2016_Demo',
  FILENAME = N'C:\Dump\SQL2016_Demo.mdf',
  SIZE = 5120KB,
  FILEGROWTH = 1024KB
)
LOG ON (
  NAME = N'SQL2016_Demo_log',
  FILENAME = N'C:\Dump\SQL2016_Demo_log.ldf',
  SIZE = 1024KB,
  FILEGROWTH = 10%
);
GO

USE SQL2016_Demo;
GO

-- 添加内存优化文件组
ALTER DATABASE SQL2016_Demo
ADD FILEGROUP MemFG CONTAINS MEMORY_OPTIMIZED_DATA;
GO

-- 向文件组添加文件
ALTER DATABASE SQL2016_Demo
ADD FILE (
  NAME = MemFG_File1,
  FILENAME = N'C:\Dump\MemFG_File1'
) TO FILEGROUP MemFG;
GO

-- 创建内存优化表(持久性可选 SCHEMA_AND_DATA 或 SCHEMA_ONLY)
CREATE TABLE dbo.MemOptTable1 (
  Column1 INT NOT NULL,
  Column2 NVARCHAR(4000) NULL,
  SpidFilter SMALLINT NOT NULL DEFAULT (@@spid),
  INDEX ix_SpidFilter NONCLUSTERED (SpidFilter),
  INDEX ix_SpidFilter HASH (SpidFilter) WITH (BUCKET_COUNT = 64),
  CONSTRAINT CHK_soSessionC_SpidFilter CHECK (SpidFilter = @@spid)
) WITH (
  MEMORY_OPTIMIZED = ON,
  DURABILITY = SCHEMA_AND_DATA
);
GO

CREATE TABLE MemOptTable2 (
  ID INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 10000),
  FullName NVARCHAR(200) NOT NULL,
  DateAdded DATETIME NOT NULL
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO

68.3 查看生成的 DLL 文件与内存优化表

sql 复制代码
SELECT OBJECT_ID('MemOptTable1') AS MemOptTable1_ObjectID,
       OBJECT_ID('MemOptTable2') AS MemOptTable2_ObjectID;
GO

SELECT name, description
FROM sys.dm_os_loaded_modules
WHERE name LIKE '%XTP%';
GO

-- 列出所有内存优化表
SELECT name, type_desc, durability_desc, is_memory_optimized
FROM sys.tables
WHERE is_memory_optimized = 1;
GO

68.4 创建内存优化的系统版本化时态表

sql 复制代码
CREATE TABLE dbo.MemOptimizedTemporalTable (
  BusinessDocNo BIGINT NOT NULL,
  ProductCode INT NOT NULL,
  UnitID TINYINT NOT NULL,
  PriceID TINYINT NOT NULL,
  SysStartTime DATETIME2(7) GENERATED ALWAYS AS ROW START NOT NULL,
  SysEndTime DATETIME2(7) GENERATED ALWAYS AS ROW END NOT NULL,
  PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),
  CONSTRAINT PK_MemOptimizedTemporalTable PRIMARY KEY NONCLUSTERED (
    BusinessDocNo ASC,
    ProductCode ASC
  )
) WITH (
  MEMORY_OPTIMIZED = ON,
  DURABILITY = SCHEMA_AND_DATA,
  SYSTEM_VERSIONING = ON (
    HISTORY_TABLE = History.MemOptimizedTemporalTable_History,
    DATA_CONSISTENCY_CHECK = ON
  )
);

68.5 内存优化表类型与临时表

传统表类型:

sql 复制代码
CREATE TYPE dbo.testTableType AS TABLE (
  col1 INT NOT NULL,
  col2 CHAR(10)
);

内存优化表类型(需加索引):

sql 复制代码
CREATE TYPE dbo.testTableType AS TABLE (
  col1 INT NOT NULL,
  col2 CHAR(10),
  INDEX ix NONCLUSTERED (col1)
) WITH (MEMORY_OPTIMIZED = ON);

全局临时表:

sql 复制代码
CREATE TABLE ##tempGlobalTable (
  Col1 INT NOT NULL,
  Col2 NVARCHAR(4000)
);

对应的内存优化版本(使用 SCHEMA_ONLY 持久性):

sql 复制代码
CREATE TABLE dbo.tempGlobalTable (
  Col1 INT NOT NULL INDEX ix NONCLUSTERED,
  Col2 NVARCHAR(4000)
) WITH (
  MEMORY_OPTIMIZED = ON,
  DURABILITY = SCHEMA_ONLY
);

迁移步骤:

  1. 按相同架构新建 SCHEMA_ONLY 内存优化表,并至少建一个索引
  2. 将代码中对 ##temp 的引用改为新表名
  3. 把 DROP TABLE ##temp 改为 DELETE FROM 新表 以清空数据
  4. 移除原 CREATE TABLE ##temp 语句
相关推荐
java能飞翔2 小时前
在CentOS环境下修改mysql密码
sql
winfreedoms2 小时前
ROS2机械臂——黑马程序员ROS2课程上课笔记(3)
arm开发·笔记
山岚的运维笔记2 小时前
SQL Server笔记 -- 第67章:数据库邮件(DBMAIL)
数据库·笔记·sql·microsoft·sqlserver
kylezhao20193 小时前
C#异步和并发在IO密集场景的典型应用 async/await
开发语言·数据库·c#
菩提小狗3 小时前
第15天:信息打点-主机架构&蜜罐识别&WAF识别&端口扫描&协议识别&服务安全_笔记|小迪安全2023-2024|web安全|渗透测试|
笔记·安全·架构
野犬寒鸦3 小时前
ArrayList扩容机制深度解析(附时序图详细讲解)
java·服务器·数据结构·数据库·windows·后端
心本无晴.4 小时前
LangGraph 进阶指南:从状态机到生产级多智能体架构的全面进化
linux·windows·microsoft
专注VB编程开发20年4 小时前
c# CSRedisCore vb.net清空所有键值
数据库·oracle
程序边界4 小时前
数据库MySQL兼容版权限隔离深度体验:从兼容到安全增强的实战之路
数据库·mysql·安全