.net - SQL Express 客户端内存使用量与 SQL Enterprise 客户端内存使用量不同

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

我在使用同一应用程序针对同一数据库的两个副本时,发现 .Net 应用程序内存使用情况存在很大差异。唯一的区别是,在场景 1 中,我使用的是注册到 SQL Server 2005 Express 实例的数据库的本地副本,而在场景 2 中,我使用的是注册到 SQL Server 2005 Express 实例的数据库的远程副本。 SQL Server 2008 Enterprise 的实例。

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

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

该应用使用 System.Data.SqlClient.SqlConnection 连接到 SQL Server,并执行频繁的 SqlCommandSqlBulkCopy 操作。

任何有用的想法将不胜感激!

最佳答案

对于您关于大表和查询上的慢速表达的第二个问题,这是正常的,因为表达版本比企业版本消耗更多的内存和磁盘。企业版使用了增强预读和扫描(也称为旋转木马扫描)的功能,该功能在大型查询的性能方面存在巨大差异。

例如:

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

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

关于.net - SQL Express 客户端内存使用量与 SQL Enterprise 客户端内存使用量不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605535/

相关文章:

sql-server - SQL Server : split a column value into two separate columns based on another column

sql - 变量名称在查询批处理或存储过程中必须是唯一的吗?

sql-server - 如何从属于 SQL Server 2012 数据库中特定模式的所有表中删除所有行?

.net - 从.NET调用Clojure

c++ - 错误 C2440 '=' : cannot convert from 'cli::array<Type> ^' to 'wchar_t'

sql - 递归 CTE 如何与文档中的示例一起使用?

sql - 为字典表找到正确的术语

mysql - 如何加入 2 个查询

c# - 泛型或非泛型类上的静态工厂方法?

c# - 允许使用 LINQ 查询中的 ToDictionary() 重复键