许多博客和网站都提到增加OracleDataReader的FetchSize,以提高获取大量数据(例如数千行(时的性能。有一些记录在案的实验,上面有确切的数字,比如:http://metekarar.blogspot.com/2013/04/performance-improvement-for-odpnet.html
为了复制这些结果,我创建了一个非常相似的示例应用程序,该应用程序以不同的提取大小多次提取此类数据。奇怪的是,除非显式禁用连接池(例如在连接字符串中(,否则 FetchSize 的增加/减少将停止产生任何影响。但是,当池化被禁用时,很明显 FetchSize 可以提高性能(记录越多,效果越大(。
这可能是特定版本的 ODP.NET 中的错误(我使用的是 2.112.1.0(,或者这是一种普遍的奇怪行为,实际上消除了优化每个查询的 FetchSize 的可能性。
当在命令或读取器(而不是连接上(上设置 FetchSize 时,连接池和 FetchSize 之间的逻辑链接是什么?我错过了什么吗?
事实证明,这种意外行为仅限于以下条件:1( SELECT 语句完全相同2( 池已打开3( 自整定已开启
只有在这些情况下,第一次设置 FetchSize 时,它才会以某种方式被 ODP.NET 缓存,并且尝试更改它不起作用。