Sql 服务器内存中的 OLTP table 用于系统版本表

Sql Server In memory OLTP table for System Versioned Tables

我一直在阅读 SQL Server 2016 中的内存中 OLTP 表,并想尝试一下。

但是,所有被识别为高 gain/Low 迁移工作的 table 都是系统版本控制的 table。当我右键单击系统版本 table 时,我没有看到为内存优化启用它的选项,但我在非系统版本 table 上看到了相同的选项。

我读到可以将历史记录 table 保留在磁盘中,只将主要的 table 迁移到内存中。有没有人这样做过?或者有没有 link 我错过了描述如何实现的?

假设您有内存 table 和一些数据:

CREATE TABLE [dbo].[Whosebug]
(
    [ID] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1024)
   ,[Name] VARCHAR(128) NOT NULL
 ) WITH (MEMORY_OPTIMIZED = ON)
GO

INSERT INTO [dbo].[Whosebug] ([ID], [Name])
VALUES (1, 'Raul')
      ,(2, 'Mike');

GO

然后,我们将使其成为时间性的,但历史 table 将被指定为正常 table:

ALTER TABLE [dbo].[Whosebug]   
ADD [SysStartTime] DATETIME2(0) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT [DF_Whosebug_SysStart] DEFAULT SYSUTCDATETIME()  
   ,[SysEndTime] DATETIME2(0) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT [DF_Whosebug_SysEnd] DEFAULT CONVERT(DATETIME2 (0), '9999-12-31 23:59:59')
   ,PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]);   
GO

CREATE TABLE [dbo].[WhosebugLog]
(
    [ID] INT NOT NULL
   ,[Name] VARCHAR(128) NOT NULL
   ,[SysStartTime] DATETIME2(0) NOT NULL
   ,[SysEndTime] DATETIME2(0) NOT NULL
 )
GO

ALTER TABLE [dbo].[Whosebug]   
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[WhosebugLog])); 

添加一些新记录,修改现有记录:

UPDATE [dbo].[Whosebug]
SET [Name] = 'Zidane'
WHERE [ID] = 1;

INSERT INTO [dbo].[Whosebug] ([ID], [Name])
VALUES (3, 'Tervel');

检查发生了什么:

SELECT *
     ,[SysStartTime]
     ,[SysEndTime]
FROM [dbo].[Whosebug] FOR SYSTEM_TIME ALL
ORDER BY [ID], [SysStartTime];

您可以使用以下查询来确认您的日志 table 不在内存中:

SELECT T.[name]
      ,T.[is_memory_optimized]
FROM [sys].[tables] T
WHERE T.[name] IN ('Whosebug', 'WhosebugLog')
    AND T.[schema_id] = SCHEMA_ID('dbo');

清除演示对象,现在:

DROP TABLE IF EXISTS [dbo].[WhosebugLog];
DROP TABLE IF EXISTS [dbo].[Whosebug];

祝你好运。