在我们公司的项目要从前端对数据库进行操作的这个模块中,每一次更改都需要等上超过一分钟的时间,即使改动微小也一样,虽然最后确实可以正确完成更改,但每次都要等待超过一分钟极大影响了用户体验。
本身这个模块并没有报错,功能也能正常完成,现在的问题是要完成一个运行速度上的优化,以下是我经过排查之后造成问题的代码:
merge [CPMApplication].[ForecastIterationRow] as TargetTbl
using(
select source_table.Level3ID, source_table.Level3ComponentID, source_table.DA1ID,
source_table.Level3Name, source_table.FiscalPeriod as p, SUM(source_table.Total) as NewDollars
from [CPMApplication].[v_NonLabourRowsByPeriod] as source_table
where IterationID = @iteration_id
Group By source_table.Level3ID, source_table.Level3ComponentID, source_table.DA1ID,
source_table.Level3Name, source_table.FiscalPeriod
) as rowsource
ON TargetTbl.AccountLevel3ID = rowsource.Level3ID and
TargetTbl.AccountLevel3ComponentID = rowsource.Level3ComponentID and
TargetTbl.DA1DepartmentID = rowsource.DA1ID and
TargetTbl.FiscalPeriod = rowsource.p and
TargetTbl.IterationID = @iteration_id and
TargetTbl.BaseFlag = 0
when MATCHED then UPDATE
set TargetTbl.Amount = rowsource.NewDollars,
LoadDateTime = GETDATE(),
Email =@email
when not matched then
INSERT (
IterationID,
DA1DepartmentID,
AccountLevel3ID,
AccountLevel3ComponentID,
FiscalPeriod,
BaseFlag,
Amount,
LoadDateTime,
ApplicationOrigin,
Email
)
values (
@iteration_id,
rowsource.DA1ID,
rowsource.Level3ID,
rowsource.Level3ComponentID,
rowsource.p,
0,
rowsource.NewDollars,
GETDATE(),
9,
@email
);
由于我是公司的新“前端”员工,不确定随便在“后端”做尝试会对公司的数据库造成多大的影响,这个项目的数据库是有上百万个内容的大型数据库。
我初步猜测:造成超长时间等待的原因应该是每次对数据库进行更新的时候,该段代码的前几行都会过一遍整个数据库,造成了运行时间超长。
我想问的是,再不改动数据库本身的情况下,如何通过修改这些代码来优化运行速度?
或许将“遍历整个数据库”改为“单行直接插入”之类的会有效果?
当然我也不确定这么做真的能实现吧
我们在VS code上工作,使用的前端是reactJS,后端是NodeJS,数据库是MySQL,测试网页的浏览器为chrome