-2
SQL Server性能出现问题,并希望查看是否有人可以提供有关提高更新查询性能的一些提示。在SQL Server中使用NVARCHAR更新查询(最大值)
我在做什么是用另一个表中的数据更新一个表。下面是一些基本知识:
- SQL Server 2008 R2的
- 数据是从其它系统
- 附加数据被泵送至
TEMP_REMARKS
(使用ADO.NET中的DataReader和SqlBulkCopy的泵)泵送至WO
表最初(泵使用的DataReader和ADO.NET SqlBulkCopy的) - 不幸的是,(通过读者查询)相结合的初始系统
WO
和REMARKS
是不可能的(主要是性能的原因) - 更新到
WO
发生使用值从TEMP_REMARKS
其中两列被更新 - 注意,列被从
TEMP_REMARKS
转移到REMARKS
是nvarchar(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]
为什么在原始系统中不可能组合WO和备注?很显然,这个路由临时表路由有性能问题。 – Paparazzi
同样是数据进入两个不同的列。 TEMP_REMARKS.REMARKS将进入WO_DESCRIPTION和FINDINGS。两者都基于TEMP_REMARKS.REMARKS_ID。为什么有7M +记录的表格更新4M +记录的表格?两个ID是否交错以避免碰撞? – Paparazzi
Blam,原始系统REMARKS表有超过100m +的记录,当我们在原始查询中加入它们并将结果通过数据读取器推送到WO表时,它花费了当前表现不佳的过程的两倍。我同意这将是理想的,但不幸的是它没有。此外,我们不能控制原始系统放置索引,改变模式等等。我们正在处理我们在该系统上处理的内容。 – mdjtlj