我正在使用 SQL Server 2014 CTP2,READ_COMMITTED_SNAPSHOT ON(我认为这对这个问题很重要)。
我创建了一个 In-Memory 表类型(与 technet 博客SQL Server 2014 In Memory OLTP: Memory-Optimized Table Types and Table Variables的示例非常相似),并且我有几个 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_SNAPSHOT 设置为 ON 时,使用 READ COMMITTED 隔离级别访问内存优化表的查询无法访问基于磁盘的表。使用诸如 WITH (SNAPSHOT) 之类的表提示为内存优化表提供支持的隔离级别。