【发布时间】:2018-03-19 06:18:00
【问题描述】:
我正在使用 Azure 函数,如计划作业,使用 cron 计时器。在每天早上的特定时间,它会调用一个存储过程。
该函数现在需要 4 分钟来运行存储过程,而在 SSMS 中运行需要几秒钟。尽管努力成功地提高了存储过程的速度,但这个时间还在增加。
函数没有做任何密集的事情。
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
using (var cmd = new SqlCommand("Stored Proc Here", conn) { CommandType = CommandType.StoredProcedure, CommandTimeout = 600})
{
cmd.Parameters.Add("@Param1", SqlDbType.DateTime2).Value = DateTime.Today.AddDays(-30);
cmd.Parameters.Add("@Param2", SqlDbType.DateTime2).Value = DateTime.Today;
var result = cmd.ExecuteNonQuery();
}
}
我已经检查过,当存储过程运行时,数据库没有被另一个进程加载。
我可以做些什么来加快 Azure 功能?或者有什么方法可以找出它为什么这么慢?
更新。
我不认为 Azure 函数有问题,问题似乎出在 SQL Server 上。
我最终运行了生产 SP 并查看了执行计划。我注意到统计数据出路了,例如一个连接预计返回的行数为 20,但实际数字接近 800k。
我的问题的解决方案是每周更新特定表的统计信息。
关于为什么统计数据如此之多,客户每晚都会进行批量更新并插入数十万行。我只能假设这影响了统计数据并且它是累积的,所以它似乎随着时间的推移变得更糟。
【问题讨论】:
-
当您在 SSMS 中运行它时,您是否使用 完全 相同的参数值运行它?如果您在 Visual Studio 中本地运行 Azure Function 代码会怎样?
-
顺便说一句,sproc 在做什么?它是简单地检索数据(在这种情况下您应该使用 View 或 UDF,而不是 sproc)还是执行插入/更新/创建语句?
-
是的,我使用完全相同的参数值运行它。 sproc 不返回任何数据,它会进行更新。我还没有尝试从 VS 运行它,但会试一试。
-
启用ApplicationInsights 并在您的函数中添加更多日志记录可能会有所帮助。几个问题:您是否使用计时器触发器?函数完成执行没有任何错误吗?
-
我正在使用计时器触发器。该函数完成执行而没有错误。我不得不增加 SqlCommand 的超时时间以使存储过程能够完成。我将启用 applicationinsights。
标签: azure azure-sql-database azure-functions