c# - 执行许多(!)小查询的影响

标签 c# sql-server-2008 connection-pooling

因此,我正在解决遗留应用程序的一些性能问题,并且发现了一个非常具体的问题(可能还有其他问题)。

本质上,该应用程序使用对象关系映射器来获取数据,但它以一种非常低效/不正确的方式进行。实际上,它正在执行一系列实体图提取以填充 UI 中的数据网格,并且在数据绑定(bind)网格(它是 ASP.Net Webforms)时它正在执行额外的提取,这会导致其他提取等。

这样做的最终结果是执行了很多很多微小的查询。使用 SQL Profiler 显示某个页面执行了超过 10,000 个查询(以填充单个网格。没有查询需要超过 10ms 才能完成,并且大多数在 Profiler 中注册为 0ms。每个查询将使用和释放一个连接,并且一系列查询将是单线程的(每个 http 请求)。

我对 ORM 非常熟悉,并且知道如何解决问题。

我的问题是:在应用程序中执行很多很多小查询的确切效果是什么?它/可以通过哪些方式强调系统的不同组件?

例如,对网络服务器的 CPU 和内存有什么影响?会不会淹没连接池导致阻塞?对数据库服务器的内存、CPU 和 I/O 有何影响?

我正在寻找相对笼统的答案,主要是因为我想开始监控可能受影响最大的区域(我需要测量 => 修复 => 重新测量)。该系统在高峰期同时使用的用户可能在 100-200 人左右。

最佳答案

这取决于数据库,但通常每个查询都有一个解析阶段。如果查询使用了绑定(bind)变量,它可能会被缓存。如果没有,您将遭受解析的打击,这通常意味着对资源的短暂锁定。即坏。在 Oracle 中,CPU 和阻塞在解析时比在执行时更普遍。 SQL Server 不那么好,但执行起来更糟。显然,通过网络执行 10K 的任何操作都将是一个糟糕的解决方案,尤其是 x 200 用户。我确定音量很好,但该频率确实会突出显示通信延迟等方面的所有开销。连接池通常有数百个,而不是数万个,现在您有成千上万个对象正在创建、排队、管理、销毁、垃圾收集等。

但我相信您已经深深地了解了这一切。放弃这部分的 ORM 并编写存储过程来执行单个查询以返回结果集。然后把它放在网格上。

关于c# - 执行许多(!)小查询的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115900/

相关文章:

sql - 如何在SQL Server中使用选择查询创建表?

sql-server - Sql Server 2008 R2 DC 插入性能更改

sql - 我怎样才能找出这个连接字符串有什么问题?

java - ODatabaseException : Database instance is not set in current thread while dropping database

c# - 在 C# 中使用指针与类实例

c# - SQL Connection.Close 方法上的应用程序崩溃

c# - plupload flash 运行时在 IE8 上不起作用

c# - 在 Windows 中设置 ODBC 驱动程序的最小和最大池大小

Tornado 中具有多个进程的异步连接池

c# - 展望 2007 插件 : How to remove particular userproperty of mailItem