2008-12-16 116 views
2

刚刚开始在我们的C#.Net应用程序中出现一堆错误,这似乎是无缘无故发生的。像SqlDataReader对象上的System.IndexOutOfRangeException对于应该返回并且已经返回一段时间的索引。大型SQL Server内存使用率是否会导致错误?

无论如何,我看着任务管理器,看到sqlservr.exe运行在大约1,500,000 K Mem Usage。我绝不是DBA,但是在运行4GB RAM的Intel Xeon 3.33Ghz的Win Server 2003 R2 Enterprise上,内存的大量使用看起来是错误的。所以我重新启动了SQL Server实例。重启后,一切恢复正常。错误突然停止发生。 这么大的主要内存使用最终会导致错误?

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

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

回答

6

我肯定会是非常惊讶如果是数据库本身,SQLServer是一个非常坚实的产品 - 远低于Office或Windows本身什么都好,一般都可以完全,完全依赖。

1.5Gb是没有一个RDBMS - 并且它们全部都将继续使用缓存数据填充它们的可用缓冲区。核心读取速度通常是磁盘访问速度的1000倍或更快,因此使用可用的每一块内存都是最佳设计。事实上,如果你看看任何RDBMS设计理论,你会发现用于决定从核心中抛弃什么的算法被赋予相当显着的优势,因为它对性能产生了重大影响。

大多数专用数据库服务器将与4Gb内存(假设32位)一起运行,90%专用于SQL Server,因此您当然不会在这里查看任何类型的边缘条件。

你目前最有可能的问题是一个编码错误或结构性问题(如锁定)

我有一点需要注意,虽然。非常(非常非常像10年中的两次)偶尔我看到SQL Server返回页面撕裂错误是由于其数据库文件损坏,这两次都是由潜在的间歇性硬件故障引起的。幸运的是,这两种情况都出现在拥有索引和删除索引的页面中,修复数据库,备份和恢复到一个新磁盘,我可以恢复而不会退回到备份。我不确定页面撕裂错误是如何传递给C#API的,但可以想象,如果你有一个磁盘错误,它只在核心已满后才显示出来(即它在某个交换空间的某处),那么索引越界错误看起来像是我期待的那种表现,因为一个电话可能会返回垃圾 - 因此不在阵列范围之内。

3

有许多不同的因素可以起到什么限制设置。通常情况下,你想限制它的方式,防止它在系统上占用过多的内存。

如果盒子是一个专用的SQL中,这种情况并不少见,以将其设置为使用90%左右,包装盒上的RAM的....

但是,如果它是一个共享的盒子有其他目的,可能有其他的考虑。

+0

如果它是一个专用的盒子(因为'全部'生产SQL服务器应该是),那么让SQL管理所有内存并且不限制它是很常见的。 – 2008-12-16 23:21:25

2

MSSQL 应该限制多少内存?

尽可能地给它,同时确保其他系统服务可以正常工作。是的,这是一个模糊的答案,但是在一个专用的数据库框中,MSSQL对于90%的内存或者其他内容会很满意。按照设计,它会尽可能多地使用RAM。

1

SQL需要它正在使用的内存。如果它使用1.5个演出,那么它将用于数据缓存,过程缓存等。它通常会更好地保留 - 如果设置过低,则最终会损害性能。如果它在一个4 gig的web box上使用1.5演唱会,我根本不会称之为异常。

您的错误很可能是由锁定引起的 - 我很难说您在问题中定义的SQL内存使用情况导致了您收到的错误。

2

1.5GB的4.0GB几乎没有征税......我们的服务器之一通常运行在2.5GB的1.6GB,没有问题。如果它没有使用那么多,我想我会更关心。

我并不是说听起来很刺耳,但我不会那么快责怪SQL Server的应用程序错误。从我的经验来看,每次我试图将这个推测传递给SQL Server时,它就是我的屁股。这通常是系统管理员或流氓查询引起我们的服务器瘫痪。

有几次缓慢运行的查询的解决方案是重新启动服务器而不是检查查询,而查询几乎总是出错。我知道我个人重写了十几个查询,其中成本远高于100.

这听起来像是''select'坏了'的情况,所以我很好奇你是否可以在代码中找到任何改进。

相关问题