【问题标题】:Stored procedure in Azure database runs fast in ASP.NET but slow in SSMSAzure 数据库中的存储过程在 ASP.NET 中运行速度很快,但在 SSMS 中运行速度很慢
【发布时间】:2019-11-18 19:01:41
【问题描述】:

我有一个具有 S0 定价层的 Azure 数据库。当我运行存储过程时,在我的 ASP.NET 网站和 SSMS 中显示结果大约需要 20 秒。

现在,我将定价层级降为基本。当我运行相同的存储过程时,它会在 ASP.NET 网站中显示消息超时。当我在 SSMS 中执行存储过程时,大约需要 35 秒。

我分析我的数据库。从实际执行计划选项卡中,它建议创建一个索引。我听从了建议。我在我的表中创建了一些索引。

结果,在我的 ASP.NET 网站中只需要大约 1-2 秒即可显示结果。但在 SSMS 中,加载时间不会改变。也需要 35 秒。

我已经关闭 SSMS 并再次重新连接 Azure 数据库,但它不会更改加载时间。我的 SSMS 是 SSMS 2016(版本 13.0.16106.4)

我的 Azure 数据库会怎样?

【问题讨论】:

  • 我的第一个猜测是,无论出于何种原因,SSMS 查询仍在使用旧的执行计划,而不是利用新的索引。您可以使用 sp_recompile 尝试强制系统重新编译该存储过程的执行计划。 docs.microsoft.com/en-us/sql/relational-databases/…
  • @SamaraSoucy-MSFT 我已经测试了 sp_recompile 但没有改变

标签: c# asp.net sql-server azure ssms


【解决方案1】:

今天,我再次尝试存储过程后,结果让我感到惊讶。在 SSMS 和 ASP.NET 网站中,都需要很长时间。在 ASP.NET 网站中,我得到一个超时页面。在 SSMS 中,显示数据大约需要 30-35 秒。我对 Azure 很困惑。所以,现在我的问题是这个存储过程选择数据很慢。

所以,我交叉检查了我的存储过程。我改变了我的存储过程的格式,运行选择命令直接写入值,删除参数等。结果,存储过程现在只需要 1-2 秒来加载数据。

下面,我根据自己的经验写一些总结:

  1. 如果你的存储过程在select语句中使用了一些FORMAT,并且如果你的存储过程有DATE参数,那会很慢。

  2. 不要在SELECT 语句中使用过多的FORMAT。如果要格式化值,请在 ASP.NET 或 C# 中进行。

  3. FORMAT 更改为 CONVERT,因为根据我的经验,FORMAT 会降低性能。

这是我更改的代码,它提高了我的存储过程性能:

之前

FORMAT(b.tglTransaksi,'dd-MM-yy','en-US') AS [Tanggal],
FORMAT((a.upTime+'07:00'),'HH:mm:ss','en-US') AS [Waktu Input],
FORMAT(a.idMaster,'0000000#','en-US') AS [No. Ref],

之后

CONVERT(CHAR(8),b.tglTransaksi,5) AS [Tanggal],
CONVERT(CHAR(8),a.upTime+'07:00',108) AS [Waktu Input],
RIGHT('00000000'+CAST(a.idMaster AS VARCHAR(8)),8) AS [No. Ref],

使用这个命令SELECT @@VERSION;,我的Azure版本是

 Microsoft SQL Azure (RTM) - 12.0.2000.8   May  2 2019 20:11:13   
 Copyright (C) 2019 Microsoft Corporation

我使用基本定价层 (5 DTU)。

也许这种经历可以帮助其他人。

【讨论】:

  • 更改代码很可能只是强制生成一个新的(更好的)计划。为了完成,你为什么不现在尝试改回FORMAT,看看是否保持快速
  • @Nick.McDermaid 我已经改回 FORMAT。它再次加载缓慢。如果明天或下一次 FORMAT 可以快或 CONVERT 变慢,我会再次更新这篇文章
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 2013-01-02
  • 1970-01-01
  • 2015-11-20
  • 2021-11-04
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多