SQL Express客户端内存使用情况与SQL Enterprise客户端内存使用情况不同

时间:2013-05-17 09:18:50

标签: .net sql sql-server sql-server-2008 sql-server-express

我在使用相同的应用程序对同一数据库的两个副本的.Net应用程序内存使用情况方面遇到了很大的不同。唯一的区别是在方案1中我使用注册到SQL Server 2005 Express实例的数据库的本地副本 - 在方案2中我使用注册到{{1}实例的数据库的远程副本}。

据我所知,我只期望SQL性能和SQL内存使用量有所不同(因为Express有1GB的限制)。

但是 - 我看到它们之间的内存使用量存在巨大差异(1GB) - 即SQL Server 2008 Enterprise场景主要使用1GB内存。 SQL Express似乎也慢得多,特别是使用大表和大查询 - 但我希望这个内存命中在SQL中,而不是在我的消费/客户端应用程序上?

该应用使用SQL Express连接到SQL服务器,并经常执行System.Data.SqlClient.SqlConnectionSqlCommand次操作。

非常感谢任何有用的想法!

1 个答案:

答案 0 :(得分:1)

对于关于大表和查询的慢速表达的第二个问题,这是正常的,因为快速版本比企业版本消耗更多的内存和磁盘。企业版正在使用名为Enhanched-Read-ahead和Scan(a.k.a Merry-go-round scanning)的功能,这在大型查询的性能方面存在巨大差异。

例如:

假设UserA和UserB都发出SELECT * FROM Customer命令,这会导致表扫描。 UserA首先发出命令; UserB在20秒后发出命令。该表有1亿行(这是一个非常大的表),扫描在安装了非Enterprise Edition的计算机上运行。 UserA的表扫描开始在表的第一页上读取Customer表。 20秒后,UserB的扫描开始读取UserA已经读取的页面,即使某些页面可能已经从缓存中刷新了。有时,这个过程会产生巨大的磁盘争用并吸引内存。

企业版执行增强型预读和扫描略有不同。与非Enterprise Edition版本不同,当UserA发出SELECT * FROM Customer命令时,Enterprise Edition开始扫描Customer表。当UserB在20秒后发出相同的命令时,UserB的表扫描正好在UserA当前正在读取的位置。 UserA和UserB的查询几乎同时读取Customers表的最后一页,但随后UserB的扫描将返回到Customer表的开头,以扫描UserA在UserB开始查询之前扫描的页面。此过程可显着减少磁盘争用和内存消耗。