0

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

[/编辑]

请帮忙

提前致谢

4

3 回答 3

0

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

Timeout=60;

例子:

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

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

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

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

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

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

于 2013-03-26T09:58:19.117 回答
0

您也可以在 IIS 中修改它,

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

您必须考虑查询的性能

于 2013-03-26T09:59:54.947 回答
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

更新

根据您的其他问题,可以删除相关的子查询并用子查询替换。

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

于 2013-03-26T10:11:07.523 回答