sql语句执行与直接执行存储过程的效率比较

1.关于拼sql语句执行与直接执行存储过程的效率比较

1)在程序代码中拼sql语句,类似代码如下:
               

 代码如下 复制代码

System.Data.OleDb.OleDbCommand Command=conn.CreateCommand();
                Command.CommandTimeout=0;
                Command.Transaction=trans;
                Command.CommandType=CommandType.Text;
                string sql="";
                for(int i=0;i<IWo_Img.Count;i++)
                {
                    Wo_Img=IWo_Img[i] as EMS_EDI_WO_IMG;
               
                   
                    Wo_ImgDb.Wo_No=Wo_Img.Wo_No;
                    Wo_ImgDb.Comp_No=Wo_Img.Comp_No;
                    Wo_ImgDb.Take_Date_=Wo_Img.Take_Date;
                    Wo_ImgDb.Ems_No= ems_no;
                    Wo_ImgDb.Process_No=Wo_Img.Process_No;
                    Wo_ImgDb.Item_No_=Wo_Img.Item_No;
                    Wo_ImgDb.Take_Type_=Wo_Img.Take_Type;
                    Wo_ImgDb.Qty_=Wo_Img.Qty.ToString();
                    Wo_ImgDb.Unit_=Wo_Img.Unit;
                    Wo_ImgDb.Pcno=pcsum;

                    sql ="insert into EMS_EDI_WO_IMG(WO_NO,COMP_NO,Take_Date,PROCESS_NO,Item_No,Take_Type,Qty,Unit,EMS_NO,PCNO) " +
                          " values('"+Wo_ImgDb.Wo_No +"','"+Wo_ImgDb.Comp_No+"','"+Wo_ImgDb.Take_Date_+"','"+Wo_ImgDb.Process_No+"','"+Wo_ImgDb.Item_No_+"','" +
                          Wo_ImgDb.Take_Type_ +"','"+Wo_ImgDb.Qty_+"','"+Wo_ImgDb.Unit_+"','"+Wo_ImgDb.Ems_No+"','"+Wo_ImgDb.Pcno+"'"+
                          ")";
                    Command.CommandText=sql;
                    Command.ExecuteNonQuery();

                   
                    this.m_Actor.ShowCurrentValue(j+1);
                    j=j+1;
                   
                    if((j%1000==0) && (j!=0))
                    {
                        this.m_Actor.ShowMessage("成功导入1000条工单领料信息数据!");
                    }
                }
                Command.Dispose();
            }

           
执行5次,每次执行时都重启一下数据库,每次导入8000条数据,执行时间为:
第一次:费时0分2秒609毫秒
第二次:费时0分2秒375毫秒
第三次:费时0分2秒421毫秒
第四次:费时0分2秒562毫秒
第五次:费时0分2秒437毫秒

2)使用存储过程来插入数据,代码如下:

 代码如下 复制代码

                System.Data.OleDb.OleDbCommand Command=conn.CreateCommand();
                Command.CommandTimeout=0;
                Command.Transaction=trans;
                Command.CommandType=CommandType.StoredProcedure;
                    Command.CommandText="SP_InsWOImgList";

                System.Data.OleDb.OleDbParameter [] parameters={ 
                                                                   new System.Data.OleDb.OleDbParameter("wono",OleDbType.VarChar,50)              ,
                                                                   new System.Data.OleDb.OleDbParameter("tradeCo",OleDbType.VarChar,10)              ,
                                                                   new System.Data.OleDb.OleDbParameter("takeDate",OleDbType.VarChar,12)              ,
                                                                   new System.Data.OleDb.OleDbParameter("processNo",OleDbType.VarChar,50)              ,
                                                                   new System.Data.OleDb.OleDbParameter("itemNo",OleDbType.VarChar,50)              ,
                                                                   new System.Data.OleDb.OleDbParameter("takeType",OleDbType.VarChar,10)              ,
                                                                   new System.Data.OleDb.OleDbParameter("qty",OleDbType.VarChar,50)              ,
                                                                   new System.Data.OleDb.OleDbParameter("unit",OleDbType.VarChar,10)              ,
                                                                   new System.Data.OleDb.OleDbParameter("pcno",OleDbType.Integer,4)              ,
                                                                   new System.Data.OleDb.OleDbParameter("emsno",OleDbType.VarChar,12)     };       

                for(int i=0;i<IWo_Img.Count;i++)
                {
                    Wo_Img=IWo_Img[i] as EMS_EDI_WO_IMG;
               
                        Command.Parameters.Clear();
                    Wo_ImgDb.Wo_No=Wo_Img.Wo_No;
                    Wo_ImgDb.Comp_No=Wo_Img.Comp_No;
                    Wo_ImgDb.Take_Date_=Wo_Img.Take_Date;
                    Wo_ImgDb.Ems_No= ems_no;
                    Wo_ImgDb.Process_No=Wo_Img.Process_No;
                    Wo_ImgDb.Item_No_=Wo_Img.Item_No;
                    Wo_ImgDb.Take_Type_=Wo_Img.Take_Type;
                    Wo_ImgDb.Qty_=Wo_Img.Qty.ToString();
                    Wo_ImgDb.Unit_=Wo_Img.Unit;
                    Wo_ImgDb.Pcno=pcsum;

               
                        parameters[0].Value=Wo_ImgDb.Wo_No;
                    parameters[1].Value=Wo_ImgDb.Comp_No;
                    parameters[2].Value=Wo_ImgDb.Take_Date_;
                    parameters[3].Value=Wo_ImgDb.Process_No;
                parameters[4].Value=Wo_ImgDb.Item_No_;
                parameters[5].Value=Wo_ImgDb.Take_Type_;
                    parameters[6].Value=Wo_ImgDb.Qty_;
                parameters[7].Value=Wo_ImgDb.Unit_;
                    parameters[8].Value=Wo_ImgDb.Pcno;
                    parameters[9].Value=Wo_ImgDb.Ems_No;
               
                            for (int k=0;k<10;k++)
                {
                    Command.Parameters.Add(parameters[k]);
                }
               
                    Command.ExecuteNonQuery();

                   
                    this.m_Actor.ShowCurrentValue(j+1);
                    j=j+1;
                   
                    if((j%1000==0) && (j!=0))
                    {
                        this.m_Actor.ShowMessage("成功导入1000条工单领料信息数据!");
                    }
                }
                Command.Dispose();
            }

执行5次,每次执行时都重启一下数据库,每次导入8000条数据,执行时间为:
第一次:费时0分1秒531毫秒
第二次:费时0分1秒656毫秒
第三次:费时0分1秒533毫秒
第四次:费时0分1秒542毫秒
第五次:费时0分1秒551毫秒

存储过程执行/程序中拼sql语句执行

7813/12404=62.99%
程序中拼sql语句执行/存储过程执行
12404/7813=158.76%

 

最后得出结论,存储过程的执行效率要比在程序中拼sql语句的执行效率要高。不过如果总的执行时间很长,如10分钟或是20分钟,这样节省的时间
对用户来说可能没什么太大的感觉,例如由原来的20分钟,缩短到12-13分钟,如果不卡表比照,没什么感觉的。只有当原来是2个小时的导入时间,
现在只要1个小时多一点,这时才会有明显的感觉。至于最后使用哪种方式,自己选择,如果导入时间在20分钟以内,如果不要求性能与效率,
哪种方式都差不多。

时间: 2024-10-05 01:29:24

sql语句执行与直接执行存储过程的效率比较的相关文章

dba-一个sql语句是哪个DBA执行的?

问题描述 一个sql语句是哪个DBA执行的? 有10个DBA,每个人执行10条sql语句,有一条sql语句导致数据丢失,用的都是相同的用户和密码,怎么查出那条sql语句是哪个DBA执行的? 解决方案 看看SQL执行时间.看这个时间段谁在操作数据库.另外可以看看操作的机器名.可以看看哪个数据库,然后找一下对应日志.如果日志没开,那就没办法了. 解决方案二: 要是能区分,还要那么多用户名密码干嘛,干脆所有人都用一个用户名好了. 但是也不是绝对没办法,比如调看门卫的监控录像,把这10个人分开同时审问,

一个客户端程序,有自己的数据库文件,当程序需要升级并且更改数据结构时,SQL语句应该放在哪里执行?

问题描述 一个客户端程序,有自己的数据库文件,当程序需要升级并且更改数据结构时,SQL语句应该放在哪里执行? 如题,开发了一个windows客户端的程序,使用了SQLITE作为数据库,setting.db就是数据库文件.由于客户端升级有时需要更改数据结构,比如加个字段什么的,这个时候就有个问题了,如果要让升级之后原来的数据库文件还能用,需要执行一次更改数据结构的SQL,但是这个更改数据结构的SQL应该放在哪里执行?才能确保它能被执行并且只被执行一次? 解决方案 不知道描述清了没,就是类似发一条S

SQL语句的两次执行问题

     昨天下午,写充值窗口时,出现了SQL语句被执行两次的问题.头痛了一下午和一晚上.     充值的窗口要操作两张表,一张是学生的基本信息表,就是将充值金额写入.另一张表,是用来存放本次充值的信息,比如:充值时间日期,谁充的钱...对前一张表的操作很快就写好了.但是在修改第二张表时,却出现了问题.      先来看一下代码: '修改教师充值表 SQL3 = "insert into tearechargeinfo values('" & strCardNum &

JAVA无法执行SQL语句,在Postgresql中执行正常?不知道什么原因

问题描述 SQL语句如下:java中执行语句如下:sql="selectname,num,asText(geom)asgeom,addressfromhzpbwherehzpb.c_idin(selectc_idfromcitywherec_namelike'%江%')"rs=stmt.executeQuery(sql);在java中就是无值输出 解决方案 解决方案二:该回复于2009-04-13 13:08:35被版主删除解决方案三:子查询里没有值吧

在ASP.NET中用存储过程执行SQL语句

  存储过程:是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程.by google 存储过程执行效率比单独的SQL语句效率高. 样编写存储过程?存储过程在SQL Server 2005对应数据库的可编程性目录下. 比如,创建一个存储过程 create procedure procNewsSelectNewNews as begi

sql-Sql存储过程 通过判断执行不同SQL语句

问题描述 Sql存储过程 通过判断执行不同SQL语句 先判断当前时间,如果是0点到08点之间,就执行第一条sql语句,否则就执行第二条sql语句我就知道用case when去判断,但是 then 后面怎么写?难道要用一个变量装SQLy语句?然后分别给他赋值? 比如举个例子:当前时间是早5点,就执行 (select * from A)时间是16点,就执行(select * from B) 新人没有币,求好心人解答一下 ,谢谢 解决方案 类似 if @time = 8begin select * f

MySQL存储过程中实现执行动态SQL语句的方法_Mysql

本文实例讲述了MySQL存储过程中实现执行动态SQL语句的方法.分享给大家供大家参考.具体实现方法如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE set_col_value -> (in_table VARCHAR(128), -> in_column VARCHAR(128), -> in_new_value VARCHAR(1000), -> in_where VARCHAR(4

MySQL 存储过程中执行动态SQL语句的方法_Mysql

drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500); set my_sqll='select * from aa_list'; set @ms=my_sqll; PREPARE s1 from @ms; EXECUTE s1; deallocate prepare s1; end; 以上是小编为您精心准备的的内容,在的博客.问答.公众号.

在ASP.NET中用存储过程执行SQL语句_实用技巧

存储过程执行效率比单独的SQL语句效率高. 样编写存储过程?存储过程在SQL Server 2005对应数据库的可编程性目录下. 比如,创建一个存储过程 复制代码 代码如下: create procedure procNewsSelectNewNews as begin select top 10 n.id,n.title,n.createTime,c.name from news n inner join category c on n.caId=c.id order by n.createT

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

第1部分 重新认识C语言 如何在C语言里面执行SQL语句? [文章摘要]         在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句.         本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词]          SQL语句  C语言  程序  流程  开发   一.为什么要在C语言程序中执行SQ