c# - 为什么通过 ASP.NET 方法运行查询比 native SQL 花费更长的时间?

标签 c# asp.net stored-procedures ado.net informix

以下过程 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/

参见:Profiling C# / .NET applications

关于c# - 为什么通过 ASP.NET 方法运行查询比 native SQL 花费更长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717700/

相关文章:

c# - 项目或单独项目中的命名空间

c# - 如何流式传输字节数组图像?

c# - 一个存储过程也可以更新整个表或单个列

sql-server-2005 - 触发器是否可以找到修改数据的存储过程的名称?

javascript - 通过 Node.JS 函数调用 mySQL 存储过程的问题

c# - 使用 RSA C# 签名和验证签名

c# - 阅读 iso-8859-1 rss 提要 C# WP7

c# - asp.net中如何使用Session List<T>存储值

c# - 更新数据库失败,因为它是只读的

c# - 如何在轮盘赌中将球停在特定数字