从内存中读取数据后,什么时候从内存中删除(基于磁盘的)表?

J.D*_*.D. 6 sql-server memory table buffer-pool

(基于磁盘,所以没有 Hekaton)表在内存中的持久化时间是否超过从它们读取数据的查询的生命周期?

如果是这样,是什么决定了它们在内存中停留的时间?

有没有办法管理它们在内存中持续多长时间?

Jos*_*ell 10

这是一个复杂的主题,这篇 Microsoft Docs 文章 中涵盖了其中的大部分内容

回答几点:

(基于磁盘,所以没有 Hekaton)表在内存中的持久化时间是否超过从它们读取数据的查询的生命周期?

有点。整个表不一定保存在内存中。表或索引中的单个页面存储在内存中——它可以是整个表,也可以只是其中的一部分。

如果是这样,是什么决定了它们在内存中停留的时间?

您必须参考我链接到的文章,但很多事情都可能导致“内存压力”,从而导致数据页从缓存中“逐出”。

诸如 SQL Server 可用的内存量、其他数据和索引页被拉入内存、其他 SQL Server 数据缓存需要内存、来自操作系统和机器上其他进程的“外部”压力等都可能导致页面被被踢出缓存。

SQL Server 使用“最近最少使用”缓存,因此最近最少引用的页面通常会首先被踢出。

有没有办法管理它们在内存中持续多长时间?

只有确保 SQL Server 有足够的内存来将页面保存在缓冲池中,并确保其他进程不会对 SQL Server 施加压力。

可以帮助防止操作系统从 SQL Server 取回内存的一件事是打开内存中的锁定页面 (LPIM) 功能。


作为历史记录,它DBCC PINTABLE曾经用于将表保存在内存中,但是,它从 SQL Server 2005 开始弃用(现在什么也不做)。