以编程方式使用批语句节省 数据库 IO 来提高性能

 

大家都知道在程序中尽量少和数据库交互是可以 提高程序性能的,

以下举一个比较常见的例子

如:需要根据 某条件判断条记录是否存在 如果不存在就 插入的这种操作。

一般都会用 2 次数据库io 1次取 Count 如果=0 INSERT INTO 其实在 Oracle, SQL Service

等大型数据库中可以使用批 SQL 语句节省数据库 IO(和数据库的交互).

以下例子是一个简单的的演示执行一次数据库 io(演示使用C# + Oracle数据库演示,其他语言或 SQLService 也差不多),

适合使用在写存储过程没太大意义的时候。

 

测试代码如下:(注意,测试用的SQL语句中注释过多会影响性能,实际使用不用这么多注释)

语句比较简单,所以没有把表结构贴出来,数据库连接部分省略。

              //使用批 SQL 执行(但不能换行和回车 /r/n 不行 /n 可以)

              //C# 可以用 @ 可以直接换行,VB 写这样的比较郁闷所以用C# 作演示

              const string ExecSQl=

@"Declare

     var_bbsitemid VARCHAR2(12) :=:IpBbsitemid ;/*传入参数*/

     var_userid VARCHAR2(20) := :IpUserid ;/*传入参数*/

     var_counts NUMBER(10);

BEGIN

     /*根据条件取记录条数*/

     SELECT COUNT(t.bbsitemid) INTO var_counts

     FROM ST_BBSMRKTRSLTCHK t

     WHERE t.userid = var_userid AND t.bbsitemid = var_bbsitemid;

 

     /* Oracle 打印不知道怎么看 nnd */

     Dbms_Output.put_line('Count:'|| var_counts);

 

     /*如果是0条就插入*/

     IF var_counts = 0 THEN

         INSERT INTO ST_BBSMRKTRSLTCHK(BBSITEMID, USERID, READFLG, LASTMODIFIED)

              VALUES (var_bbsitemid, var_userid, 0, SYSDATE);

     END IF;

 

END;" ;

              //auto --commit;

              //必须把/r (换行符)去掉 否则 Oracle 不认而且会报错。

              this.cmd.CommandText = ExecSQl.Replace("/r",string.Empty);

              cmd.Parameters.Clear();

              OracleParameter Par;

              //传参数

              Par = cmd.Parameters.Add(":IpBbsitemid",OracleType.VarChar);

              Par.Value="0012";

                  

              Par = cmd.Parameters.Add(":IpUserid",OracleType.VarChar);

              Par.Value="DEF";

 

              try

              {

                   //如果执行批每次返回都是1 如果想得到真正的更新条数就要用Out OracleParameter

 

                   int returnVar = cmd.ExecuteNonQuery();                 

                  

                   MessageBox.Show("执行成功");

 

              }

              catch(Exception ex)

              {

                   MessageBox.Show(ex.ToString());

              }

                  

             

 

              }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值