首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用大型数据库进行有效的值更新

利用大型数据库进行有效的值更新
EN

Database Administration用户
提问于 2016-11-03 21:33:56
回答 2查看 254关注 0票数 0

我有一张8GB的桌子,有2000万张唱片。有一个名为mth的int字段。mth字段以YYYYMM的形式存储日期信息,我希望将mth字段转换为连续整数。因此,我使用一个公式从字段mth获取年份和月份,并计算月份顺序,具体来说,我使用以下代码:

代码语言:javascript
复制
create function mth_to_num(@month int)
returns int
as 
begin
   return(round(@month/100,0)*12+@month-100*round(@month/100,0))
end

然后,我使用下面的代码更新巨型表中的值

代码语言:javascript
复制
update full_orig_month_Q1_1999 
set mth_order = dbo.mth_to_num(period)
Go 

然而,代码花费了相当长的时间执行,大约2-3分钟。我的系统是使用SQL server 2016的windows 10 64位。有什么办法让我加快速度吗?

另一个问题是,在执行上面的查询后,我发现SQL服务器在数据库中占据了多达8GB的空间。它需要这么多记忆吗?我怎么才能释放他们?

谢谢你提前帮忙!

杰森

EN

回答 2

Database Administration用户

回答已采纳

发布于 2016-11-03 23:05:14

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

尝试不使用UDF运行UPDATE查询。只需将您拥有的代码直接放入UPDATE查询。就像这样:

代码语言:javascript
复制
update full_orig_month_Q1_1999 
set mth_order = round(period/100,0)*12+period-100*round(period/100,0);

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

票数 5
EN

Database Administration用户

发布于 2016-11-04 14:40:47

您可以尝试使用Paul的脚本来实现在执行脚本期间发生的捕获等待统计信息

根据返回的结果,您可以搜索顶级等待类型并解释性能问题。

示例结果可能如下所示:

代码语言:javascript
复制
WaitType    Wait_S  Resource_S  Signal_S    WaitCount   Percentage  AvgWait_S   AvgRes_S    AvgSig_S
ASYNC_NETWORK_IO    0.00    0.00    0.00    2   100.00  0.0005  0.0005  0.0000

然后搜索ASYNC_NETWORK_IO就会发现,例如:

这种等待类型是Server通过TDS向客户端发送一些数据的地方,并等待客户端确认已消耗数据,如果日志读取器代理作业由于某种原因运行缓慢,也可以显示事务复制。(联机书籍描述:“发生在网络写入时,任务被阻塞在网络后面。验证客户端正在处理来自服务器的数据“)

在回应你的评论时:

保罗兰德尔's和布伦特·奥扎尔's网站是性能优化和优化的良好起点。我仍然发现,Server 2008 R2联机丛书(仍然可以是下载)包含大量关于数据库内部的信息,尽管其中一些信息已经过时。

亚伦·伯特兰有一些关于性能调优的好信息,其他很多人也是如此。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/154203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档