因此,我正在解决遗留应用程序的一些性能问题,并且发现了一个非常具体的问题(可能还有其他问题)。
本质上,该应用程序使用对象关系映射器来获取数据,但它以一种非常低效/不正确的方式进行。实际上,它正在执行一系列实体图提取以填充 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/