-2

对 SQL Server 性能有疑问,想看看是否有人可以提供一些关于提高更新查询性能的提示。

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

  • SQL Server 2008 R2
  • 数据WO最初从其他系统泵送到表(在 ADO.NET 中使用 datareader 和 sqlbulkcopy 泵送)
  • 额外的数据被抽取到TEMP_REMARKS(在 ADO.NET 中使用 datareader 和 sqlbulkcopy 抽取)
  • 不幸的是,在原始系统中组合WOand REMARKS(通过读者查询)是不可能的(主要是性能原因)
  • 使用更新两列的WO值进行更新TEMP_REMARKS
  • 请注意,被转移TEMP_REMARKS到的列REMARKS是 anvarchar(max)并且正在被放入另一nvarchar(max)列(实际上是两个 - 请参阅查询)
  • WO拥有超过 400 万条记录
  • TEMP_REMARKS拥有超过 700 万条记录

对于两者之间的连接,正在使用以下内容:

/* === 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]
4

1 回答 1

2

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

于 2012-10-17T12:54:04.270 回答