SQL 更新永远进行,基本内连接
SQL Update goes forever, basic inner join
我有这个 SQL 更新查询不想 运行。这很简单,我想用子选择 E 中给定的值更新 T。
分选Ereturns3323行,T也有同样的3323行
它们由 dim01、dim02、dim03 和时间唯一关联。
(T的来源与E相同)
查看执行计划,我没有发现任何问题,看起来应该是高效的。
update T
set T.ACT04 = E.ACT04,
T.ACT05 = E.ACT05
from ( select left(A.PERIOD_ID,4) + right(A.PERIOD_ID,2) as PERIOD_ID, A.[d_1],A.[d_3],A.[d_5],
sum(C.[V_AANREKENING]) as ACT04 ,sum(C.[V_VORDERING]) as ACT05
FROM [CVL].dbo.[C_DS_DB_FI_SOK] A INNER JOIN [CVD].[dbo].[REF_YTD] B
ON left(A.PERIOD_ID,4) + right(A.PERIOD_ID,2) = B.ref_period
INNER JOIN [CVL].[dbo].[C_DS_DB_FI_SOK] C
ON B.agg_period = left(C.PERIOD_ID,4) + right(C.PERIOD_ID,2) and
left(A.PERIOD_ID,4) = left(C.PERIOD_ID,4) and
A.d_1 = C.d_1 and
A.d_2 = C.d_2 and
A.d_3 = C.d_3 and
A.D_BELEIDSDOMEIN = C.D_BELEIDSDOMEIN and
A.D_BELEIDSVELD = C.D_BELEIDSVELD and
A.D_BELEIDSITEM = C.D_BELEIDSITEM and
A.D_7 = C.D_7
WHERE LEFT(A.d_7, 1) = 2 or LEFT(A.d_7, 1) = 6 or LEFT(A.d_7, 1) = 7 or LEFT(A.d_7, 2) = 42 or LEFT(A.d_7, 2) = 17
or LEFT(A.d_7, 4) = 4943 or LEFT(A.d_7, 4) = 4944 or LEFT(A.d_7, 4) = 4949 or LEFT(A.d_7, 4) = 4959 or LEFT(A.d_7, 3) = 102
group by A.PERIOD_ID, A.d_1, A.d_3, A.d_5 ) E
inner join [CVD].[dbo].[FACT_QUANTITY_TMP] T
on E.d_1 = T.dim01 and
E.d_3 = T.dim02 and
E.d_5 = T.dim03 and
E.PERIOD_ID = T.YEAR + RIGHT('00' + CAST(DATEPART(mm, T.FULL_DATE) AS varchar(2)), 2)
令我惊讶的是,将 3323 条记录与另外 3323 条记录进行内部连接需要超过 15 分钟。
如果这是我的查询,我会查看
- 简化查询以使用中间 table 变量或临时 tables,
- 如果可能,实验性地简化 where 子句,只是为了看看这是否与问题有关,
- 查看 [[=25=]].D_7.
上是否有索引
Sql服务器擅长优化,但有些东西对它来说太复杂了。
(在研究 "Answers found in comment fields" 之后,我发现我也许应该作为答案而不是评论发布。我希望这没有做错任何事。)
我有这个 SQL 更新查询不想 运行。这很简单,我想用子选择 E 中给定的值更新 T。 分选Ereturns3323行,T也有同样的3323行
它们由 dim01、dim02、dim03 和时间唯一关联。 (T的来源与E相同) 查看执行计划,我没有发现任何问题,看起来应该是高效的。
update T
set T.ACT04 = E.ACT04,
T.ACT05 = E.ACT05
from ( select left(A.PERIOD_ID,4) + right(A.PERIOD_ID,2) as PERIOD_ID, A.[d_1],A.[d_3],A.[d_5],
sum(C.[V_AANREKENING]) as ACT04 ,sum(C.[V_VORDERING]) as ACT05
FROM [CVL].dbo.[C_DS_DB_FI_SOK] A INNER JOIN [CVD].[dbo].[REF_YTD] B
ON left(A.PERIOD_ID,4) + right(A.PERIOD_ID,2) = B.ref_period
INNER JOIN [CVL].[dbo].[C_DS_DB_FI_SOK] C
ON B.agg_period = left(C.PERIOD_ID,4) + right(C.PERIOD_ID,2) and
left(A.PERIOD_ID,4) = left(C.PERIOD_ID,4) and
A.d_1 = C.d_1 and
A.d_2 = C.d_2 and
A.d_3 = C.d_3 and
A.D_BELEIDSDOMEIN = C.D_BELEIDSDOMEIN and
A.D_BELEIDSVELD = C.D_BELEIDSVELD and
A.D_BELEIDSITEM = C.D_BELEIDSITEM and
A.D_7 = C.D_7
WHERE LEFT(A.d_7, 1) = 2 or LEFT(A.d_7, 1) = 6 or LEFT(A.d_7, 1) = 7 or LEFT(A.d_7, 2) = 42 or LEFT(A.d_7, 2) = 17
or LEFT(A.d_7, 4) = 4943 or LEFT(A.d_7, 4) = 4944 or LEFT(A.d_7, 4) = 4949 or LEFT(A.d_7, 4) = 4959 or LEFT(A.d_7, 3) = 102
group by A.PERIOD_ID, A.d_1, A.d_3, A.d_5 ) E
inner join [CVD].[dbo].[FACT_QUANTITY_TMP] T
on E.d_1 = T.dim01 and
E.d_3 = T.dim02 and
E.d_5 = T.dim03 and
E.PERIOD_ID = T.YEAR + RIGHT('00' + CAST(DATEPART(mm, T.FULL_DATE) AS varchar(2)), 2)
令我惊讶的是,将 3323 条记录与另外 3323 条记录进行内部连接需要超过 15 分钟。
如果这是我的查询,我会查看
- 简化查询以使用中间 table 变量或临时 tables,
- 如果可能,实验性地简化 where 子句,只是为了看看这是否与问题有关,
- 查看 [[=25=]].D_7. 上是否有索引
Sql服务器擅长优化,但有些东西对它来说太复杂了。
(在研究 "Answers found in comment fields" 之后,我发现我也许应该作为答案而不是评论发布。我希望这没有做错任何事。)