SQL Express 客户端内存使用情况与 SQL Enterprise 客户端内存使用情况不同
Posted
技术标签:
【中文标题】SQL Express 客户端内存使用情况与 SQL Enterprise 客户端内存使用情况不同【英文标题】:SQL Express client memory usage differs to SQL Enterprise client memory usage 【发布时间】:2013-05-17 09:18:50 【问题描述】:使用同一个应用程序对同一个数据库的两个副本使用的 .Net 应用程序内存使用情况存在很大差异。唯一的区别是,在场景 1 中,我使用的是注册到 SQL Server 2005 Express
实例的数据库的本地副本 - 而在场景 2 中,我使用的是注册到 SQL Server 2008 Enterprise
实例的数据库的远程副本。
据我所知,我只希望 SQL 性能和 SQL 内存使用量有所不同(因为 Express 有 1GB 的限制)。
但是 - 我看到它们之间的内存使用存在巨大差异 (1GB) - 即 SQL Express
场景主要使用 1GB 以上的内存。 SQL Express
似乎也慢得多,特别是在处理大表和大查询时——但我希望这个内存命中出现在 SQL 中,而不是在我的消费/客户端应用程序上???
应用使用System.Data.SqlClient.SqlConnection
连接SQL server,频繁执行SqlCommand
和SqlBulkCopy
操作。
非常感谢任何有用的想法!
【问题讨论】:
这是一个富客户端应用程序吗?唯一不同的是连接字符串? 几乎,它是一个连接到 SQL 的 .Net 应用程序(不是 GUI 应用程序,而是一个服务)。是的,两个测试场景之间的唯一区别是连接字符串... 您如何测量内存使用情况?它是一次性消耗大量内存还是随着时间的推移逐渐增加? 每分钟我都会将私有内存使用情况写入一个文件。在 24 小时的过程中,它在场景 1 中频繁达到 150-250Mb 的峰值,在场景 2 中以相同的频率达到 1000Mb 的峰值。 您可能想要获取分析器(例如 RedGate 内存分析器)以获取有关正在发生的事情的更多详细信息 【参考方案1】:关于大表和查询的慢速快递的第二个问题,这是正常的,因为快递版比企业版消耗更多的内存和磁盘。企业版使用了一种称为增强型预读和扫描(又名旋转木马扫描)的功能,它在大型查询的性能上存在巨大差异。
例如:
假设 UserA 和 UserB 都发出SELECT * FROM Customer
命令,这会导致表扫描。用户A首先发出命令; UserB 20 秒后发出命令。该表有 1 亿行(这是一个非常大的表),并且扫描在未安装企业版的机器上运行。 UserA 的表扫描开始读取表第一页上的 Customer 表。 20 秒后,对 UserB 的扫描开始读取 UserA 已经读取的页面,即使某些页面可能已经从缓存中刷新。有时,此过程会产生巨大的磁盘争用并占用内存。
企业版执行增强的预读和扫描略有不同。与非企业版不同,当用户A 发出SELECT * FROM Customer
命令时,企业版开始扫描客户表。当用户 B 20 秒后发出相同的命令时,用户 B 的表扫描正好从用户 A 当前读取的位置开始。 UserA 和 UserB 的查询将几乎同时读取 Customers 表的最后一页,但随后 UserB 的扫描将返回 Customer 表的开头以扫描 UserA 在 UserB 开始查询之前扫描的页面。这个过程极大地减少了磁盘争用和内存消耗。
【讨论】:
这里的关键点是企业将“吃掉”所有内存,除非您在配置中指定最大大小。该产品假定它是在服务器上运行的唯一应用程序,并对其自身进行适当配置 是的,但是大型表的另一个关键点是称为结婚转轮的企业功能(如答案中所述:))! 这与OP的问题无关。 差异很大。本地实例也很可能会通过 tcp ip 使用共享内存。但这里已经讨论了要点。以上是关于SQL Express 客户端内存使用情况与 SQL Enterprise 客户端内存使用情况不同的主要内容,如果未能解决你的问题,请参考以下文章