以編程方式使用批語(yǔ)句節(jié)省 數(shù)據(jù)庫(kù)IO來(lái)提高性能
發(fā)表時(shí)間:2024-01-25 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]大家都知道在程序中盡量少和數(shù)據(jù)庫(kù)交互是可以 提高程序性能的,以下舉一個(gè)比較常見(jiàn)的例子如:需要根據(jù) 某條件判斷條記錄是否存在 如果不存在就 插入的這種操作。一般都會(huì)用 2 次數(shù)據(jù)庫(kù)io , 1次取 Count 如果=0 就 INSERT INTO 其實(shí)在 Oracle, 或 SQL Service等...
大家都知道在程序中盡量少和數(shù)據(jù)庫(kù)交互是可以 提高程序性能的,以下舉一個(gè)比較常見(jiàn)的例子
如:需要根據(jù) 某條件判斷條記錄是否存在 如果不存在就 插入的這種操作。
一般都會(huì)用 2 次數(shù)據(jù)庫(kù)io , 1次取 Count 如果=0 就 INSERT INTO 其實(shí)在 Oracle, 或 SQL Service
等大型數(shù)據(jù)庫(kù)中可以使用批 SQL 語(yǔ)句節(jié)省數(shù)據(jù)庫(kù) IO(和數(shù)據(jù)庫(kù)的交互).
以下例子是一個(gè)簡(jiǎn)單的的演示執(zhí)行一次數(shù)據(jù)庫(kù) io(演示使用C# + Oracle數(shù)據(jù)庫(kù)演示,其他語(yǔ)言或 SQLService 也差不多),
適合使用在寫存儲(chǔ)過(guò)程沒(méi)太大意義的時(shí)候。
測(cè)試代碼如下:(注意,測(cè)試用的SQL語(yǔ)句中注釋過(guò)多會(huì)影響性能,實(shí)際使用不用這么多注釋)
語(yǔ)句比較簡(jiǎn)單,所以沒(méi)有把表結(jié)構(gòu)貼出來(lái),數(shù)據(jù)庫(kù)連接部分省略。
//使用批 SQL 執(zhí)行(但不能換行和回車 \r\n 不行 \n 可以)
//C# 可以用 @ 可以直接換行,VB 寫這樣的比較郁悶所以用C# 作演示
const string ExecSQl=
@"Declare
var_bbsitemid VARCHAR2(12) :=:IpBbsitemid ;/*傳入?yún)?shù)*/
var_userid VARCHAR2(20) := :IpUserid ;/*傳入?yún)?shù)*/
var_counts NUMBER(10);
BEGIN
/*根據(jù)條件取記錄條數(shù)*/
SELECT COUNT(t.bbsitemid) INTO var_counts
FROM ST_BBSMRKTRSLTCHK t
WHERE t.userid = var_userid AND t.bbsitemid = var_bbsitemid;
/* Oracle 打印不知道怎么看 nnd */
Dbms_Output.put_line('Count:' var_counts);
/*如果是0條就插入*/
IF var_counts = 0 THEN
INSERT INTO ST_BBSMRKTRSLTCHK(BBSITEMID, USERID, READFLG, LASTMODIFIED)
VALUES (var_bbsitemid, var_userid, 0, SYSDATE);
END IF;
END;" ;
//auto --commit;
//必須把\r (換行符)去掉 否則 Oracle 不認(rèn)而且會(huì)報(bào)錯(cuò)。
this.cmd.CommandText = ExecSQl.Replace("\r",string.Empty);
cmd.Parameters.Clear();
OracleParameter Par;
//傳參數(shù)
Par = cmd.Parameters.Add(":IpBbsitemid",OracleType.VarChar);
Par.Value="0012";
Par = cmd.Parameters.Add(":IpUserid",OracleType.VarChar);
Par.Value="DEF";
try
{
//如果執(zhí)行批每次返回都是1 如果想得到真正的更新條數(shù)就要用Out的 OracleParameter 了
int returnVar = cmd.ExecuteNonQuery();
MessageBox.Show("執(zhí)行成功");
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}