我们在使用Azure Logic Apps服务和SQL数据库同时运行三个存储过程(SP)时遇到了问题。
无论SP的运行顺序如何,问题始终会出现在运行的第一个SP中。
处理最初通常需要几秒钟的时间来运行和成功执行,但我们注意到执行时间和所需的DTU(数据库吞吐量单位)每天都在增加。
其中一个SP使用了一个变量,该变量按日期过滤表格TABLE1
,并在TABLE2
中仅显示“当前日期”数据。过滤器变量(SP中使用)在Logic App中定义为SUBSTRING(startOfDay(utcNow()), 0, 10)
,它返回当前日期值。
我们的代码只过滤当天TABLE1
的值,将其放入TABLE2
,对其运行一些计算,并将结果存储回TABLE1
。First_Value
和INSERT
函数用于SP代码内部。INSERT
函数用于将结果行插入TABLE1
(大约74行)。TABLE1
中记录的数据行数每天都在增加,但TABLE2
中的数据行数是恒定的,因为它是过滤“当天”的结果,所以它只显示当天的值。
使用SQL Server Management Studio,可以手动执行SP,而不会出现任何问题。
一开始,当我们的数据库DTU设置为400时,第一个SP的Logic App执行时间不到10分钟,其余两个SP的执行时间分别为几秒钟。
最近,第一个SP无法执行,出现GatewayTimeout错误,逻辑应用程序执行失败:
当我们将DTU增加到800时,逻辑应用程序成功运行,但我们仍然收到GatewayTimeout警告。
检查了与数据库的连接,测试了每个单独SP的手动执行,将筛选变量数据类型从datetime
更改为varchar
(以与Logic Apps参数匹配),但问题仍然出现。
有一种趋势是,如果不解决这个问题,它将再次出现。有什么建议吗?
- 谢谢-谢谢
更新
这是一个SP的代码:
WITH enTotTable
AS
(
SELECT --TOP(100)
se.id
, se.gatewayName
, se.deviceId
, se.ts
, se.pointNameId
, case
when se.presentValue < 0 then 0 else se.presentValue end as presentValue
, DATEPART(hh,se.ts) as hTs
FROM dbo.SolarEnergyTable se
WHERE se.gatewayName IN ('DPJW', 'DAN1') and se.pointNameId = 7 and not se.presentValue = 0 and se.ts >= @tsFilter
)
, calculationTable AS
(
SELECT distinct
FORMAT ( tot.ts , 'yyyy-MM-dd' ) as dayTs
,tot.deviceId
,tot.gatewayName
, CASE
WHEN Last_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
ORDER by tot.hTs ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
- FIRST_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
ORDER by tot.hTs ) >=12
then 1
Else NULL end as ifAllDay
, CASE
WHEN Last_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
ORDER by tot.hTs ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
- FIRST_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
ORDER by tot.hTs ) >=12
then (LAST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
ORDER by tot.deviceId desc, tot.ts
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
- FIRST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
ORDER by tot.deviceId desc, tot.ts) )
else NULL
end as enTdy
,case
when LAST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
ORDER by tot.deviceId desc, tot.ts
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) < 0 then NULL
else
LAST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
ORDER by tot.deviceId desc, tot.ts
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
end as lastPvalueDay
, case
when FIRST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
ORDER by tot.deviceId desc, tot.ts
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) < 0 then NULL
else
FIRST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
ORDER by tot.deviceId desc, tot.ts)
end as firstPvalueDay
FROM enTotTable tot
WHERE not tot.presentValue = 0
)
, plantAndTdyTable
AS
(
SELECT
tdy.gatewayName
,tdy.dayTs as ts
,CAST(2 as INT) as deviceId
, CAST(20 as INT) as pointNameId
, Case When
tdy.ifAllDay = 1
then SUM(tdy.lastPvalueDay)-SUM(tdy.firstPvalueDay)
else NULL end as presentValue
FROM calculationTable tdy
GROUP BY tdy.dayTs ,tdy.ifAllDay, tdy.gatewayName
UNION
SELECT
tdy.gatewayName
,tdy.dayTs as ts
,CAST(2 as INT) as deviceId
, CAST(17 as INT) as pointNameId
,SUM(tdy.lastPvalueDay) as presentValue
FROM calculationTable tdy
GROUP BY tdy.dayTs, tdy.gatewayName
UNION
SELECT
tdy.gatewayName
, tdy.dayTs as ts
, tdy.deviceId
, CAST(6 as INT) as pointNameId
, tdy.enTDY as presentValue
From calculationTable tdy
)
INSERT INTO [dbo].[SolarEnergyTable]
SELECT
pt.gatewayName
,pt.ts
,pt.deviceId
,pt.pointNameId
,pt.presentValue
FROM plantAndTdyTable pt
-- SELECT *
-- From
-- plantAndTdyTable
-- -- calculationTable
-- -- enTotTable
3条答案
按热度按时间bnl4lu3b1#
请看下面的答案here:
我用azure logic app stored procedure taking too long找到的。
fjnneemd2#
我最终更改了运行SP的架构。为了避免Logic应用程序在需要连接到数据库时出现GatewayTimeout,我使用了azure自动化帐户。我创建了一个PowerShell脚本来运行SP,并使用Logic应用程序来运行PowerShell脚本。在我的情况下,它运行得更好。
qni6mghb3#
您可以在逻辑应用程序本身中进行重试策略设置。此设置对于处理超时问题也很有用。enter image description here