我一直在阅读有关SQL Server 2016中的内存中OLTP表的信息,并想尝试一下。
但是,所有标识为“高收益/低迁移工作量”的表都是系统版本的表。当我右键单击系统版本的表时,看不到启用它进行内存优化的选项,但在非系统版本表上也看到了相同的选项。
我读到有可能将历史记录表保留在磁盘中,而仅将主表迁移到内存中。有人这样做吗?还是我错过了任何描述该如何实现的链接?
答案 0 :(得分:0)
假设您有内存表和其中的一些数据:
CREATE TABLE [dbo].[StackOverflow]
(
[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].[StackOverflow] ([ID], [Name])
VALUES (1, 'Raul')
,(2, 'Mike');
GO
然后,我们将其设为临时性的,但历史记录表将被指定为普通表:
ALTER TABLE [dbo].[StackOverflow]
ADD [SysStartTime] DATETIME2(0) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT [DF_StackOverflow_SysStart] DEFAULT SYSUTCDATETIME()
,[SysEndTime] DATETIME2(0) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT [DF_StackOverflow_SysEnd] DEFAULT CONVERT(DATETIME2 (0), '9999-12-31 23:59:59')
,PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]);
GO
CREATE TABLE [dbo].[StackOverflowLog]
(
[ID] INT NOT NULL
,[Name] VARCHAR(128) NOT NULL
,[SysStartTime] DATETIME2(0) NOT NULL
,[SysEndTime] DATETIME2(0) NOT NULL
)
GO
ALTER TABLE [dbo].[StackOverflow]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[StackOverflowLog]));
添加一些新记录,修改现有记录:
UPDATE [dbo].[StackOverflow]
SET [Name] = 'Zidane'
WHERE [ID] = 1;
INSERT INTO [dbo].[StackOverflow] ([ID], [Name])
VALUES (3, 'Tervel');
查看正在发生的事情:
SELECT *
,[SysStartTime]
,[SysEndTime]
FROM [dbo].[StackOverflow] FOR SYSTEM_TIME ALL
ORDER BY [ID], [SysStartTime];
您可以使用以下查询来确认您的日志表不在内存中:
SELECT T.[name]
,T.[is_memory_optimized]
FROM [sys].[tables] T
WHERE T.[name] IN ('StackOverflow', 'StackOverflowLog')
AND T.[schema_id] = SCHEMA_ID('dbo');
现在清除演示对象:
DROP TABLE IF EXISTS [dbo].[StackOverflowLog];
DROP TABLE IF EXISTS [dbo].[StackOverflow];
祝你好运。