在SQL Server中使用NVARCHAR(max)更新查询

在SQL Server中使用NVARCHAR(max)更新查询,sql,tsql,join,sql-server-2008-r2,nvarchar,Sql,Tsql,Join,Sql Server 2008 R2,Nvarchar,对SQL Server性能有问题,希望了解是否有人可以提供一些有关提高更新查询性能的提示 我所做的是用另一个表中的数据更新一个表。以下是一些基本知识: SQL Server 2008 R2 数据最初从其他系统泵入WO表(使用ADO.NET中的datareader和sqlbulkcopy泵入) 额外的数据被泵送到临时备注(使用ADO.NET中的datareader和sqlbulkcopy泵送) 遗憾的是,无法在原始系统中(通过读卡器查询)组合WO和备注(主要是性能原因) 使用更新两列的TEMP\

对SQL Server性能有问题,希望了解是否有人可以提供一些有关提高更新查询性能的提示

我所做的是用另一个表中的数据更新一个表。以下是一些基本知识:

  • SQL Server 2008 R2
  • 数据最初从其他系统泵入
    WO
    表(使用ADO.NET中的datareader和sqlbulkcopy泵入)
  • 额外的数据被泵送到
    临时备注
    (使用ADO.NET中的datareader和sqlbulkcopy泵送)
  • 遗憾的是,无法在原始系统中(通过读卡器查询)组合
    WO
    备注
    (主要是性能原因)
  • 使用更新两列的
    TEMP\u备注中的值更新到
    WO
  • 请注意,从
    TEMP_备注
    转移到
    备注
    的列是一个
    nvarchar(max)
    ,并被放入另一个
    nvarchar(max)
    列中(实际上是两个-参见查询)
  • WO
    有4m+记录
  • TEMP_备注
    7m+记录
对于两者之间的连接,将使用以下内容:

/* === UPDATE THE DESCRIPTION  */     
UPDATE WO
SET WO_DESCRIPTION = TEMP_REMARKS.REMARKS
FROM WO 
INNER JOIN TEMP_REMARKS ON WO.WO_DESCRIPTION_ID = TEMP_REMARKS.REMARKS_ID;

/* === UPDATE THE FINDINGS  */
UPDATE WO
SET FINDINGS = TEMP_REMARKS.REMARKS
FROM WO 
INNER JOIN TEMP_REMARKS ON WO.FINDINGS_ID = TEMP_REMARKS.REMARKS_ID;
此时的问题是,
WO
表的更新需要两个多小时才能完成。我尝试使用
MERGE
语句,但没有成功。我在数据库中还有其他更完整的过程,这些过程几乎不需要那么长的时间,因此我确信这不是SQL Server本身的配置

在更新
nvarchar(max)
列时,是否应该做些什么

可以做些什么来提高此查询的性能

以下是表格定义:

CREATE TABLE [dbo].[WO](
    [DOCUMENT_ID] [decimal](18, 0) NOT NULL,
    [WO_DESCRIPTION_ID] [decimal](18, 0) NULL,
    [WO_DESCRIPTION] [nvarchar](max) NULL,
    [FINDINGS_ID] [decimal](18, 0) NULL,
    [FINDINGS] [nvarchar](max) NULL,
.... bunch of other fields
 CONSTRAINT [PK_WO] PRIMARY KEY CLUSTERED 
(
    [DOCUMENT_ID] ASC
)
这是
临时备注的表定义:

CREATE TABLE [dbo].[TEMP_REMARKS](
    [REMARKS_ID] [decimal](18, 0) NOT NULL,
    [REMARKS] [nvarchar](max) NULL
) ON [PRIMARY]

我认为,首先,你应该考虑在<代码> Twitter备注<代码>上创建主键,或者至少在<代码> ExtSysID/Cuth> < /P>的一些索引上,为什么WO和源系统中的注释不可能结合起来?显然,这个路由临时表路由存在性能问题。同样的问题是数据进入两个不同的列。临时备注。备注包括WO_说明和调查结果。两者都基于临时备注。备注ID。为什么一个记录数为7M+的表要更新记录数为4M+的表?两个ID是否交错以避免冲突?Bum,原始系统备注表有超过100m+条记录,当我们在原始查询中加入它们并将结果通过datareader推送到WO表时,所用的时间是当前执行不佳流程的两倍。我同意这是理想的,但不幸的是它不是。此外,我们无法控制原始系统放置索引、更改模式等。。。我们正在处理我们在该系统上处理的内容。BURM、调查结果ID和描述ID均参考备注表中的备注ID。我们要做的是从原始系统中提取所有备注_ID,这些备注需要在我们这边的WO表的这两个字段中填写。有些记录没有发现标识,因此该值不是2 x WO计数。由于始发系统从未两次使用相同的ID,因此没有发生碰撞的风险。我无法理解他们为什么不将这些备注和findNIG存储在原始表中。布拉姆,奇怪的是,他们在这个原始系统中使用的任何文本都会进入备注表,并且各个表都链接到该表。理想情况下,文本应该放在原始表中,特别是因为他们为任何和所有文本创建了一个新的备注ID,所以他们的代码永远不会将其链接到多个记录。