什么更快?
update c
set
c.createdon=q.CreatedOn
,c.createdby=case when q.createdby is not null then q.createdby end
,c.modifiedon=q.modifiedon
,c.modifiedby=case when q.ModifiedBy is not null then q.ModifiedBy end
from crm_annotationbase c
join IncidentWorknote q
on c.annotationid=q.annotationid
或者:
update c
set
c.createdon=q.CreatedOn
,c.createdby=isnull(q.createdby,c.createdby)
,c.modifiedon=q.modifiedon
,c.modifiedby=isnull(q.modifiedby,c.modifiedby)
from crm_annotationbase c
join IncidentWorknote q
on c.annotationid=q.annotationid
我的第一个查询已经运行了24小时。我正在根据分段数据更新CRM 2013表。
我想知道我是否选择了最有效的解决方案吗?
答案 0 :(得分:2)
好的..我不得不四处寻找这个剧本。通过阅读评论,它是一个非常大的表,您正在尝试更新。加速此更新的最佳方法是将其分批。它花了这么长时间的原因是因为系统的事务性质......如果某些事情失败,整个交易(你的整个更新)将被回滚。这需要SOOO额外的时间。如果您不需要此事务全部或全部,请尝试这样的事情(如下)。我们必须更新数以亿计的记录,我们只需批量更新即可通过HOURS加快速度。
根据您的数据调整这可能会让您更快。
DECLARE @Update INT
DECLARE @Batch INT
-- Total number of records in database
SELECT @Update = (
SELECT COUNT(id)
FROM [table] WITH (NOLOCK) -- be CAREFUL with this
WHERE [' + @fName + '] IS NOT NULL) --optional
SELECT @Batch = 4000 --Batch update amount
WHILE (@Update > 0)
BEGIN
UPDATE TOP(@Batch) c
set
c.createdon=q.CreatedOn
,c.createdby=case when q.createdby is not null then q.createdby end
,c.modifiedon=q.modifiedon
,c.modifiedby=case when q.ModifiedBy is not null then q.ModifiedBy end
from crm_annotationbase c
join IncidentWorknote q
on c.annotationid=q.annotationid
SELECT @Update = @Update - @Batch; -- Reduce for next set
WAITFOR DELAY '000:00:00.400'; -- Allows for waiting transactions to process optional
END;
答案 1 :(得分:1)
你做错了两个原因:
CreatedOn
,CreatedBy
,ModifiedOn
和ModifiedBy
是系统字段,它们始终填充,它们永远不会包含空值。 (特别是CreatedOn
和CreatedBy
在创建记录时指定,并且在每次更新记录后更新ModifiedOn
和ModifiedBy
时都无法修改。根据微软的建议: http://msdn.microsoft.com/en-us/library/gg328350.aspx#Unsupported
不支持的自定义
使用SQL命令或Microsoft Dynamics CRM SDK中描述的任何技术之外的Microsoft Dynamics CRM数据库中的数据(记录)更改。