我写了一个超过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
[/编辑]
请帮助
先谢谢
答案 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
由于上述速度较慢,您还可以尝试以下操作。
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添加索引,以提高效果。