我正在编写一个shell脚本,将XML文件中的数据加载到MySQL的7个不同的表中。 XML文件将根据特定条件加载到所有7个表中。所有7个表的属性都为“ PIK”。
我稍后检查所有表并删除在7个表中不通用的所有PIK。每个表需要10分钟。但是在从“ PROEntity”表中删除记录2个小时时卡住了。 有趣的是,“ PROEntity”表没有任何不常见的PIK。
这是我的查询:
mysql -v -u $Username -p$Password $database << EOF >> $ERRFile 2>&1
DELETE FROM ENTITY
where PIK not in
(select distinct(p.PIK)
from
PRO p,
PRODET pd,
PROTH pt,
PROREW pr,
PROBUCK ppb,
PROENTITY_TEMP pbe,
PROMOST ps
where
p.PIK = pd. PIK
and pd.PIK = pt.PIK
and pt.PIK = pr.PIK
and pr.PIK = ppb.PIK
and ppb.PIK = pbe.PIK
and pbe.PIK=ps.PIK);
EOF
PROENTITY_TEMP包含与PROENTITY相同的数据。 我必须使用PROENTITY_TEMP,因为无法在嵌套查询中使用PROENTITY并从PROENTITY本身中删除。
我采用了相同的方法从所有其他表中删除,但是对该表的删除查询需要2个小时以上的时间(即使没有数据要删除)。
请帮助。谢谢。
答案 0 :(得分:0)
使用显式联接sintax,而不是(基于1992年的旧版)基于位置(这不是出于性能而是出于可读性)而使用隐式联接sintax
为了提高性能,请尝试在连接条件失败(为空)的左连接中更改NOT IN子句
delete from ENTITY
LEFT JOIN (
select distinct(p.PIK)
from PRO p
INNER JOIN PRODET pd ON p.PIK = pd. PIK
INNER JOIN PROTH pt ON pd.PIK = pt.PIK
INNER JOIN PROREW pr ON pt.PIK = pr.PIK
INNER JOIN PROBUCK ppb ON pr.PIK = ppb.PIK
INNER JOIN PROENTITY_TEMP pbe ON pb.PIK = pbe.PIK
INNER JOIN PROMOST ps ON be.PIK=ps.PIK
) t on E.PIK = t.PIK
WHERE t.PIK is null
最后确保您为JOIN所需的所有列均已正确索引