isnull 与 select case 语句的性能

问题描述 投票:0回答:3

什么更快?

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

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

sql sql-server t-sql sql-server-2012 dynamics-crm-2013
3个回答
3
投票

好吧..我不得不挖掘这个脚本。从阅读评论来看,您正在尝试更新这是一个非常大的表。加快更新速度的最佳方法是将其分成批次。花费这么长时间的原因是由于系统的事务性质......如果出现故障,整个事务(您的整个更新)将被回滚。这需要太多额外的时间。如果您不需要这种全有或全无的交易,请尝试类似的操作(如下)。我们必须更新数亿条记录,仅通过批量更新就可以将速度加快几个小时。

根据您的数据对此进行调整可以使您的速度更快。

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. 极不支持对 Dynamics CRM 数据库的直接更新,并且可能会导致 CRM 实例出现多个问题(您需要使用 CRM Web 服务来更新数据)
  2. 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 数据库中的数据(记录)。


0
投票

ISNULL 与 COALESCE 语句相比会更好。案例 - 何时几乎与 COALESCE 相同

http://blogs.x2line.com/al/archive/2004/03/01/189.aspx

© www.soinside.com 2019 - 2024. All rights reserved.