什么更快?
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 表。
我想知道我是否选择了最有效的解决方案?
好吧..我不得不挖掘这个脚本。从阅读评论来看,您正在尝试更新这是一个非常大的表。加快更新速度的最佳方法是将其分成批次。花费这么长时间的原因是由于系统的事务性质......如果出现故障,整个事务(您的整个更新)将被回滚。这需要太多额外的时间。如果您不需要这种全有或全无的交易,请尝试类似的操作(如下)。我们必须更新数亿条记录,仅通过批量更新就可以将速度加快几个小时。
根据您的数据对此进行调整可以使您的速度更快。
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;
你所做的事情是错误的,原因有两个:
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 数据库中的数据(记录)。
ISNULL 与 COALESCE 语句相比会更好。案例 - 何时几乎与 COALESCE 相同