SELECT  DISTINCT  p.sID AS sID, p.SNAME AS sName, mainOrg.sFName AS sFName 
FROM SA_OPPerson p JOIN SA_OPOrg mainOrg ON p.SMAINORGID = mainOrg.sID  
WHERE  ( p.sID IN ('-') ) OR (p.sID IN (SELECT  pm.SPERSONID AS sPersonID 
FROM SA_OPOrg org JOIN SA_OPOrg orgC ON orgC.sFID LIKE org.sFID || '%' JOIN SA_OPOrg pm ON orgC.sID = pm.sParent  
WHERE  org.sID IN ('-', 'E93A43058AD540C191CEDC9B6C79E940', 'PSN01', 'A3226FBBBB864D92A5FBE925572BBA06') ))   
ORDER BY mainOrg.sFName ASC, p.SNAME ASC

解决方案 »

  1.   

    具体的优化你要提供执行计划的,如下先给你改一下,再试试,你看一下你耗时的是不是在排序上了?SELECT p.sID AS sID, p.SNAME AS sName, mainOrg.sFName AS sFName
      FROM SA_OPPerson p
      JOIN SA_OPOrg mainOrg ON p.SMAINORGID = mainOrg.sID
     WHERE p.sID IN(SELECT pm.SPERSONID AS sPersonID
               FROM SA_OPOrg org
               JOIN SA_OPOrg orgC ON orgC.sFID LIKE org.sFID || '%'
               JOIN SA_OPOrg pm ON orgC.sID = pm.sParent
              WHERE org.sID IN ('-', 'E93A43058AD540C191CEDC9B6C79E940', 'PSN01',
                     'A3226FBBBB864D92A5FBE925572BBA06')
               union all
               select '-' sPersonID from dual)
    group by p.sID, p.SNAME, mainOrg.sFName
    ORDER BY mainOrg.sFName ASC, p.SNAME ASC
      

  2.   

    1 distinct 和order by 是很消耗资源的,你看看能不能从业务上把这两个去掉?
    2 把or语句去掉,中间用union all连接两个结果集
    3 第二个语句中,将表与表关联的方法把in去掉
      

  3.   

    distinct是取消重复数据,排序倒非必须。
    on是条件也能去掉吗?
    不用in用什么?
      

  4.   

    下面这句能让效率提升不少,原来24s左右,现在0.2s左右
    String sqlGetPersons = "Select distinct p as sID, p.sName, mainOrg.sFName "
    + " from SA_OPPerson p "
    + " join SA_OPOrg mainOrg on p.sMainOrgID = mainOrg "
    + " OPTIONAL JOIN SA_OPOrg orgC ON p = orgC.sPersonID "
    + " OPTIONAL JOIN SA_OPOrg org ON org IN ("+orgIDs+") and orgC.sFID LIKE concat(org.sFID, '%') "
    + " where p in ("+psnIDs+") OR org is not null "
    + " order by mainOrg.sFName, p.sName ";
    排序去掉ASC就好了