内存中的 SQL Server 2005“固定”数据

Posted

技术标签:

【中文标题】内存中的 SQL Server 2005“固定”数据【英文标题】:SQL Server 2005 "Pin" data in Memory 【发布时间】:2010-11-24 01:08:54 【问题描述】:

我们在仅运行 SQL Server 2005 的专用机器上运行应用程序的数据库。 此数据库服务器有 32 Gb 的 RAM...而数据库文件本身只有 6 Gb。

我想将几个重读/查询的表强制放入 SQL 内存缓冲区以提高速度。

我知道 SQL Server 非常擅长将必要的数据从磁盘读取后保存在内存中......但我们的客户可能更希望他们的查询在第一次运行时快速运行。 “第二次次的最快性能”并不是产品亮点。

缺少旧的“Pin Table”DBCC 命令.. 有什么想法吗?

我编写了一个“CacheTableToSQLMemory”Proc,它循环遍历表的所有索引(集群和非),在临时表中执行“选择 *”。我已安排 SQL 代理每 15 分钟运行一次“缓存大量表”进程,以尝试将页面保留在内存中。

它在很大程度上有效.. 但即使在我缓存了查询的所有相关表之后,运行查询仍然会增加该表的缓存页数。然后第二次更快。 想法?

我们正在运行 PAE 和 AWE。 SQL 设置为使用 8 到 20 GB 的 RAM。

【问题讨论】:

'PAE 和 AWE 设置' 如'我仍在运行具有 2GB 虚拟地址空间的糟糕 x86 实例'? ...我知道...我正在努力推动操作系统升级... 什么版本的 Windows?我希望是 64 位的,否则答案如此很明显很有趣 @smirkingman:“PAE”暗示 x86:“PAE 仅用于在基于 x86 的系统上运行的 32 位版本的 Windows。” msdn.microsoft.com/en-us/library/aa366796%28VS.85%29.aspx 好消息!根据大家的建议,我们正在测试 Windows Server 2008 x64 和 SQL 2008 x64 设置!谢谢大家的想法。 【参考方案1】:

x86 瓶颈是您的真正问题。 AWE 只能提供数据页,因为它们可以映射进出 AWE 区域,但其他所有内存分配都必须塞进 2GB 的进程虚拟地址空间。这将包括每个线程堆栈、所有代码、当前从 AWE 映射到“正在使用”的所有数据,最重要的是,每一个缓存计划、执行计划、缓存安全令牌、缓存元数据等等。而且我连CLR都不算,希望你不要用。

鉴于系统有 32GB 的 RAM,您甚至无法尝试 /3GB 看看是否有帮助,因为在这种情况下总 PAE 减少到 16GB,这将使您的一半 RAM 不可见...

你真的,真的,必须迁移到 x64。 AWE 只能提供这么多帮助。您可以从Buffer Manager 和Memory Manager 对象收集性能计数器并监控sys.dm_os_memory_clerks,这样您就可以更好地了解实例内存的行为(正在使用的内存在哪里,谁在使用它等)。我不希望这会真正帮助您解决问题,但我确实希望它会为您提供足够的信息来为升级到 x64 提供理由。

【讨论】:

【参考方案2】:

在 SQL Server 2005 中无法将表固定在内存中。如果 SQL Server 从内存中删除表,那是因为系统其他部分存在内存压力。由于您的数据库只有 6GB,因此数据库应该保留在内存中……前提是服务器上没有其他数据库。

不过,您可以采取一些措施来尝试将数据保存在内存中。根据您安装的 SQL Server 的补丁级别和版本,您可能能够利用 lock pages in memory 功能来确保 SQL Server 的内存永远不会被调出。

您还可以将服务器上的内存分配更改为固定大小。除非您的数据库服务器上有其他东西,否则您可以将 SQL Server 的最小和最大内存设置为相同的值。这不一定会阻止这种情况在未来发生(这是 SQL Server 应该如何工作的功能),但将 SQL Server 设置为使用固定数量的内存肯定不会有什么坏处(如果你没有其他内存问题)。

【讨论】:

以上是关于内存中的 SQL Server 2005“固定”数据的主要内容,如果未能解决你的问题,请参考以下文章

sql server2005安装时报 ‘服务无法启动’

sql server2005安装时报 ‘服务无法启动’

SQL Server 2005 异常

sql server 2005将时间转换为分钟[重复]

sql server 2005数据库中表B以表A为外键,那么表B中的某一列的默认值能用表A的某一列吗?

如何删除大量数据 sql server2005 数据量在8千万左右??