關於拼sql語句執行與直接執行存儲過程的效率比較

 

1.關於拼sql語句執行與直接執行存儲過程的效率比較

最近對於一箇舊的程序的導入進行優化,不過由於這個導入程序原來是直接在程序中使用拼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分鐘以內,如果不要求性能與效率,
哪種方式都差不多

發佈了92 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章