我正在使用SQL Server 2014 CTP2,启用了READ_COMMITTED_SNAPSHOT(我认为这对问题很重要)。
我创建了一个类似于technet博客的示例(SQL Server 2014 In Memory OLTP: Memory-Optimized Table Types and Table Variables)的In-Memory表类型,并且有多个In-Memory表。
在查询中,我将常规In-Memory表与充当过滤器的In-Memory表类型进行了连接,当执行查询时,我会收到此错误消息:“使用READ_COMMITTED隔离级别访问内存优化表的查询,在数据库选项READ_COMMITTED_SNAPSHOT设置为ON时,无法访问基于磁盘的表。请为内存优化表提供受支持的隔离级别,例如WITH(SNAPSHOT)。”
我正在写这个问题的时候删除READ_COMMITTED_SNAPSHOT ON,但问题仍然存在,如果我已经创建了内存数据类型,并且该特定类型“永远不会溢出到磁盘”,就像博客所说的那样,为什么服务器会将其视为“磁盘表”?
为了澄清一些事情,我尝试只使用In-Mem表进行连接,它可以正常工作,但是一旦涉及到表类型,我就会收到错误。
更新:当我删除了READ_COMMITTED_SNAPSHOT(现在已关闭)后,查询起作用,但现在我失去了多版本/无锁/速度,我想听听另一种解决方案。
谢谢
重现步骤。
创建具有内存优化文件组的数据库
CREATE DATABASE MemOptimized
GO
ALTER DATABASE MemOptimized
ADD FILEGROUP mofg
CONTAINS MEMORY_OPTIMIZED_DATA
GO
ALTER DATABASE MemOptimized
ADD FILE ( NAME = N'mofg',
FileName = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MemOptimized.ndf')
TO FILEGROUP mofg
创建一些对象
CREATE TYPE [dbo].[tType] AS TABLE(
[C] [int] NOT NULL
INDEX ix NONCLUSTERED HASH (C) WITH (BUCKET_COUNT = 8)
) WITH ( MEMORY_OPTIMIZED = ON )
CREATE TABLE [dbo].[tTable] (
[C] [int] NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 8)
) WITH ( MEMORY_OPTIMIZED = ON )
INSERT INTO [dbo].[tTable] VALUES(1)
GO
CREATE PROC P
AS
DECLARE @t [dbo].[tType]
INSERT INTO @t
VALUES (1)
SELECT *
FROM [dbo].[tTable] t
INNER JOIN @t
ON [@t].C = t.C
以下内容没有错误。
ALTER DATABASE [MemOptimized]
SET READ_COMMITTED_SNAPSHOT OFF WITH ROLLBACK IMMEDIATE
GO
USE MemOptimized
EXEC P
但是这个
ALTER DATABASE [MemOptimized]
SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
GO
USE MemOptimized
EXEC P
出现了上述详细的错误。
消息41359,级别16,状态0,过程P,行62 访问内存优化表时使用READ COMMITTED隔离级别的查询,当数据库选项READ_COMMITTED_SNAPSHOT设置为ON时,无法访问基于磁盘的表。对内存优化表使用支持的隔离级别,例如WITH(SNAPSHOT)表提示。