在 SQL Server 2008 中通过联接在更新表中长时间执行
Posted
技术标签:
【中文标题】在 SQL Server 2008 中通过联接在更新表中长时间执行【英文标题】:Long time exection in update table with join in SQL server 2008 【发布时间】:2012-07-05 06:26:38 【问题描述】:在尝试更新包含库存数据的表时,我遇到了一个大问题,该表与包含产品分类的表连接。此操作需要很长时间才能执行。
表 dw_giacenze(flag_nomatch 参数等于 T)a 与 ecat_key 字段上的 dw_key_prod z 进行内部连接。 a 包含多达 300 万条记录,z 包含 150k 条记录。 执行需要2个多小时。
在我正在使用的更新查询下方。
update dw_giacenze
set cate_ecat_key = z.cate_ecat_key,
sottocat_ecat_key = z.sottocat_ecat_key,
marchio_key = z.marchio_key,
sottocat_bi_key = z.sottocat_bi_key,
gruppo_bi_key = z.gruppo_bi_key,
famiglia_bi_key = z.famiglia_bi_key,
flag_nomatch = NULL
from dw_giacenze a
inner join dw_key_prod z on
z.ecat_key = a.ecat_key
where
a.flag_nomatch = 'T';
谁能帮我优化它? 提前致谢!
恩里科
【问题讨论】:
显示您的查询计划。菜单“查询”,“显示估计的执行计划”。 dw_giacenze 有很多索引需要更新吗?具有相同表和条件的 SELECT 查询是否也需要很长时间才能运行?两个表中的 ecat_key 上是否有任何索引,flag_nomatch 上是否有索引? 嗨,大卫,我执行了查询执行计划,SQL Server 说 /* SQLQuery4.sql - 46.51.199.197.EURDB-DEV (EUR-DEV (53)) 中缺少索引详细信息,查询处理器估计实施以下索引可以将查询成本提高 96.6899%。 / / USE [EURDB-DEV] GO CREATE NONCLUSTERED INDEX [我建议关注 a.flag_nomatch = 'T'。
使用 SQL Server Profiler 非常清楚地了解正在发生的事情的一个好方法。如果这表明您的读取数等于表中的行数,那么这绝对是一个问题。在 flag_nomatch 上添加索引。
或者,您可以将其分开并单独更新(开始)
UPDATE dw_giacenze
set sottocat_ecat_key = (SELECT sottocat_ecat_key
FROM dw_key_prod
WHERE dw_key_prod.ecat_key = dw_giacenze.ecat_key)
where
dw_giacenze.flag_nomatch = 'T';
我确实注意到您的 set 语句中的第一个参数实际上与您的联接中的参数相同。这意味着您将其设置为相同的确切值,因此无论如何您都应该能够将其删除。
【讨论】:
以上是关于在 SQL Server 2008 中通过联接在更新表中长时间执行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 2008 中通过单个查询更新两个表 [重复]
在IIS7中通过PHP连接到SQL SERVER 2008(使用Windows身份验证)?
SQL Server 2008:将 VIEW 与其他 VIEW 联接:预先计算而不求助于临时表