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];
祝你好运。
我一直在阅读 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];
祝你好运。