面對大量資料集中處理需求,兩大關鍵:
IDbCommand.Prepare() 讓 SQL 只編譯一次,多次執行只換參數。DELETE FROM TableA WHERE id = @id; UPDATE TableB SET Name=@name WHERE id=@id
BEGIN ... END; 區塊。
BEGIN DELETE FROM TableA WHERE id = :id; UPDATE TableB SET Name=:name WHERE id=:id; END;
private void DeleteFlowInstanceData(string flowInstanceId)
{
OracleCommand cmd = this.cmdDeleteFlowInstanceData;
if (cmd == null)
{
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("END;");
cmd = new OracleCommand(sb.ToString(), this.connEngine);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("instanceId", OracleType.VarChar, 250);
cmd.Prepare(); // 關鍵:預編譯
this.cmdDeleteFlowInstanceData = cmd;
}
cmd.Parameters["instanceId"].Value = flowInstanceId;
cmd.Transaction = this.tranEngine;
cmd.ExecuteNonQuery();
}
結合參數化與批次,典型場景可獲 數倍至十倍以上 的效能提升。輔以熱點資料快取,可進一步降低資料庫壓力。