除了少数例外情况,您可以使用任何 Transact-SQL 查询或 DML操作(SELECT、INSERT、UPDATE 或 DELETE)、临时批处理以及 SQL 模块(例如存储过程、表值函数、触发器和视图)访问内存优化表。
被解释的 Transact-SQL 是指 Transact-SQL 批处理或存储过程,但不包括本机编译的存储过程。 解释 Transact-SQL 对内存优化表的访问称为互作访问。
还可以使用本机编译的存储过程访问内存优化表。 对于性能关键型OLTP操作,建议使用本机编译的存储过程。
对于以下情境,建议使用解释型 Transact-SQL 访问:
临时查询和管理任务。
报告查询通常使用在本机编译存储过程中不可用的构造,例如窗口函数。
若要将应用程序的性能关键部分迁移到内存优化表,只需更改最少(或没有)应用程序代码。 你可能会看到迁移表的性能改进。 如果随后将存储过程迁移到本机编译的存储过程,可能会进一步提高性能。
当 Transact-SQL 语句不适用于本机编译的存储过程时。
在已解释的 Transact-SQL 存储过程访问内存优化表中数据时,将不支持以下 Transact-SQL 构造。
| 面积 | 不支持 |
|---|---|
| 访问权限表 | TRUNCATE TABLE(删除表中所有数据) MERGE (内存优化表作为目标) 动态和键集游标(这些游标会自动降级为静态)。 从 CLR 模块访问,使用上下文连接。 从一个索引视图中引用一个内存优化表。 |
| 跨数据库 | 跨数据库查询 跨数据库事务 链接的服务器 |
表提示语
有关表提示的详细信息,请参阅。 表格提示(Transact-SQL)。 添加了 SNAPSHOT 隔离以支持 In-Memory OLTP。
使用解释的 Transact-SQL 访问内存优化表时,不支持下表提示。
| HOLDLOCK | 忽略约束条件 | IGNORE_TRIGGERS | NOWAIT |
| PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST |
| 读取未提交 | ROWLOCK | SPATIAL_WINDOW_MAX_CELLS = 整数 | 表锁 |
| TABLOCKXX | UPDLOCK | XLOCK |
使用解释 Transact-SQL 从显式或隐式事务访问内存优化表时,必须包括隔离级别表提示(如 SNAPSHOT、REPEATABLEREAD 或 SERIALIZABLE),也可以使用MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT。 有关详细信息,请参阅具有 Memory-Optimized 表的事务隔离级别指南和ALTER DATABASE SET 选项(Transact-SQL)。
注释
自动提交模式下运行的查询访问的内存优化表不需要隔离级别表提示。