在 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 [] ON [dbo].[dw_giacenze] ([flag_nomatch]) INCLUDE ([ecat_key]) GO */ 您是否添加了缺失的索引以及它如何影响执行时间? 【参考方案1】:

我建议关注 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 中列值的内部联接

SQL Server 2008:将 VIEW 与其他 VIEW 联接:预先计算而不求助于临时表

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

在 Server 2008 R2 中通过 j-interop 访问 DCOM