CREATE OR REPLACE VIEW IBS_V_BID_PROJ_LIST AS
SELECT P.PROJID,P.PROJNAME,P.PROJNO,
P.PROJ_ADDITION,U.NAME,(SELECT DISTINCT strCat_HitBider(P.PROJID) FROM IBS_T_BID_NODE_HITBIDRESU) AS BID_UNIT, --项目下所有中标单位P.CURRENCY ||':'||(SELECT SUM(NVL(R.BIDPRICE,0)) FROM IBS_T_BID_NODE_HITBIDRESU R
  WHERE R.PROJID = P.PROJID
 ) AS BID_PRICE  --中标金额 FROM IBS_T_BID_PROJ_INFO P
 JOIN IBS_T_PUB_USER U ON P.USER_ID=U.USER_ID
 ORDER BY P.PROJID DESC
CREATE OR REPLACE FUNCTION "STRCAT_HITBIDER" ( str_in in varchar2 )--分类字段,用‘/’连接某项目各标段下的中标单位
  return varchar2
is
      str_list  varchar2(4000) default null;--连接后字符串
      str  varchar2(20) default null;--连接符号
begin
      for x in ( select C.FULL_NAME from IBS_T_BID_NODE_HITBIDRESU R    
                 JOIN IBS_T_PUB_COMPANY C ON C.COMPANY_ID = R.COMPANY_ID
                 where R.PROJID = str_in 
      ) loop
          str_list := str_list || str || to_char(x.FULL_NAME);
          str := '/';
      end loop;
      return str_list;
end;查询这个视图IBS_V_BID_PROJ_LIST 的时候很慢 就是因为多了BID_UNIT这个字段的原因 注释掉这个字段 不到1秒就出来了,不然要1分多钟,IBS_T_BID_NODE_HITBIDRESU表有两千多数据, IBS_T_BID_PROJ_INFO 有接近两百条 全耗在执行那个函数上了
怎么换个方式处理下啊?

解决方案 »

  1.   

    IBS_T_BID_NODE_HITBIDRESU表的PROJID,COMPANY_ID两列的索引我也加了 效果也不是很明显
      

  2.   

    就这个,没有什么好优化的。
    我认为最好的方式还是就修改你的应用,添加中标信息的时候,就应该形成所有中标单位的连接串,并用额外的字段存储这个信息。
    这个可以在应用中实现,也可以用trigger来实现。
    最后,你就可以直接查询了,否则总是很慢。还有一个就是:
    (SELECT   DISTINCT   strCat_HitBider(P.PROJID)   FROM   IBS_T_BID_NODE_HITBIDRESU)   AS   BID_UNIT,   --项目下所有中标单位 
    把这个语句修改一下
    (SELECT  strCat_HitBider(P.PROJID)   FROM   dual)   AS   BID_UNIT,   -
      

  3.   

    (SELECT strCat_HitBider(P.PROJID)  FROM dual) AS  BID_UNIT
    这句话真是神奇啊,非常感谢您!
    这样一替换 不到两秒就出来结果了
    SELECT       DISTINCT       strCat_HitBider(P.PROJID)       FROM       IBS_T_BID_NODE_HITBIDRESU 为什么替换成那样也同样可以,我却不是很懂
      

  4.   

    关键是因为distinct的关系,既然是返回唯一的,而且你的函数主要也根据参数来获得结果,所以后面跟一个from table 是没有必要的。