极具威力的 DBPROP_CLIENTCURSOR

9 篇文章 0 订阅
3 篇文章 0 订阅

今天做了一个测试,结果令我非常吃惊,没想到会有这么大的差异。

原本是想测试 C# 的 ADO.NET 的性能和 C++ 的 OLEDB 的性能差异如何的。原以为应该是 OLEDB 优胜于 ADO.NET 的,但是结果却相反。

数据库是 SQL Server 2005 的,数据库和测试机是同一局域网的两台高性能机器,之间是千兆网连接的。测试是用 C# 使用 SqlDataReader 遍历一个有 38 万条记录的表,只读取 3 个小字段;而 C++ 则使用 OLEDB Templates 做同样的事情。

结果非常悬殊,ADO.NET 打开数据集用时平均在 100 毫秒左右,而 OLEDB 则是 1200 毫秒左右,差不多 12 倍的差别,读取时间 ADO.NET 是 700 毫秒左右,而 OLEDB 则是 110 多秒左右,有 150 多倍的差别。

这样的结果,感觉不可思议,怎么 C++ 的性能还不如 C# 吗?而且还相差这么悬殊?是哪里出的问题呢?

想了一下,估计和 OLEDB 的使用方式有关系。C++ 的 OLEDB 访问代码是直接用向导生成的,记得以前使用都要加一些处理,找回以前的代码看了一下,发现是以前的代码都有使用 DBPROP_CLIENTCURSOR 优化的。加了一下再测试。

结果打开数据集的时间变成 1000 毫秒左右,读取时间则是 600 毫秒左右,和之前比较差别非常明显。以前也知道使用客户端游标能够提高访问性能,但是没想到的是这样大的差别。

而且测试还反映了另一个问题,就是 ADO.NET 使用 SqlDataReader 比 OLEDB 还快一点点。估计是由于 SqlDataReader 内部是直接使用 SQL Server 专门的 API 优化了访问的,所以有这样的微小性能差别。

这个测试同时还说明了,有时候设想的情况并不见得就是对的,特别是性能的优化,一定是要进行实际测试和分析的,不能想当然。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值