现在我有一个在Mysql数据库上运行50分钟的查询,我不能接受...
我希望此过程可以在15分钟内运行。...
insert into appianData.IC_DeletedRecords
(sourcetableid,
concatkey,
sourcetablecode)
select mstid,
concatkey,
'icmstlocationheader' as sourcetablecode
from appianData.IC_MST_LocationHeader
where concatkey not in(select concatkey
from appianData.IC_PURGE_LocationHeader)
“ sourcetableid”和“ mstid”是唯一的。
那么添加索引或对此进行优化的最佳方法是什么?
谢谢
答案 0 :(得分:1)
我将select
写为:
select mstid, concatkey, 'icmstlocationheader' as sourcetablecode
from appianData.IC_MST_LocationHeader lh
where not exists (select 1
from appianData.IC_PURGE_LocationHeader lhp
where lhp.concatkey = lh.concatkey
);
然后您要在IC_PURGE_LocationHeader(concatkey)
上建立索引。
答案 1 :(得分:0)
由于它是INSERT INTO appianData.IC_DeletedRecords (sourcetableid, concatkey, sourcetablecode)
SELECT m.mstid, m.concatkey, 'icmstlocationheader' as sourcetablecode
FROM appianData.IC_MST_LocationHeader AS m
LEFT JOIN appianData.IC_PURGE_LocationHeader AS p
ON m.concatkey = p.concatkey
WHERE p.concatkey IS NULL
;
条件,因此您应该能够使用“ LEFT JOIN ... WHERE rightTable无匹配项”,而不必担心会增加结果的多个匹配项。
concatkey
使用此版本查询或您在问题中提出的版本查询,两个源表中的DrvClassA *drv_a_obj;
DrvClassB *drv_b_obj;
DrvClassC *drv_c_obj;
if ( use_drv_a ) {
drv_a_obj = new DrvClassA(args);
}
if ( use_drv_b ) {
drv_b_obj = new DrvClassB(args);
}
if ( use_drv_c ) {
drv_c_obj = new DrvClassC(args);
}
上的索引应有很大帮助。