大数据库的高效价值更新

Jas*_*son 0 performance sql-server optimization query-performance

我有一个 8GB 大的表,有 20M 条记录。有一个名为 mth 的 int 字段。第 m 个字段以 YYYYMM 的形式存储日期信息,我想将第 m 个字段转换为连续整数。所以我使用一个公式从字段mth中获取年份和月份并计算月份顺序,具体来说,我使用以下代码:

create function mth_to_num(@month int)
returns int
as 
begin
   return(round(@month/100,0)*12+@month-100*round(@month/100,0))
end
Run Code Online (Sandbox Code Playgroud)

然后我用下面的代码来更新大表中的值

update full_orig_month_Q1_1999 
set mth_order = dbo.mth_to_num(period)
Go 
Run Code Online (Sandbox Code Playgroud)

但是,代码执行时间很长,大约 2-3 分钟。我的系统是带有 SQL Server 2016 的 Windows 10 64 位。有什么办法可以加快速度吗?

另一个问题是,执行上述查询后,我发现SQL server 在数据库中占用了多达8GB 的​​空间。需要那么多内存吗?我怎样才能释放它们?

提前感谢您的帮助!

杰森

Joe*_*ish 5

尽可能不要在查询中使用标量用户定义函数 (UDF)。它们强制整个计划是串行的,它们会导致使用大量额外的 CPU 资源,它们对优化器来说是一个黑匣子,并可能导致计划其他部分的基数估计问题,它们会导致不必要的大内存补助。

尝试在没有 UDF 的情况下运行 UPDATE 查询。只需将您拥有的代码直接放入 UPDATE 查询中即可。像这样的东西:

update full_orig_month_Q1_1999 
set mth_order = round(period/100,0)*12+period-100*round(period/100,0);
Run Code Online (Sandbox Code Playgroud)

这会改善运行时和内存使用吗?