【问题标题】:Does SQL Server support in-memory database?SQL Server 是否支持内存数据库?
【发布时间】:2019-07-30 06:00:45
【问题描述】:

我基本上有一个测试场景,我

  1. 创建数据库
  2. 用一些数据填充它
  3. 执行要测试的业务逻辑,修改数据。我不拥有业务逻辑实现或数据库模式。我必须测试已经存在的内容。
  4. 断言数据已按预期更改
  5. 删除数据库

SQL Server 是否仅在内存中支持类似的东西,以便我可以通过删除 #1 和 #5 来加速它?显然我不需要坚持。

【问题讨论】:

  • 我不知道 SQL Server 是否只有内存版本。但是,您可能会考虑在 SQL Server 之上使用缓存层。或者,对于纯内存数据库,请阅读 H2 之类的内容。
  • H2 没有帮助,因为我不拥有业务逻辑的现有实现
  • 这是个错误的问题。 SQL Server 自 SQL Server 2014 起就有内存表。所有版本都有临时表和表变量。所有这些都将涵盖要点。这些都与 testing 无关(可能除了临时表)
  • @PanagiotisKanavos 我不同意我之前的评论,但是对于 integration 测试,实际的 SQL Server 实例正好与 OP 应该运行这些测试的内容相矛盾。对于 unit 测试,可以模拟数据库。
  • @Liero 另一种可能性是创建测试数据库,分离它并将文件用作模板。每次您想要一个新的测试数据库时,将它们复制到一个新位置,后跟一个ATTACH DATABASE。这将比 RESTORE 更快,因为它没有恢复阶段

标签: sql-server integration-testing in-memory-database database-testing


【解决方案1】:

SQL Server 具有内存中 OLTP。此功能非常接近您正在研究的内容。从 SQL Server 2016 SP1 开始,所有版本都可以使用,包括 sql express。

显然我不需要坚持

选项DURABILITY=SCHEMA_ONLY 仅保留元数据。这种情况对于暂存表可能是最佳的,因为它导致数据加载的锁/闩锁/日志免费方式。显然,该表将无法在实例/服务重新启动后继续存在。

CREATE DATABASE [Test]
GO 
-- Memory Optimized FG
ALTER DATABASE [Test] ADD FILEGROUP [MemoryOptimizedFG] CONTAINS MEMORY_OPTIMIZED_DATA 
ALTER DATABASE [Test] ADD FILE (name='Test1', filename='D:\SQLData\TestInMemory') TO FILEGROUP [MemoryOptimizedFG]
GO

CREATE TABLE dbo.[TestTable] (
    ID int NOT NULL IDENTITY (1, 1) PRIMARY KEY NONCLUSTERED,
    ColumnID int NOT NULL,
    Description varchar(100) NOT NULL,
    dateAndTime datetime NOT NULL
)  WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) 
GO

参考文献:

【讨论】:

  • 这几乎是我要找的,但它并不能帮助我在测试完成后清理数据,所以我还是需要删除并重新创建数据库
  • @Liero,对于删除和重新创建,您在原始测试场景中有步骤 1 和 5 ;)
  • @Liero 那有什么问题?你想避免什么? DROP & CREATE 不需要那么长时间。为什么你需要一个临时数据库呢?
  • 也许,你会想要保留一个空的数据库,但在其中删除/重新创建内存中的对象
  • @PanagiotisKanavos:不是真的问题,但如果有真正的内存数据库,它会变得更简单和更快(有很多测试)因为没有我会去这些方法大概。但是,给出了数据库脚本,我不想修改它们。让我检查一下我是否可以使用 MEMORY_OPTIMIZED=ON 更改表
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2016-01-14
  • 1970-01-01
  • 2013-07-31
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多