系统版本化表的SQL Server内存OLTP表

时间:2019-08-07 04:06:17

标签: sql-server tsql optimization sql-server-2016 in-memory-database

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

但是,所有标识为“高收益/低迁移工作量”的表都是系统版本的表。当我右键单击系统版本的表时,看不到启用它进行内存优化的选项,但在非系统版本表上也看到了相同的选项。

我读到有可能将历史记录表保留在磁盘中,而仅将主表迁移到内存中。有人这样做吗?还是我错过了任何描述该如何实现的链接?

1 个答案:

答案 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];

enter image description here

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

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];

祝你好运。