我正在尝试使用 SQL In-Memory OLTP。限制在于该解决方案需要与 SQL Express 2019 和 2022 兼容。
此链接声称内存中 OLTP 与所有版本的 SQL 兼容,包括 Express。
使用 2022 版本时,我无法开始:
EXECUTE master.dbo.xp_create_subdir 'C:\data\'
GO
ALTER DATABASE S2X ADD FILEGROUP S2x_mod
CONTAINS MEMORY_OPTIMIZED_DATA;
GO
ALTER DATABASE S2x ADD FILE (
name='S2x_mod1', filename='c:\data\S2x_mod1')
TO FILEGROUP S2x_mod;
我到达上述查询的最后一部分并收到以下错误:
无法处理该操作。此 SQL Server 实例上已禁用 Always On 可用性组副本管理器。使用 SQL Server 配置管理器启用 Always On 可用性组。然后,重新启动 SQL Server 服务,并重试当前操作。有关如何启用和禁用 Always On 可用性组的信息,请参阅 SQL Server 联机丛书。
当尝试通过 SQL Server 配置管理器启用该选项时,它说使用此版本的 SQL Express无法打开“Always On 可用性组” 。
使用2019版本,我完成了上述查询并设法创建了内存优化表和本机存储过程:
-- Creating a memory-optimized table
CREATE TABLE dbo.State
(
CID NVARCHAR(50) NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000),
PNO INT NOT NULL,
IsStart BIT NOT NULL,
IsEnd BIT NOT NULL,
CMPID NVARCHAR(50) NOT NULL
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO
CREATE PROCEDURE dbo.GetStateByCID
@CID NVARCHAR(50)
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC WITH
(
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
)
SELECT CID, PNO, IsStart, IsEnd, CMPID
FROM dbo.State
WHERE CID = @CID;
END;
但执行时:
EXEC @return_value = [dbo].[GetStateByCID]
@CID = N'1234'
我收到以下错误:
执行批处理时出错。错误消息为:内部连接致命错误。错误状态:15,令牌:0
我在网上没有找到很多关于此问题的帮助;但这似乎是 2017 版中修复的一个问题(请参阅此处)。这对我来说没有多大意义,因为我原本以为修复会默认包含在 2019 版中。无论如何,只有当内存中 OLTP 与 Express 2019和2022兼容时,我才可以使用它。
我在这里遗漏了什么?内存中 OLTP 是否与 SQL Express 兼容?我做错了什么吗?
是的,正如所记载的,确实如此。
是的。
这是因为您正在运行 RTM,并且没有应用过去约 3 年的任何补丁。此问题已在 CU1(第一个累积更新)中得到修复。一旦应用(撰写本文时最新的是 CU14),您将不会遇到此问题。我希望这能让您意识到应用补丁的重要性。
根据您提供的示例,您的执行是错误的。您的示例有
@ConnectionID = N'1234'
一个参数,但本机编译的存储过程有一个参数,@CID
这意味着您应该收到有关缺少预期参数的错误。最有可能的是,由于没有修补,它有一个已经修复的问题。我无法像您那样从服务器端终止我的批处理,尽管我也没有非常努力,因为它在很多层面上都是不正确的,修复后应该不会有任何问题。如果您在锁定和闩锁时遇到热路径,那么这就是一个用例。其中大多数不是大型表,而是经常更新或由多个并发连接使用的较小表,例如 asp.net 中的会话状态,但是还有其他用途,例如加载数据时吸收冲击(尽管我同意原始评论,即此场景对于 Express 版本不是很有用),没有日志记录的表(您不关心数据,它不需要恢复但需要可用),等等。
我没有看到任何内容指定完全内存关系数据库引擎的绝对必要性。