2012-10-17 61 views
-2

SQL Server性能出现问题,并希望查看是否有人可以提供有关提高更新查询性能的一些提示。在SQL Server中使用NVARCHAR更新查询(最大值)

我在做什么是用另一个表中的数据更新一个表。下面是一些基本知识:

  • SQL Server 2008 R2的
  • 数据是从其它系统
  • 附加数据被泵送至TEMP_REMARKS(使用ADO.NET中的DataReader和SqlBulkCopy的泵)泵送至WO表最初(泵使用的DataReader和ADO.NET SqlBulkCopy的)
  • 不幸的是,(通过读者查询)相结合的初始系统WOREMARKS是不可能的(主要是性能的原因)
  • 更新到WO发生使用值从TEMP_REMARKS其中两列被更新
  • 注意,列被从TEMP_REMARKS转移到REMARKSnvarchar(max)和正被放入另一个nvarchar(max)柱(实际上是两个 - 见查询)
  • WO具有400 +记录
  • TEMP_REMARKS有7米+记录

两者之间的连接,以下是正在使用什么:

/* === 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 
) 

这是TEMP_REMARKS表定义:

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

为什么在原始系统中不可能组合WO和备注?很显然,这个路由临时表路由有性能问题。 – Paparazzi

+0

同样是数据进入两个不同的列。 TEMP_REMARKS.REMARKS将进入WO_DESCRIPTION和FINDINGS。两者都基于TEMP_REMARKS.REMARKS_ID。为什么有7M +记录的表格更新4M +记录的表格?两个ID是否交错以避免碰撞? – Paparazzi

+0

Blam,原始系统REMARKS表有超过100m +的记录,当我们在原始查询中加入它们并将结果通过数据读取器推送到WO表时,它花费了当前表现不佳的过程的两倍。我同意这将是理想的,但不幸的是它没有。此外,我们不能控制原始系统放置索引,改变模式等等。我们正在处理我们在该系统上处理的内容。 – mdjtlj

回答

2

我认为,首先应该考虑对TEMP_REMARKS创建主键,或至少有一些索引REMARKS_ID