代码之家  ›  专栏  ›  技术社区  ›  Eddie

SQL Server内存使用量大会导致错误吗?

  •  2
  • Eddie  · 技术社区  · 17 年前

    我们的C#刚刚开始出现一堆错误。网络应用程序似乎无缘无故地发生了。比如系统。应返回且已返回一段时间的索引的SqlDataReader对象上的IndexOutOfRangeException。

    不管怎样,我查看了任务管理器,发现sqlservr.exe的内存使用率约为1500000 K。我绝不是DBA,但在配备Intel Xeon 3.33Ghz和4GB ram的Win Server 2003 R2 Enterprise上,大量使用内存对我来说是错误的。因此,我重新启动了SQL Server实例。重启后,一切恢复正常。错误突然停止发生。 那么,如此大的主内存使用最终会导致错误吗?

    此外,我做了一个快速的谷歌 high memory usage mssql 我发现如果保留默认设置;SQL Server可以增长到那么大。此外,还找到了一个指向MS的链接 How to adjust memory usage by using configuration options in SQL Server .

    现在的问题是。。。 SQL Server应该限制多少主内存?

    5 回复  |  直到 17 年前
        1
  •  6
  •   Cruachan    17 年前

    我当然会 非常 如果是数据库本身,SQLServer是一个非常可靠的产品,它比Office或Windows本身的任何产品都要好得多,而且通常可以完全依赖。

    1.5Gb是 没有什么 对于关系型数据库管理系统,所有这些数据库管理系统都将继续用缓存数据填充其可用缓冲区。核心中的读取速度通常比磁盘访问快1000倍或更多,因此使用它可用的每一块内存是最佳设计。事实上,如果你看看任何RDBMS设计理论,你会发现用于决定从核心中丢弃什么的算法被给予了相当大的重视,因为它对性能有重大影响。

    大多数专用数据库服务器将使用4Gb内存(假设为32位)运行,其中90%专用于SQL Server,因此您肯定不会在这里看到任何边缘情况。

    到目前为止,你最可能的问题是编码错误或结构问题(如锁定)

    不过,我有一个警告。我偶尔会看到SQL Server因数据库文件损坏而返回页面撕裂错误,这两次都是由潜在的间歇性硬件故障引起的。幸运的是,在这两种情况下,这些都是在包含索引的页面中,通过删除索引、修复数据库、备份和还原到新磁盘,我能够恢复而不会回到备份。我不确定页面撕裂错误是如何传递到C#API的,但可以想象的是,如果您有一个磁盘错误,只有在内核满了之后才会显现出来(即它在某个交换空间上的某个地方),那么索引越界错误看起来就像我所期望的那样,因为调用可能会返回垃圾,因此超出了数组范围。

        2
  •  3
  •   Mitchel Sellers    17 年前

    对于设定什么限制,有很多不同的因素可以发挥作用。通常,您希望以一种方式限制它,以防止它占用系统上太多的内存。

    如果该盒子是一个专用的SQL盒子,将其设置为使用盒子上90%左右的RAM并不罕见。...

    然而,如果它是一个具有其他用途的共享盒子,可能还有其他考虑因素。

        3
  •  2
  •   ahockley    17 年前

    MSSQL应该有多少主内存 应限于?

    尽可能多地提供它,同时确保其他系统服务能够正常运行。是的,这是一个模糊的答案,但在专用的DB箱上,MSSQL会对90%的RAM或类似资源感到非常满意。根据设计,它将占用尽可能多的RAM。

        4
  •  2
  •   Austin Salonen gmlacrosse    17 年前

    1.5GB或4.0GB几乎不费力。..我们的一台服务器通常以1.6GB或2.5GB的速度运行,没有问题。我想如果它没有用那么多,我会更担心。

    我无意听起来严厉,但我不会这么快就把应用程序错误归咎于SQL Server。根据我的经验,每次我试图把责任推给SQL Server,它都会狠狠地揍我一顿。通常是系统管理员或流氓查询让我们的服务器瘫痪了。

    有好几次,解决运行缓慢的查询的方法是重新启动服务器,而不是检查查询,这几乎总是有问题的。我知道我个人重写了大约十几个查询,成本远高于100。

    这听起来真的像是“选择失败”的情况,所以我很好奇你是否能在代码中找到任何改进。

        5
  •  1
  •   Scott Ivey    17 年前

    SQL需要它正在使用的ram。如果它使用1.5 GB,那么它将其用于数据缓存、过程缓存等。一般来说,最好不要这样做——如果你把上限设定得太低,你最终会损害表现。如果它在4 GB的网络盒子上使用1.5 GB,我根本不会认为这是异常的。

    你的错误很可能是由锁定引起的——我很难说你在问题中定义的SQL内存使用是导致你遇到错误的原因。

    推荐文章