动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

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

作者来源: 
阅读 1286 人次 , 2006-4-26 9:57:00 

    大家都知道在程序中尽量少和数据库交互是可以 提高程序性能的,以下举一个比较常见的例子

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

一般都会用 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());

              }
                  
             }

  
 本文Tags数据库  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:C#实现的根据年月日计算星期几的函数
· 下一篇:如何显示在线人数和所在位置
· 全面剖析VB.NET(4)
· 使用VB.NET线程访问数据库
· C#中的checked、unchecked操作符
· 一个ASP.NET的进度条
· 全面剖析VB.NET(5)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077