改写一个要跑5小时的SQL成1分钟
改写NOT EXISTS, 分成两个语句,用union all连起来. 一个要跑个小时的SQL,改写后,1分钟就可以跑完. 以下item,link,item_link表都大约40 million.[@more@]INSERT INTO temp_existing_links (item_id,link_id,link_priority,item_identifier)SELECT /*+ INDEX (i IX_ITEM_6) */ i.item_id,NULL,NULL,i.item_identifierFROM item iWHERE i.account_code = p_account_codeAND i.account_type_code = p_account_type_codeAND i.latest_ind ='Y'AND NOT EXISTS (SELECT 1 from link, item_link WHERE link.link_id = item_link.link_id AND valid
解决: 执行计划变了,一条语句要跑20小时候.
执行计划变了,一条语句要跑20小时候. 而原来也许只要5分钟.[@more@]temp_link_id也许有20k. 下面在新refresh的数据库上,计划由原来的nested-loop变成MERGE JOIN 了, 然后新的计划后,要跑20小时才能跑得完.SELECT i.item_idFROM item i,item_link ilWHERE i.item_id = il.item_idAND latest_ind = 'Y'AND account_code = 'CRES_20000'AND account_type_code = 'TRADE'AND link_id IN(SELECT link_idFROM temp_link_id);Execution plan:SQL> SELECT i.item_id2 FROM item i,3 item_link il4 WHERE i.item_id = il.item_id5 AND latest_in