热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

最近对于一个旧的程序的导入进行优化,不过由于这个导入程序原来是直接在程序中使用拼SQL语句执行导入,执行时间较长,一般要十分钟左右。

最近对于一个旧的程序的导入进行优化,不过由于这个导入程序原来是直接在程序中使用拼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 {
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 {
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分钟以内,如果不要求性能与效率,
哪种方式都差不多。

推荐阅读
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 本文探讨了如何在SQL Server Reporting Services (SSRS)中利用TOP N功能来筛选和展示数据集中的前N条记录。通过正确的配置图表属性中的筛选器设置,可以轻松实现这一目标。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文探讨了MySQL中的死锁现象及其监控方法,并介绍了如何通过配置和SQL语句调整来优化数据库性能。同时,还讲解了慢查询日志的配置与分析技巧。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 数据输入验证与控件绑定方法
    本文提供了多种数据输入验证函数及控件绑定方法的实现代码,包括电话号码、数字、传真、邮政编码、电子邮件和网址的验证,以及报表绑定和自动编号等功能。 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中查询重复数据,并提供了多种方法来筛选和删除重复记录,包括基于单个字段和多个字段的重复数据处理。 ... [详细]
  • 美团安全响应中心推出全新配送业务测试活动,带来双重福利,邀您共同参与! ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
author-avatar
zoooooz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有