isnull与select case语句的表现

时间:2014-06-26 15:52:36

标签: sql sql-server tsql sql-server-2012 dynamics-crm-2013

什么更快?

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表。

我想知道我是否选择了最有效的解决方案吗?

2 个答案:

答案 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)

你做错了两个原因:

  1. 对Dynamics CRM数据库的直接更新非常不受支持,可能会导致您的CRM实例出现多个问题(您需要使用CRM Web服务来更新数据)
  2. CreatedOnCreatedByModifiedOnModifiedBy是系统字段,它们始终填充,它们永远不会包含空值。 (特别是CreatedOnCreatedBy在创建记录时指定,并且在每次更新记录后更新ModifiedOnModifiedBy时都无法修改。
  3. 根据微软的建议: http://msdn.microsoft.com/en-us/library/gg328350.aspx#Unsupported

    不支持的自定义

    使用SQL命令或Microsoft Dynamics CRM SDK中描述的任何技术之外的Microsoft Dynamics CRM数据库中的数据(记录)更改。