我在使用相同的应用程序对同一数据库的两个副本的.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.SqlConnection
和SqlCommand
次操作。
非常感谢任何有用的想法!
答案 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开始查询之前扫描的页面。此过程可显着减少磁盘争用和内存消耗。