我有一个 SQL Server 数据库,它几乎是一个只读数据库(写入过程将在预定时间发生,通常每天两次)。我最近发现了内存表(我是一名开发人员,而不是 DBA 专家),想知道将数据库移至“内存”版本是否是一个好主意;此配置的一般问题是什么?
内存表对我来说是一个新主题,我很困惑这些表是否只适合加速 IO 操作,或者也适合简单查询(特别是已经离散的查询)。我也很想知道当 SQL Server 可以使用离散快速 SSD 时,这项技术是否也是一个好的选择。我不想问得太宽泛,但我也对迁移到这项技术期间可能发生的已知问题感到好奇。
PS:为了给你一些背景知识,我想到了这个想法,因为我面临着一些性能问题。查询已经相当高效,但我的查询很少(已经尽可能优化),大约需要 0.2-0.3 秒,对于我的需要来说太多了。出于好奇,我要补充一点,这种计时需求是由于这些“慢速”查询绑定到 Web 请求,应该在不到一秒的时间内完成。
内存表在理论上听起来是一个好主意,但在实践中存在许多问题和限制,它们通常只适用于大多数人没有的非常特定的用例。
以下是一些有关其限制的 Microsoft 文档:
内存中 OLTP 不支持的 SQL Server 功能
内存中 OLTP 不支持的 Transact-SQL 构造
内存中 OLTP 支持的数据类型
一些值得注意的限制包括:
DATETIMEOFFSET
或XML
数据类型如果您想避免内存中表的麻烦和限制,但仍然受益于内存优化操作和工作流程,那么只需向服务器添加足够的内存,如如何快速轻松地实施内存中 OLTP 中所述。(其中还有一些其他关于内存表功能遇到的问题的好链接,例如必须编写自己的冲突检测和重试逻辑。) SQL Server 实例可用的内存越多,SQL Server 实例的表和页面就越多。数据会自动为您缓存在内存中。那就不用自己管理了。
我不完全同意这个说法。200ms已经不足1秒了。如果有其他非数据库事物增加了该 Web 请求的时间,使其花费的时间超过一秒,那么您应该集中精力优化瓶颈中最大的一块。否则,正如其他人在评论中所说,内存表可能不是 200 毫秒延迟的解决方案(特别是如果您在同一查询的后续运行中看到这种情况,此时数据页应该已经缓存在内存中)。
最好的解决办法是优化查询或重新构建数据库。根据您的评论,您的数据库很小,“我的表非常小,每个表大约有 100k 个条目(较大的表)。整个数据库约为 2,5GB ”。所以我确信您的问题是查询或架构问题,并且执行计划可能会暴露主要瓶颈。如果您需要进一步帮助,您可以将查询计划上传到“粘贴计划”并将其链接到您的帖子中。