将表更改为MEMORY_OPTIMIZED=ON 在SQL Server 2017中出现错误。

4

我需要修改表以添加MEMORY_OPTIMIZED = ON,DURABILITY = SCHEMA_ONLY。根据文档,语法如下:

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
{
<table_option>
}

其中 <table_option> 是 :

<table_option> ::=
{
    MEMORY_OPTIMIZED = ON
  | DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name . history_table_name
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}

我的代码如下:

 ALTER TABLE memtypes 
 MEMORY_OPTIMIZED = ON , DURABILITY =SCHEMA_ONLY;

但是我得到了这个错误:

Msg 102,Level 15,State 1,Line 2
“MEMORY_OPTIMIZED”附近语法不正确。

请问有什么帮助吗?

1个回答

4

将磁盘表迁移到内存中的OLTP表所需的过程并不简单,需要在做出最终的迁移决策之前进行充分的分析。然而,内存中的OLTP表带来的好处值得您的努力。

假设我们有以下磁盘表:

CREATE TABLE <Disk based table name>
(
    id INT Primary Key,
    fname VARCHAR(10)
);
GO

让我们逐步了解该过程。

为了拥有一个内存优化的表,你的数据库需要有一个内存优化的文件组和一个分配给它的文件。按照以下步骤进行操作,如果已经设置好,请忽略:

--add the filegroup to database named TEST
ALTER DATABASE <Your Database>
ADD FILEGROUP <Filegroup Name>
CONTAINS MEMORY_OPTIMIZED_DATA;

--Add and assign a file to filegroup
ALTER DATABASE <Your Database>
ADD FILE
    (
        NAME = <File Name>,
        FILENAME = <File store location>
    )
TO FILEGROUP <Filegroup Name>;

--Simply test the database to check if it now supports in memory optimised tables or not?
USE <Your Database>;
GO
SELECT g.name,
       g.type_desc,
       f.physical_name
FROM sys.filegroups g
    JOIN sys.database_files f
        ON g.data_space_id = f.data_space_id
WHERE g.type = 'FX'
      AND f.type = 2;

在完成这些步骤后,您需要创建一个新的内存优化表,并将数据从基于磁盘的表迁移到其中。

CREATE TABLE <In memory Table name>
(
    id INT,
    fname VARCHAR(10),
    CONSTRAINT PK_TEST_Memory_ID
        PRIMARY KEY NONCLUSTERED HASH (id) WITH(BUCKET_COUNT=1572864)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY);
GO

INSERT INTO <In memory Table name>
SELECT *
FROM <Disk based table name>;

在Red-Gate博客中了解有关此迁移的更多信息: https://www.red-gate.com/simple-talk/sql/database-administration/migrating-disk-based-table-memory-optimized-table-sql-server/

还有另一个有用的GitHub链接: https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/sql-database/sql-database-in-memory-oltp-migration.md


有没有办法在构建内存表时克隆磁盘表的结构,而不是通过重写磁盘表的结构并在末尾添加WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)来构建它? - Mohammed Ali
1
@ElieMA 你需要编写脚本来实现这个功能。以下是一些示例:https://dev59.com/fnRB5IYBdhLWcg3wJUeu#16797460 https://web.archive.org/web/20080907123947/ 和 http://blogs.techrepublic.com.com/datacenter/?p=431 - Vahid Farahmandian
1
非常感谢,我会搜索相关内容,因为我无法找到如何通过简单的传统语句来创建它的任何信息。我会接受这个答案。 - Mohammed Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接