SQL Server Update查询速度很慢

hc9*_*c91 9 sql sql-server

我对前几年的数据运行了以下查询,花了3个小时,今年花了13天.我不知道为什么会这样.任何帮助将非常感激.

我刚刚测试了旧SQL服务器中的查询,它可以在3小时内完成.因此,问题必须与我创建的新SQL服务器有关.你有任何想法可能是什么问题?

查询:

USE [ABCJan]
CREATE INDEX Link_Oct ON ABCJan2014 (Link_ref)
GO
CREATE INDEX Day_Oct ON ABCJan2014 (date_1)
GO

UPDATE   ABCJan2014
SET      ABCJan2014.link_id = LT.link_id
FROM     ABCJan2014 MT
INNER JOIN  [Central].[dbo].[LookUp_ABC_20142015] LT
ON MT.Link_ref = LT.Link_ref

UPDATE   ABCJan2014
SET      SumAvJT  = ABCJan2014.av_jt * ABCJan2014.n

UPDATE   ABCJan2014
SET      ABCJan2014.DayType = LT2.DayType
FROM     ABCJan2014 MT
INNER JOIN  [Central].[dbo].[ABC_20142015_days] LT2
ON  MT.date_1 = LT2.date1
Run Code Online (Sandbox Code Playgroud)

使用以下数据结构:

ABCJan2014(7000万行 - 没有独特的标识符 - Link_ref和date_1在一起是唯一的)

Link_ID nvarchar (17)
Link_ref    int
Date_1  smalldatetime
N       int
Av_jt       int
SumAvJT decimal(38,14)
DayType nvarchar (50)
Run Code Online (Sandbox Code Playgroud)

LookUp_ABC_20142015

Link_ID nvarchar (17) PRIMARY KEY
Link_ref    int INDEXED
Link_metres int
Run Code Online (Sandbox Code Playgroud)

ABC_20142015_days

Date1   smalldatetime   PRIMARY KEY & INDEXED
DayType nvarchar(50)
Run Code Online (Sandbox Code Playgroud)

执行计划 在此输入图像描述

看起来这部分问题花了这么长时间.

再次感谢您的帮助,我正在拔头发.

pap*_*zzo 2

如果你查看执行计划,时间是在实际更新中

查看日志文件
日志文件是否位于快速磁盘上?
日志文件是否位于同一物理磁盘上?
日志文件是否需要增长?
将日志文件大小设置为数据文件大小的 1/2

至于索引测试和调整,
如果连接列已建立索引,这里不需要做太多事情

select   count(*) 
FROM     ABCJan2014 MT
INNER JOIN  [Central].[dbo].[LookUp_ABC_20142015] LT
ON MT.Link_ref = LT.Link_ref

select   count(*) 
FROM     ABCJan2014 MT
INNER JOIN  [Central].[dbo].[ABC_20142015_days] LT2
ON  MT.date_1 = LT2.date1
Run Code Online (Sandbox Code Playgroud)

从顶部(1000)开始以获得更新调整工作
对于笑声,请尝试一下
请发布此查询计划
(不要向 ABCJan2014 link_id 添加索引)

UPDATE   top (1000) ABCJan2014
SET      MT.link_id = LT.link_id
FROM     ABCJan2014 MT
JOIN     [Central].[dbo].[LookUp_ABC_20142015] LT
          ON MT.Link_ref = LT.Link_ref 
         AND MT.link_id <> LT.link_id
Run Code Online (Sandbox Code Playgroud)

如果 LookUp_ABC_20142015 未激活,则添加 nolock

JOIN     [Central].[dbo].[LookUp_ABC_20142015] LT with (nolock)
Run Code Online (Sandbox Code Playgroud)

nvarchar (17) 对于 PK 对我来说很奇怪
为什么 n - 你真的有一些 unicode 吗?
为什么不直接使用 char(17) 并让它分配空间呢?