以下过程 insert_attach
在 dbms 上花费 不到一秒
但通过 asp.net 方法运行它需要大约 7 秒
! ! :
public static int InsertAttach(int taskCode, int transYear, int transSerial, int empNum)
{
using (IfxConnection con = new IfxConnection(ConfigurationSettings.AppSettings["cmr"].ToString()))
{
int res = 0;
StringBuilder cmdTxt = new StringBuilder();
cmdTxt.Append("insert_attach");
using (var myIfxCmd = new IfxCommand(cmdTxt.ToString(), con))
{
myIfxCmd.CommandType = CommandType.StoredProcedure;
myIfxCmd.Parameters.Add("al_task_code", IfxType.Integer);
myIfxCmd.Parameters.Add("al_trans_year", IfxType.Integer);
myIfxCmd.Parameters.Add("al_trans_serial", IfxType.Integer);
myIfxCmd.Parameters.Add("al_emp_num", IfxType.Integer);
myIfxCmd.Parameters[0].Value = ((object)taskCode) ?? DBNull.Value;
myIfxCmd.Parameters[1].Value = ((object)transYear) ?? DBNull.Value;
myIfxCmd.Parameters[2].Value = ((object)transSerial) ?? DBNull.Value;
myIfxCmd.Parameters[3].Value = ((object)empNum) ?? DBNull.Value;
if (con.State == ConnectionState.Closed)
{
con.Open();//takes no time
}
object obj = myIfxCmd.ExecuteScalar();//takes longer time !!
if (obj != null && !string.IsNullOrEmpty(obj.ToString()))
{
res = int.Parse(obj.ToString());
}
}
con.Close();
con.Dispose();
return res;
}
}
我的程序:
CREATE PROCEDURE insert_attach(
al_task_code INT,
al_trans_year INT,
al_trans_serial INT,
al_emp_num INT
)
returning INT;
define ll_state_serial , ll_prev_trans integer;
define ls_values_key VARCHAR(60);
define lbt_file_content , lbt_file_signed , lbt_file_null , lbt_file, lbt_file_origin REFERENCES byte;
let lbt_file_null = NULL;
SELECT a.new_state_serial,
values_key,
a.prev_trans INTO ll_state_serial,
ls_values_key,
ll_prev_trans
FROM crm_trans a
WHERE a.task_code = al_task_code
AND a.trans_year = al_trans_year
AND a.trans_serial = al_trans_serial;
DELETE
FROM crm_tempdetails
WHERE temp_serial IN (SELECT temp_serial
FROM crm_tempsigned
WHERE task_code = al_task_code
AND values_key = ls_values_key
AND emp_num = al_emp_num);
DELETE
FROM crm_tempsigned
WHERE task_code = al_task_code
AND values_key = ls_values_key
AND emp_num = al_emp_num
AND serial != 0;
-- insert into temp
INSERT INTO crm_tempsigned
(
task_code,
values_key,
trans_year,
trans_serial,
serial,
file_type,
file_content,
file_signed,
emp_num,
doc,
selected
)
SELECT a.task_code,
ls_values_key,
a.trans_year,
a.trans_serial,
a.serial,
a.file_type,
a.attach_content,
lbt_file_null,
al_emp_num,
a.doc,
1
FROM crm_taskattachements a,
crm_trans b
WHERE a.task_code = b.task_code
AND a.trans_serial = b.trans_serial
AND a.trans_year = b.trans_year
AND a.task_code = al_task_code
AND b.trans_year = al_trans_year
AND b.prev_trans = ll_prev_trans
AND b.values_key = ls_values_key
AND (
a.serial IN (SELECT x.file_serial
FROM crm_attachdetails x
WHERE x.task_code = a.task_code
AND x.trans_serial = a.trans_serial
AND x.trans_year = a.trans_year
AND x.emp_num = al_emp_num)
OR 0 = (
SELECT COUNT(*)
FROM crm_attachdetails x
WHERE x.task_code = a.task_code
AND x.trans_serial = a.trans_serial
AND x.trans_year = a.trans_year
)
);
RETURN 1;
END PROCEDURE
最佳答案
这个问题目前只能由您来回答。您需要分析您的应用程序,报告会准确告诉您哪个部分需要多长时间。
从那里开始,您可以开始调查为什么某些事情需要很长时间,然后您可以提出一个具体的问题,我们可能会帮助您解决。现在有一大块代码,你说的是它需要 7 秒。我们只能玩猜谜游戏,不是吗?
老实说,我什至不知道你是怎么得到7秒的?您是否在您的代码中放置了一个计时器,如果是的话,您是否看过墙上的时钟等等?
请查看 Profiler。一个流行的解决方案是 DotTrace: https://www.jetbrains.com/profiler/
关于c# - 为什么通过 ASP.NET 方法运行查询比 native SQL 花费更长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717700/