我可以在内存中容纳整个数据库吗?


9

我的数据库大小约为1gb(根据数据库的mdf文件)。我的数据库服务器有4GB的RAM。查看处于活动状态时计算机上的内存消耗,它的使用率约为85%(包括OS等)

这是否意味着所有数据库读取活动都仅在内存中工作(即整个数据库都位于内存中)?还是仍然有必要将其转到磁盘?


1
那么,为了进行比较,当应用程序处于非活动状态时有什么用?通常,数据库系统的好处之一是它不需要内存中的完整文件,但是它将适合您将其拉出到内存中的内容,直到将其刷新到其他位置为止。我将不得不声明“否”。
Grant Thomas

@先生。失望:我同意这样做是有好处的,但是如果它可以将整个文件存储在内存中(像这种情况),是吗?

如果需要,那么可以。但是根据呼叫者的需求和他们需要的数据,这当然不是本机的。因此,通常,如果您遇到数据库内存问题,则可能是调用代码或支持软件,或两者兼而有之。
Grant Thomas

1
透视的示例:我知道一家非常大的互联网公司拥有几个非常大的门户网站。他们交付约。来自自己的广告服务器的3亿个广告。广告服务器的结构是这样的:一个大的Oracle DB包含用于记帐和定向的所有信息,但是有32个大型(32GB RAM)服务器在RAM中保存着较小的数据库(仅包含当前活动的广告)。他们不接触磁盘,也不能接触磁盘:只有1/1000秒的时间可以在查询查询时找到要放置的广告,任何磁盘访问都将使该目标无法实现。

Answers:


5

是的,整个数据库很可能存储在内存中。它将以检查点间隔将脏页刷新到磁盘。请注意,尽管所有更新都必须写入日志,并等待日志记录在持久性存储上得到硬化,然后再提交。这篇旧的《SQL Server 2000 I / O基础知识》具有您将需要的所有详细信息以及更多信息。

但是您不必猜测,您可以精确地测量它并查看它是否发生。相关性能计数器是:

  • 页面预期寿命页面将保留在没有引用的缓冲池中的秒数。
  • 页面读取/秒每秒发出的物理数据库页面读取数。该统计信息显示所有数据库中的物理页面读取总数。由于物理I / O昂贵,因此您可以通过使用更大的数据缓存,智能索引和更有效的查询,或者通过更改数据库设计来使成本最小化。
  • 页面写入/秒每秒发出的物理数据库页面写入数。

“是的,整个数据库很可能存储在内存中。” 因此,对于我们的生产服务器,至少有约60个网站都使用SQL Server Master中的专用数据库,即使其中只有少数网站的大小等于大于计算机可用内存的大小,这是如何工作的?我很想说没有确定的默认值,也不会出现任何一种情况-根据我之前的评论,它实际上更依赖于环境而不是引擎。
Grant Thomas

@先生。失望:您正在将我的答案应用于其他问题。OP说:My database is about 1gb in size (according to the mdf file of my db). My database server has 4gb of ram.。如果您想为拥有60个网站的情况提供答案,并且在这种情况下如何使用缓冲池缓存,请提出以下问题:)
Remus Rusanu

您是这里的专家,但请原谅我的好奇心:这个理论是否假设(因为我们没有特定的数据)机器在做什么呢?还是说明未知使用者正在使用的某个内存阈值?
Grant Thomas

正如我所说的:you don't have to guess, you can measure this exactly
Remus Rusanu

-5

整个数据库(即数据)将不会存储在内存(SQL Server)中。在检查完索引和/或键之后,它将检索一个指针,该指针指向您要查找的数据在数据文件中的位置,然后很可能会转到光盘上以检索它。如果没有键或索引,则必须扫描整个堆。

根据您所运行的SQL Server版本,可能会有一些策略来缓存使用良好的数据,以最大程度地减少磁盘读取。

您可以获取内存中的数据库,例如MySql Cluster数据库...。该数据库旨在使整个IREDB数据库适合跨服务器群集的内存,以实现高可用性/灾难恢复和快速的数据检索。


1
我没有足够的代表对此表示否决,但不确定为什么您要断言它不会存储在内存中。将页读入缓冲区高速缓存后,它将一直保留在那里,直到内部或外部内存压力导致高速缓存被修剪为止。
马丁·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.