更改内存优化表

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

可以使用 ALTER TABLE 语句对内存优化表执行架构和索引更改。 在 SQL Server 2016 中,内存优化表上的Azure SQL 数据库ALTER TABLE操作是 OFFLINE,这意味着该表在操作正在进行时无法进行查询。 数据库应用程序可以继续运行,并且访问该表的任何操作都将被阻止,直到更改过程完成。 可以在单个 ALTER TABLE 语句中合并多个 ADD、DROP 或 ALTER 操作。

重要

Azure SQL 托管实例不支持常规用途服务层中的内存优化表。

ALTER TABLE

语法 ALTER TABLE 用于更改表架构,以及添加、删除和重新生成索引。 索引被视为表定义的一部分:

  • 语法 ALTER TABLE ... ADD/DROP/ALTER INDEX 仅适用于内存优化表。

  • 如果不使用 ALTER TABLE 语句,则内存优化表上的索引不支持 CREATE INDEXDROP INDEXALTER INDEXPAD_INDEX

支持下列更改类型:

  • 更改存储桶数量

  • 添加和删除索引

  • 更改、添加和删除列

  • 添加和删除约束

有关功能和完整语法的详细信息 ALTER TABLE ,请参阅 ALTER TABLE (Transact-SQL)

架构绑定依赖关系

本机编译的存储过程都需要绑定到架构,即是说它们对所访问的内存优化表和所引用的列有一种绑定到架构的依赖关系。 架构绑定依赖关系是一种两个实体之间的关系,只要引用实体存在,这种关系就可以防止对被引用的实体进行删除或不兼容地更改。

例如,如果绑定到架构的本机编译存储过程从表 mytable 中引用了 c1列,则 c1 列不能被删除。 同样,如果存在包含没有列列表的语句的此类过程 INSERT (例如 INSERT INTO dbo.mytable VALUES (...)),则无法删除表中的列。

在内存优化表上记录 ALTER TABLE

在内存优化表上,大多数 ALTER TABLE 方案现在并行运行,并导致对事务日志的写入进行优化。 这种优化是通过只将元数据更改记入事务日志中来实现的。 但是,以下 ALTER TABLE 操作运行单线程操作,并且未对日志进行优化。

本示例中的单线程操作会将改变表的整个内容都记录到事务日志中。 单线程操作的列表如下:

  • 更改或添加列以使用大型对象 (LOB) 类型:nvarchar(max)、varchar(max) 或 varbinary(max)。

  • 添加或删除列存储索引。

  • 几乎所有影响 行外列 的操作。

    • 导致行内列移至行外。
    • 导致行外列移至行内。
    • 创建新的行外列。
    • 例外: 延长已为行外列的操作将以优化方式进行日志记录。

示例

以下示例更改了现有哈希索引的桶数。 此操作将重新生成具有新的桶计数的哈希索引,并且哈希索引的其他属性保持不变。

ALTER TABLE Sales.SalesOrderDetail_inmem
       ALTER INDEX imPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID  
              REBUILD WITH (BUCKET_COUNT=67108864);  
GO

以下示例添加一个包含 NOT NULL 约束和 DEFAULT 定义列,并使用 WITH VALUES 为表中每个现有行提供值。 如果没有使用 WITH VALUES,那么每一行的新列中都将包含 NULL 值。

ALTER TABLE Sales.SalesOrderDetail_inmem  
       ADD Comment NVARCHAR(100) NOT NULL DEFAULT N'' WITH VALUES;  
GO

下面的示例将在现有列中添加一个主键约束。

CREATE TABLE dbo.UserSession (
   SessionId int not null,
   UserId int not null,
   CreatedDate datetime2 not null,
   ShoppingCartId int,
   index ix_UserId nonclustered hash (UserId) with (bucket_count=400000)
)
WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) ;  
GO  
  
ALTER TABLE dbo.UserSession  
       ADD CONSTRAINT PK_UserSession PRIMARY KEY NONCLUSTERED (SessionId);  
GO

下面的示例将删除一个索引。

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

下面的示例将添加一个索引。

ALTER TABLE Sales.SalesOrderDetail_inmem  
       ADD INDEX ix_ModifiedDate (ModifiedDate);  
GO  

下面的示例将添加多个包含索引和约束的列。

ALTER TABLE Sales.SalesOrderDetail_inmem  
       ADD    CustomerID int NOT NULL DEFAULT -1 WITH VALUES,  
              ShipMethodID int NOT NULL DEFAULT -1 WITH VALUES,  
              INDEX ix_Customer (CustomerID);  
GO  

另请参阅

内存优化表