增加 SQL 命令的命令超时
Posted
技术标签:
【中文标题】增加 SQL 命令的命令超时【英文标题】:Increasing the Command Timeout for SQL command 【发布时间】:2013-08-28 16:57:51 【问题描述】:我有一个小问题,希望有人能给我一些建议。我正在运行一个 SQL 命令,但由于有很多数据,这个命令似乎需要大约 2 分钟才能返回数据。但是默认连接时间是 30 秒,我如何增加这个,并将它应用到这个命令?
public static DataTable runtotals(string AssetNumberV, string AssetNumber1V)
DataTable dtGetruntotals;
try
dtGetruntotals = new DataTable("Getruntotals");
//SqlParameter AssetNumber = new SqlParameter("@AssetNumber", SqlDbType.VarChar, 6);
//AssetNumber.Value = AssetNumberV;
SqlParameter AssetNumber = new SqlParameter("@AssetNumber", SqlDbType.VarChar, 10);
AssetNumber.Value = AssetNumberV;
SqlParameter AssetNumber1 = new SqlParameter("@AssetNumber1", SqlDbType.VarChar, 10);
AssetNumber1.Value = AssetNumber1V;
SqlCommand scGetruntotals = new SqlCommand("EXEC spRunTotals @AssetNumber,@AssetNumber1 ", DataAccess.AssetConnection);
// scGetruntotals.Parameters.Add(AssetNumber);
scGetruntotals.Parameters.Add(AssetNumber);
scGetruntotals.Parameters.Add(AssetNumber1);
SqlDataAdapter sdaGetruntotals = new SqlDataAdapter();
sdaGetruntotals.SelectCommand = scGetruntotals;
sdaGetruntotals.Fill(dtGetruntotals);
return dtGetruntotals;
catch (Exception ex)
MessageBox.Show("Error Retriving totals Details: Processed with this error:" + ex.Message);
return null;
【问题讨论】:
考虑将超时值也添加到配置文件中,否则任何调整都意味着代码重新部署。 【参考方案1】:由于数据量很大,这条命令大约需要2分钟才能返回数据
可能是糟糕的设计。考虑在这里使用分页。
默认连接时间是 30 秒,如何增加这个时间
由于您的命令面临超时,因此您需要增加sql command 的超时时间。您可以像这样在命令中指定它
// Setting command timeout to 2 minutes
scGetruntotals.CommandTimeout = 120;
【讨论】:
不客气,那就接受吧。虽然我会认真避免使用需要 2 分钟的查询。尝试使用分页。 @ManishKumarSingh 谁会等待 10 分钟让查询返回结果?这是一个毫秒的时代。 @Ehsan 当您或一小群人是唯一使用该软件的人时,查询一年只运行几次。在这些情况下通常不值得优化。 (不过,在编写后端公司软件时,一些精心设计的索引可以保护您的理智。) @Ehsan 我不敢苟同.....我有类似的情况,可以在生产中正确运行(几秒钟),但是在测试服务器上被剥离并由多个资源共享它结束了30秒。在这种情况下,延长超时没有任何问题。 糟糕的设计?不总是。在以前的工作场所,当我们不得不对生产进行维护时,我们切换到备份数据库。在此期间,即使在我们恢复到备份服务器时保留了统计信息,我们也会遇到超时。当某些查询运行时间更长时,它们有时会生成不同的执行计划,因此我们延长了 DR / 备份服务器上的配置超时,即使它们与生产环境基本相同。无法保证您将拥有相同的执行计划。我们在恢复后尝试了 FULL SCAN,但没有成功。【参考方案2】:添加SqlCommand
的超时时间。请注意时间以秒为单位。
// Setting command timeout to 1 second
scGetruntotals.CommandTimeout = 1;
【讨论】:
将超时时间增加到 10 分钟或 30 分钟有什么缺点吗? Manish,您是要等待 10 分钟还是 30 分钟让进程获取数据?如果它是一夜之间的过程并且它是唯一的事情并且不会干扰其他任何地方,30 分钟为什么不呢。或者,如果您不等待结果,为什么不呢。【参考方案3】:由于响应需要 2 分钟,您可以通过添加以下代码将超时时间增加到 3 分钟
scGetruntotals.CommandTimeout = 180;
注意:参数值以秒为单位。
【讨论】:
【参考方案4】:将命令超时设置为 2 分钟。
scGetruntotals.CommandTimeout = 120;
但是您可以优化您的存储过程以减少该时间! 喜欢
删除 courser 或 while 等 使用分页 使用#tempTable 和@variableTable 优化连接表【讨论】:
【参考方案5】:不建议将 CommandTimeout 设置为 120。尝试使用上面提到的分页。将 CommandTimeout 设置为 30 被认为是正常的。除此之外的任何事情都被认为是不好的方法,并且通常会得出实施有问题的结论。现在世界正在运行 MiliSeconds 方法。
【讨论】:
这是一个好点,但有时分页是不可能的。例如 csv 导出或类似文件下载。 错了:“将 CommandTimeout 设置为 30 被认为是正常的。除此之外的任何东西都被认为是不好的方法,这通常会导致实施出现问题。” @MertAkcakaya - 我可以知道为什么吗? @PranavKulshrestha 没有一般意见或正当理由说将命令超时设置为超过 30 是不好的方法。我们有很多存储过程需要超过 30 秒才能执行。 @MertAkcakaya 这是真的。没有这样的技术文件。我根据我们遵循的通用标准发表了评论。不过谢谢以上是关于增加 SQL 命令的命令超时的主要内容,如果未能解决你的问题,请参考以下文章
处理 ClientInsertServerInsert 同步冲突时出现 SQL 命令“超时”异常
在 Access 前端中为链接的 SQL 表/视图设置命令超时