C#调用Oracle存储过程或函数返回结果集效率测试

C#调用Oracle存储过程或函数返回结果集效率测试

作者:肖凤斌 E-mail:binsweet@gmail.com

 

在SqlServer中可以较容易的使用存储过程返回结果集,但在Oracle中却比较困难,因为Oracle中不支持过程返回结果集,只能用动态游标来替代实现。

 

实现方法如下:

环境:Oracle 9.2.0.1 + asp.net(C#)

oracle中创建函数:

 

CREATE OR REPLACE FUNCTION fun_test  RETURN SYS_REFCURSOR IS
  RESULT SYS_REFCURSOR
;
BEGIN
  OPEN RESULT FOR 'SELECT * FROM t_test where rownum<1001';

  RETURN(RESULT);
END fun_test;

 

C#测试语句:

           long t1,t0 = System.DateTime.Now.Ticks;
            DataSet ds = new DataSet();
            try
            {

                this.DBConnection();
                this.cmd.CommandText = "fun_test";
                this.cmd.CommandType = CommandType.StoredProcedure;
                this.cmd.Parameters.Add("ReturnValue", OracleType.Cursor);
                this.cmd.Parameters["ReturnValue"].Direction = ParameterDirection.ReturnValue;
                this.da.SelectCommand = this.cmd;
                this.da.Fill(ds, "RESULT");
            }
            catch (Exception e)
            {
                throw (e);
            }
            t1 = DateTime.Now.Ticks - t0;

注意调用的时候函数返回值类型为OracleType.Cursor。

这样就可以在存储过程或函数中返回结果集了,但是由于使用了动态游标,其效率很让人不放心,因此做了如下对照试验:

  long t1, t0 = System.DateTime.Now.Ticks;
   DataSet temp = new DataSet();

   try
   { 
    this.cmd.CommandText = "SELECT * FROM t_test where rownum<1001";
    this.da.SelectCommand = this.cmd;    
    this.da.Fill(temp,TableName);    
   }  //结束try
   catch (Exception e)
   {   
    throw(e);
   }
   t1 = DateTime.Now.Ticks - t0;

 

当取10000条记录时,耗时Ticks如下:

 第一次第二次第三次刷新页面刷新页面刷新页面刷新页面    平均值
利用函数1390625014687500142187501453125013906250131250001281250013883928.57
普通方式625000625000625000156250156250156250156250357142.86

 

结论:可以看到,取1万条记录时,其效率存在数量级的差异,普通方式比用函数返回结果集的效率要高两个数量级,因此想使用oracle存储过程或函数返回结果集时要慎重考虑效率问题。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值