/*
问题描述:
PLSQL在@dbmaizhi用户下执行两条SQL语句,第一句顺利查出结果,第二句死锁在那里不动。
PLSQL在@do10 用户下执行两条SQL语句,都能顺利执行查出结果。
*/SELECT * FROM zcall.xyf_user_area@do10 t where t.bill_id in
('13819242619','18267287524');SELECT t.* FROM zcall.xyf_user_area@do10 t where t.bill_id in 
(select bill_id from sl_sys.t_38_search_bill_ids@dbmaizhi t1);/*
表sl_sys.t_38_search_bill_ids@dbmaizhi 就一个字段“bill_id”,数据就两条'13819242619','18267287524'
表zcall.xyf_user_area@do10 有字段“bill_id”和其他信息字段,“bill_id”建了索引,数据量一共35万条
*/

解决方案 »

  1.   


    SELECT t.* 
    FROM zcall.xyf_user_area@do10 t,
         sl_sys.t_38_search_bill_ids@dbmaizhi t1 
    where t.bill_id= t1.bill_id;第二个SQL语句改这样试试,效率应该高很多。
      

  2.   

    DBlink 会影响到解释计划。特别是有update或者insert或者多个dblink时更是如此。第一个sql会把sql remote到目标数据库执行,能用上索引
    第二个sql是把xyf_user_area数据 load到本地数据库后再进行筛选。
      

  3.   

    楼主可以将远程数据先保存到本地,然后再执行一系列复杂操作就可以了。create table tbl_xxxx1 as select bill_id from sl_sys.t_38_search_bill_ids@dbmaizhi t1;create table tbl_xxxx2 as SELECT t.* FROM zcall.xyf_user_area@do10 t ;SELECT t.* FROM tbl_xxxx2 t where t.bill_id in  
    (select bill_id from tbl_xxxx1 t1);
      

  4.   

    回复3楼:
    SELECT t.* 
    FROM zcall.xyf_user_area@do10 t,
         sl_sys.t_38_search_bill_ids@dbmaizhi t1 
    where t.bill_id= t1.bill_id;效果一样,用join,exists,any(...),都试过了,效果都一样
      

  5.   

    大量数据不要用IN,用EXISTS 效率会大大提高。