【问题标题】:How to increase the execution time of ASP.Net如何增加 ASP.Net 的执行时间
【发布时间】:2013-03-26 09:55:56
【问题描述】:

我写了一个查询,需要 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

[/编辑]

请帮忙

提前致谢

【问题讨论】:

  • 在您的查询中,您在没有任何条件的情况下加入表,这会导致交叉连接和较长的执行时间。先尝试优化你的查询,不需要增加执行时间..
  • @Meherzad:我已经问过这个问题如何减少时间链接:stackoverflow.com/questions/15616638/…

标签: asp.net mysql


【解决方案1】:

你也可以在IIS中修改,

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

您必须考虑查询的性能

【讨论】:

  • 有高级设置的地方可以请你提供路径以便我可以到达那里我没有找到高级设置在我的情况下
  • 在 IIS 的左侧窗格中点击您的网站,您可以在右侧窗格中看到“高级属性”
【解决方案2】:

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

Timeout=60;

例子:

"数据源=source;初始目录=cata;超时=60;等"

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

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

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

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

表和数据库设计器部分也有一个超时(仍在数据库工具下)

【讨论】:

  • 我尝试了 60 秒,但它不起作用。我在某处读到,如果我们写 0,那么它将执行到最后意味着没有执行时间
  • 您是在 Visual Studio 的调试模式下还是在实时模式下收到此错误?当您在本地运行此查询时,您是否遇到相同的错误?
  • Visual Studio 中的调试模式。未上传到直播
  • @user1926138 在 MySql 中运行查询需要多长时间
  • 是的。在 mysql 工作台中也显示错误。我提出了一个问题。请通过它。在 mysql 中,它也需要更多时间,所以它显示错误,如 MySQL 服务器已消失 stackoverflow.com/questions/15631189/…
【解决方案3】:

您的查询正在执行带有过滤器的选择,对结果集进行排序,然后再次对其进行过滤。最好先过滤它,然后将排序应用于减少的结果集。这将减少您的查询所花费的时间,因此您不会遇到超时。

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 添加索引以提高性能。

【讨论】:

  • 请通过此链接这是我的要求。stackoverflow.com/questions/15616638/…
  • 第二个查询(使用 + 运算符)比使用存在的第一个查询花费更多时间。
  • 在我的 mysql 工作台中,第三个查询也需要 30.498 秒。
  • 您是否尝试过按照我的建议为 MySql 中的列添加索引?
  • 是的,我已经为列添加了索引。我已经更新了我的问题,请查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多