在下用delphi+Oracle开发了一个小的查询程序, 
用了3个UNION连接4个select 语句,用了拼字符串的形式,发现查询数据慢死了,
各位有经验的有什么好方法可共享一下?????????

解决方案 »

  1.   

    SELECT gzb.GZCLR,mkjb.mkjmc,gzb.LX,gzb.JGLX,gzb.CLJG,gzb.DHHM,gzb.YHMC,gzb.LXDH,gzb.GZXX1,gzb.CLRQ,gzb.CLSJ FROM GZB,DH,MKJB where DH.SSJB=mkjb.mkjh AND DH.dhhm=gzb.dhhm and gzb.ZT='运行' and (gzb.CLRQ between to_date('2008-10-28 ','yy-mm-dd') and to_date('2008-10-28 ','yy-mm-dd')) and gzb.LX='普通' order by GZCLR,mkjb.mkjmc,gzb.LX,gzb.JGLX 
    UNION 
    SELECT gzb.GZCLR,'无' AS MKJMC,gzb.LX,gzb.JGLX,gzb.CLJG,gzb.DHHM,gzb.YHMC,gzb.LXDH,gzb.GZXX1,gzb.CLRQ,gzb.CLSJ FROM GZB where gzb.ZT='运行' and (gzb.CLRQ between to_date('2008-10-28 ','yy-mm-dd') and to_date('2008-10-28 ','yy-mm-dd')) and gzb.dhhm not in (select dhhm from yhxxb) and gzb.LX='普通' order by GZCLR,gzb.LX,gzb.JGLX
    UNION 
    SELECT gzb.GZCLR,mkjb.mkjmc,gzb.LX,gzb.JGLX,gzb.CLJG,gzb.DHHM,gzb.YHMC,gzb.LXDH,gzb.GZXX1,gzb.CLRQ,gzb.CLSJ FROM GZB,KD,MKJB where KD.SSJB=mkjb.mkjh AND KD.dhhm=gzb.dhhm and gzb.ZT='运行' and (gzb.CLRQ between to_date('2008-10-28 ','yy-mm-dd') and to_date('2008-10-28 ','yy-mm-dd')) and gzb.LX='普通' order by GZCLR,mkjb.mkjmc,gzb.LX,gzb.JGLX 
    UNION 
    SELECT gzb.GZCLR,'无' AS MKJMC,gzb.LX,gzb.JGLX,gzb.CLJG,gzb.DHHM,gzb.YHMC,gzb.LXDH,gzb.GZXX1,gzb.CLRQ,gzb.CLSJ FROM GZB where gzb.ZT='运行' and (gzb.CLRQ between to_date('2008-10-28 ','yy-mm-dd') and to_date('2008-10-28 ','yy-mm-dd')) and gzb.dhhm not in (select dhhm from KD) and gzb.LX='普通' order by GZCLR,gzb.LX,gzb.JGLX对ORACLE不很熟悉?哪位帮我优化优化或者建立索引什么的? 
      

  2.   

    用union肯定慢了。如果语句不好优化的话,
    可以考虑把你的拼字符串那段建个函数索引。
      

  3.   


    如何建立函数索引??我的语句都在上面了,老打帮忙呀?对Oracle不熟悉,但又必须用,是人家的库
      

  4.   

    你order by 那么多字段。能不满吗。把所有的条件后面的跟order by的字段都建个索引吧。
      

  5.   

    索引的创建:                         
    create unique index idx_stuid on student(stuid);//unique 指明是唯一索引,idx_stuid 索引名,on指明在哪张表上创建,student 表名,stuid 建立索引的列名
    组合索引:
    create index idx_empnoanddepno on emp(empno,deptno);
    如何使用:
    select * from emp where empno=7899 and deptno=10;//当使用的是时候会自动调用该索引以提高查询效率。
    位图索引:
    适用于重复度比较高的列,例如:职位,颜色等,会引用rowid,直取物理地址,提高查询速度,但bitmap列对应数据条数,不利于查询过长记录条数的表。
    索引组织表:
    create table indorg
    (
    vencode int primary key,
    venname varchar2(20)
    ) organization index;//直接在主键上建立索引,查询速度会非常快,但前提是一定要有主键。
      

  6.   


    都不用order by 感觉也不是很快,
    UNION是需要的,不能少
    整个函数索引怎么弄???可以有明显提高速度吗?
      

  7.   

    如果你不需要消除重复行这一个功能的话,就把UNION换成UNION ALL