我昨天在 SQL Server 2016 SP1 企业版上创建第一个 memory_optimized 表时遇到了问题。
我这样创建了数据库和文件组
CREATE DATABASE imoltp -- Transact-SQL
CONTAINMENT = NONE
ON PRIMARY
(
NAME = N'imoltp',
FILENAME = N'F:\UNREFRESHED_DB\imoltp.mdf' ,
SIZE = 5120KB ,
FILEGROWTH = 1024KB
)
LOG ON
(
NAME = N'imoltp_log',
FILENAME = N'F:\UNREFRESHED_DB\imoltp_log.ldf' ,
SIZE = 2048KB , FILEGROWTH = 10%
)
GO
ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod]
CONTAINS MEMORY_OPTIMIZED_DATA;
ALTER DATABASE imoltp ADD FILE
(name = [imoltp_dir], filename= 'F:\UNREFRESHED_DB\imoltp_dir')
TO FILEGROUP imoltp_mod;
go
然后我创建了表
USE imoltp
GO
CREATE TABLE imoltp.[dbo].[T1] (
[TempID] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
[object_ids] NVARCHAR(255) NOT NULL,
[names] NVARCHAR(255) NOT NULL,
[comment] NVARCHAR(50)
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_ONLY);
GO
导致此错误:
Msg 41334, Level 16, State 0, Line 8 无法正确创建或设置代码生成目录。
我终于发现 SQL 试图在服务器属性中定义的默认数据库位置创建一个目录 (XTP),在这种情况下不再存在。这个目录是它想要存储内存中需要的 dll 文件的地方。
https://blogs.msdn.microsoft.com/bobsql/2016/08/23/create-table-disk-vs-in-memory-optimized/
所以我的问题是这样的。
有没有办法在 CREATE TABLE 语法或其他地方定义 XTP 目录的创建位置?
谢谢,克雷格
不,那里没有。这始终指向默认数据库路径。如果路径被删除,它将尝试创建并对其应用安全性几次,然后返回错误。
这在构建时是正确的:13.0.4422.0 及更早版本
如果您认为应该将其更改为可配置的值 - 我会邀请您在Connect中创建一个请求。