SQL Server性能存在问题,并希望了解是否有人可以提供有关提高更新查询性能的一些提示。
我正在做的是用另一个表中的数据更新一个表。以下是一些基础知识:
WO
表(在ADO.NET中使用datareader和sqlbulkcopy泵入)TEMP_REMARKS
(在ADO.NET中使用datareader和sqlbulkcopy泵入)WO
和REMARKS
(通过读者查询)是不可能的(主要是性能原因)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]
答案 0 :(得分:2)
我认为,首先您应该考虑在TEMP_REMARKS
上创建主键,或者至少在REMARKS_ID
上创建一些索引