【问题标题】:C# reading from Azure SQL function extremely slowC# 从 Azure SQL 函数读取速度极慢
【发布时间】:2021-05-26 18:32:30
【问题描述】:

这似乎很可能是某种 Azure SQL 问题,但我不知道发生了什么。我有一些代码可以从这样的 SQL 函数中读取数据:

using SqlConnection myConnection = new SqlConnection(connstr);
myConnection.Open();

using SqlCommand command = new SqlCommand(@"SELECT * FROM [dbo].[function] (@param)", myConnection);
command.Parameters.Add(new SqlParameter("@param", param));

using SqlDataAdapter da = new SqlDataAdapter(command);

DataTable dt = new DataTable();
da.Fill(dt);

我在这里使用该函数,因此我不需要在 C# 代码中编写相当复杂的 SQL 查询。当我通过 SSMS 运行该功能时,它会在几秒钟内运行。上周从 C# 运行时也是如此。然而,由于某种原因,今天早上,即使通过 SSMS 运行,该功能最初也很慢,运行时间超过 2 分钟。自今天早上以来,它已在 SSMS 中正常化,但通过 C# 运行时超时。 Azure SQL 数据库是无服务器的,最小 0.5 到最大 4 个 vCore。发生了什么以及如何解决此问题?

编辑:我可能已经找到了解决方案。该问题与 SQL Server 中的参数嗅探有关。我通过添加分配给函数参数的本地参数来使函数工作,因此函数参数实际上不会在任何查询中使用。我必须看看这是否继续有效,如果它没有中断,我会将其标记为答案。

【问题讨论】:

    标签: c# azure-sql-database


    【解决方案1】:

    正如您所说,如果您在 SQL Server 中面临参数嗅探。一个查询,两个计划取决于参数,它是参数嗅探。正如post 所说

    DECLARE @Id INT = 22656
    SELECT *
    FROM dbo.BC_ITVF(@Id) AS bi
    GO
    
    DECLARE @Id INT = 4338144
    SELECT *
    FROM dbo.BC_ITVF(@Id) AS bi
    GO
    

    那么我们的计划是这样的:

    我们可以使用 RECOMPILE 提示返回带有文字的原始计划。

    【讨论】:

      【解决方案2】:

      添加一个在开头分配函数参数的局部参数并在函数查询中使用它可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 2014-04-18
        • 2013-02-16
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多