批處理SQL語句的執(zhí)行效率提高的方法
下面為您介紹批處理SQL語句的執(zhí)行效率提高的方法,供您參考,如果您在大量數(shù)據(jù)集中執(zhí)行操作的優(yōu)化方面遇到過問題,不妨一看,相信會(huì)對(duì)您學(xué)習(xí)SQL語句的優(yōu)化會(huì)大有幫助。
如果你的項(xiàng)目要求你的程序?qū)Ω哌_(dá)幾萬條的數(shù)據(jù)在集中的時(shí)間內(nèi)執(zhí)行固定序列的操作,且不能完全使用存儲(chǔ)過程時(shí)而需要使用程序來執(zhí)行時(shí)。會(huì)需要這些優(yōu)化。
我們知道,SQL服務(wù)器對(duì)一條語句的執(zhí)行,需要分析、編譯、執(zhí)行這些步驟,通過參數(shù)化我們可以對(duì)一種命令只分析和編譯一次,而執(zhí)行多次,從而提高效率。在執(zhí)行時(shí),如果每次提交語句,可以完成多條SQL語句,則可以減少通訊時(shí)間,也可以提高效率。
通過 System.Data.IDbCommand.Prepare() 方法,我們可以在第一次執(zhí)行語句時(shí),分析和編譯SQL語句,然后保存這個(gè)Command對(duì)象,下次使用時(shí),直接設(shè)置參數(shù)執(zhí)行。這個(gè)方法對(duì)Oracle和MsSql Server都有效。
如果執(zhí)行一批語句,在T-SQL和PLSQL中有一點(diǎn)不一樣。
在T-SQL中,多條SQL語句之間,使用分號(hào)";"分隔就行。
delete from TableA where id = @id;update TableB set Name=@name where id=@id
而在PLSQL中,則需要用 begin ... end; 包起來,中間語句用分號(hào)";"分隔。
begin delete from TableA where id = :id;update TableB set Name=:name where id=:id; end;
相信這樣做之后,你的效率會(huì)有幾倍或者十幾倍的提升。當(dāng)然,你還可以對(duì)只是查而修改的表,做一下緩存處理,來減小訪問數(shù)據(jù)庫的次數(shù)。
下面我示例一下訪問Oracle執(zhí)行PLSQL的一個(gè)函數(shù)的例子:
private void DeleteFlowInstanceData(string flowinstanceid)
{
OracleCommand cmd = this.cmdDeleteFlowInstanceData;
if(cmd == null)
{
//生成SQL
StringBuilder sb = new StringBuilder();
sb.Append("begin ");
sb.Append(@"delete from bak_WF_Log_EngineLog where FlowInstanceID= :instanceId;");
sb.Append(@"delete from bak_WF_Log_ErrLog where FlowInstanceID= :instanceId;");
sb.Append(@"delete from WF_Running_MsgForEngineBak where FlowInstanceID= :instanceId;");
sb.Append(@"delete from bak_WF_Running_MsgForUser where FlowInstanceID= :instanceId;");
sb.Append(@"delete from bak_WF_Running_FlowActivity where FlowInstanceID= :instanceId;");
sb.Append(@"delete from bak_WF_Running_FlowData where FlowInstanceID= :instanceId;");
sb.Append(@"delete from bak_WF_Running_FlowInstance where FlowInstanceID= :instanceId;");
sb.Append("end;");
//準(zhǔn)備 DbCommand
this.cmdDeleteFlowInstanceData = cmd = new OracleCommand();
cmd.Connection = this.connEngine;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sb.ToString();
cmd.Parameters.Clear();
cmd.Parameters.Add("instanceId", OracleType.VarChar,250);
//準(zhǔn)備一下以提高性能。
cmd.Prepare();
}
//設(shè)置參數(shù)
cmd.Parameters["instanceId"].Value = flowinstanceid;
//設(shè)置事務(wù)
cmd.Transaction = this.tranEngine;
cmd.ExecuteNonQuery();
}
【編輯推薦】