【问题标题】:SQl Server still getting the error of "Timeout expired. The timeout period elapsed"SQl Server 仍然收到“Timeout expired. The timeout period elapsed”的错误
【发布时间】:2020-11-27 15:42:17
【问题描述】:

我以为我刚刚在 here 的帖子中发现了一个 sql 错误...(错误消息:超时已过期。在操作完成之前超时时间已过或服务器没有响应。”)我正在尝试使用 Visual Studio 中的数据库工具运行它......不是管理工作室,也不是通过客户端代码/ADO(还)。我重写了一个相当简单的查询,它使用了几个自定义函数......函数以及查询的部分已经过测试并且运行良好,但是下面的查询超时..这确实完全按照在 Management Studio 中键入的方式运行,大约需要 4 分钟。正如我在另一篇文章中提到的,我根据此帖子将工具>选项>设计器>“覆盖连接字符串超时值”下的设置更改为 120 秒,但是......它仍然在 30 秒后超时。在这个最新版本中添加 ISNULL 是更改是否在管理工作室中运行。

SELECT Symbol, LatestDate
FROM (SELECT Symbol, ISNULL(dbo.LatestDateInDailyPricingVolBySymbol(Symbol), '1/1/1900') AS LatestDate FROM tblSymbolsMain) AS T2
WHERE (LatestDate < dbo.RecentTradingDateByNumber(3))

总体思路是取回在我的每日定价表中至少 3 天没有对应数据点的股票代码子集。有接盘侠吗?谢谢大家。

【问题讨论】:

    标签: sql-server sql-server-2008 tsql


    【解决方案1】:

    不考虑你的超时时间;

    您是否使用 sql 管理控制台来运行查询?如果是这样,当连接到数据库时,有一个选项按钮允许设置超时。

    另外,如果在查询窗口中,右键单击并选择查询选项......

    0,表示无限制,我会检查这些。 4 分钟是很长的时间,也许可以重构查询以更快地运行?

    如果您通过 C# 在 Visual Studio 中运行此命令,则默认命令超时为 30 秒。通过设置命令超时来改变它:

    SqlCommand comm= new SqlCommand();
    comm.CommandTimeout = 300;
    

    【讨论】:

    • 正如我提到的,它在 Management Studio 中运行但需要一段时间......我正在尝试使用 Visual Studio 2010 中的 sql 工具运行它。
    • @StatsViaCsh - 必须是 VS2010 内部类似于 SQL Server 管理控制台的设置。如果生成了代码,可以通过代码进行调整,但也许右键单击查询屏幕,或某处的选项?对不起,我不使用VS2010来运行查询,只是使用SQL Server管理控制台,所以我对那些屏幕不熟悉。
    • @StatsViaCsh - 看了一下VS2010,我可以设置连接超时,但找不到命令超时。我会尝试使用代码而不是使用该工具,看起来它正在使用无法轻易更改的默认值。
    • 谢谢...直到您提出建议,我才开始寻找它,但是在 Visual Studio 中的工具> 选项> 数据库工具下有一组选项。我改变了它,它运行了..在将近五分钟的过程中! :) 现在可以了。
    【解决方案2】:

    如果查询花费了这么长的时间,那么它可能是有问题的。我会声明一个变量来存储RecentTradingDateByNumber。所以它看起来像这样:

    DECLARE @RecentTrandingDateByNumber DATETIME
    SET @RecentTrandingDateByNumber=dbo.RecentTradingDateByNumber(3)
    
    SELECT 
        tblSymbolsMain.Symbol, 
        MAX(tblSymbolsMain.TradeDate)
    FROM 
        tblSymbolsMain
    GROUP BY 
        Symbol
    HAVING 
        MAX(TradeDate) < @RecentTrandingDateByNumber
    

    要查看管理工作室中的执行情况,请转到“查询/包含实际执行计划”。 如果您还想查看查询的流量、选择的数量等。您还可以包括客户端统计信息。 "查询/包含客户端统计信息"

    如果您想了解有关检查查询执行的更多信息,请参阅 here

    【讨论】:

      【解决方案3】:

      让我担心的是,您的例行程序需要 4 分钟才能开始。这似乎是一个非常简单的查询,假设函数执行它们看起来所做的事情,并且通过索引和适当的表设计,它应该比这更快地返回。

      您是否查看过此查询的执行计划:

      SELECT Symbol, MAX(TradeDate)
      FROM tblSymbolsMain
      GROUP BY Symbol
      HAVING MAX(TradeDate) < dbo.RecentTradingDateByNumber(3)
      

      标量函数在具有大量行的集合上重复调用时可能会出现性能问题,并且还会损害可搜索性。

      【讨论】:

      • 感谢您的回复。它确实看起来很长!我还没有查看我的执行计划......我不确定如何。我的想法是让它成为一个可以设置函数值的存储过程: dbo.RecentTradingDateByNumber(3) 一次,但我不知道细微的变化会使其符合要求。如果您有进一步的推动,我会全力以赴。
      • @StatsViaCsh 在 Management Studio 中,有一个用于查看执行计划的菜单选项。有一本免费的电子书会告诉你如何理解一个糟糕的执行计划是什么样的:simple-talk.com/books/sql-books/sql-server-execution-plans
      【解决方案4】:

      有时我会抽空。但有时它会在几秒钟内执行。 我一直在更改数据类型时出现超时错误,这是不可取的。

      例如。如果您的查询有条件日期时间。将数据类型更改为仅日期。其他选项是日期数据类型到日期时间数据类型。我知道这不是正确的方法。但它对我有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多