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,频繁执行SqlCommandSqlBulkCopy操作。

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

【问题讨论】:

这是一个富客户端应用程序吗?唯一不同的是连接字符串? 几乎,它是一个连接到 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 客户端内存使用情况不同的主要内容,如果未能解决你的问题,请参考以下文章

SQL Express 与 SQL CE,延迟/滞后

SQL Server 2014 Express (x64),是啥版本的?express是啥意思?

为啥当我从express发送一个简单的文件时,客户端会消耗大量内存?

无法在 SQL Server Express 版本中启用内存中的锁定页面

如何从 SQL Express 2012 获取数据更改通知?

如何在没有 SQL Server Management Studio 的情况下在 SQL Server Express LocalDB 中使用 Visual Studio 2013 创建两个表之间的关