0

在尝试更新包含库存数据的表时,我遇到了一个大问题,该表与包含产品分类的表连接在一起。此操作需要很长时间才能执行。

表 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';

谁能帮我优化它?提前致谢!

恩里科

4

1 回答 1

0

我建议专注于 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 语句中的第一个参数实际上与您的联接中的参数相同。这意味着您将其设置为相同的确切值,因此无论如何您都应该能够将其删除。

于 2012-07-06T16:14:54.920 回答