如何增加ASP.Net的执行时间

时间:2013-03-26 09:55:57

标签: asp.net mysql

我写了一个超过30秒的查询。

我的代码:

MySqlConnection myConnection = new    MySqlConnection(ConfigurationSettings.AppSettings["CollectiveIntelligence"]);

    string query = @"SELECT TBL.NAME1,
                           TBL.NAME2 
                      FROM (SELECT MLD1.LOGIN_NAME AS NAME1,
                                   MLD2.LOGIN_NAME AS NAME2 
                              FROM FEDERATED_M_LOGIN_DETAILS MLD1 
                              JOIN FEDERATED_M_LOGIN_DETAILS MLD2 
                             WHERE MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
                          ORDER BY NAME1,NAME2) TBL
                     WHERE NOT EXISTS (SELECT USER_NAME1,
                                              USER_NAME2 
                                         FROM CONNECTION C
                                        WHERE (C.USER_NAME1 = TBL.NAME1 AND C.USER_NAME2 = TBL.NAME2));";

    MySqlCommand myCommand = new MySqlCommand(query, myConnection);

    //Open Connection
    myConnection.Open();
    myCommand.CommandTimeout = 0;
    MySqlDataReader reader = myCommand.ExecuteReader();

    DataTable dt = new DataTable();
    dt.Load(reader);

    GridView1.DataSource = dt;
    GridView1.DataBind();

    myConnection.Close();
    reader.Close();

发生错误

    MySqlDataReader reader = myCommand.ExecuteReader();

错误消息:超时已过期。操作完成之前经过的超时时间或服务器没有响应

如何增加asp.net的执行超时,以便它执行查询/

[编辑]

当我点击解释它的显示时如此

id select_type  table   type   possible_keys   key              key_len   ref   rows   Extra
1, SIMPLE,      MLD1,   ALL,   ,               ,                 ,         ,    295,   Using temporary; Using filesort
1, SIMPLE,      MLD2,   ALL,   ,               ,                 ,         ,    295,   Using where; Using join buffer
1, SIMPLE,      C,      index, ,               INDEX_CONNECTION, 94,       ,    30754,   Using where; Using index; Not exists

[/编辑]

请帮助

先谢谢

3 个答案:

答案 0 :(得分:0)

我会将它添加到您的配置文件中,以便您可以根据应用程序控制它。因此,在连接字符串中添加

Timeout=60;

示例:

“数据来源=来源;初始目录= cata;超时= 60;等”

然后,在您的代码中,您可以调用它。

myCommand .CommandTimeout = ConfigurationManager.AppSettings["CommandTimeOut"]

我还建议您考虑一下您的SQL脚本是否有效!如果可以在其他地方解决这些设置,则没有必要更改这些设置。在服务器上本地运行命令,看看它是否需要很长时间才能排除任何其他问题。

要在Visual Studio中更改超时,请打开“工具 - &gt;选项”,然后在“数据库工具 - 查询和查看设计器”下。在这里,您可以更改计时,甚至禁用取消长时间运行查询的选项。

表和数据库设计人员部分也存在时间(仍在数据库工具下)

答案 1 :(得分:0)

您也可以在IIS中修改它,

select your website > advanced settings >limits > connection Time out

您必须考虑查询的效果

答案 2 :(得分:0)

您的查询正在执行带过滤器的选择,对结果集进行排序,然后再次过滤。最好先过滤它然后将排序应用于简化的结果集。这样可以减少查询所需的时间,从而避免超时。

SELECT MLD1.LOGIN_NAME AS NAME1, MLD2.LOGIN_NAME AS NAME2 
FROM FEDERATED_M_LOGIN_DETAILS MLD1 
JOIN FEDERATED_M_LOGIN_DETAILS MLD2 ON MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
WHERE NOT EXISTS (SELECT USER_NAME1, USER_NAME2 
                FROM CONNECTION C
                WHERE C.USER_NAME1 = MLD1.NAME1 AND C.USER_NAME2 = MLD2.NAME2)
               )
ORDER BY MLD1.LOGIN_NAME, MLD2.LOGIN_NAME

更新

根据您的其他question,相关的子查询可以被移除并替换为子查询。

SELECT MLD1.LOGIN_NAME AS NAME1, MLD2.LOGIN_NAME AS NAME2 
FROM FEDERATED_M_LOGIN_DETAILS MLD1 
JOIN FEDERATED_M_LOGIN_DETAILS MLD2 ON MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
WHERE (MLD1.LOGIN_NAME + MLD2.LOGIN_NAME) NOT IN 
                     (SELECT USER_NAME1 + USER_NAME2 FROM CONNECTION C )
ORDER BY MLD1.LOGIN_NAME, MLD2.LOGIN_NAME

更新2

由于上述速度较慢,您还可以尝试以下操作。

SELECT MLD1.LOGIN_NAME AS NAME1, MLD2.LOGIN_NAME AS NAME2 
FROM FEDERATED_M_LOGIN_DETAILS MLD1 
JOIN FEDERATED_M_LOGIN_DETAILS MLD2 ON MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
LEFT OUTER JOIN CONNECTION C ON C.USER_NAME1 = MLD1.NAME1 AND C.USER_NAME2 = MLD2.NAME2
WHERE C.USER_NAME1 is null and C.USER_NAME2 is null
ORDER BY MLD1.LOGIN_NAME, MLD2.LOGIN_NAME

您可能需要向FEDERATED_M_LOGIN_DETAILS.LOGIN_NAME,CONNECTION.USER_NAME1和CONNECTION.USER_NAME2添加索引,以提高效果。