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

时间:2012-10-17 12:50:14

标签: sql tsql join sql-server-2008-r2 nvarchar

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

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

  • SQL Server 2008 R2
  • 数据最初从其他系统泵入WO表(在ADO.NET中使用datareader和sqlbulkcopy泵入)
  • 将其他数据提取到TEMP_REMARKS(在ADO.NET中使用datareader和sqlbulkcopy泵入)
  • 不幸的是,在原始系统中组合WOREMARKS(通过读者查询)是不可能的(主要是性能原因)
  • 使用WO中更新两列的值
  • 更新至TEMP_REMARKS
  • 请注意,从TEMP_REMARKS转移到REMARKS的列是nvarchar(max),并且被放入另一个nvarchar(max)列(实际上是两个 - 请参阅查询)
  • WO有4m +记录
  • TEMP_REMARKS有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语句但没有成功。我在db中有其他更完整的程序,这些程序花费的时间差不多,所以我确信它不是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 个答案:

答案 0 :(得分:2)

我认为,首先您应该考虑在TEMP_REMARKS上创建主键,或者至少在REMARKS_ID上创建一些索引