因为是做统计,总觉得做什么索引,不能控制。表:t_equip 数据量1200万
    字段:eid 主键
          公司: orgid (100种)not null;
          部门: deptid (每个公司下约30--100个部门)not null;
          设备所属:A/B (两种值) not null;
          设备类型:etype(20多种值) not null;
          删除标记:0/1 (两种值) not null;
          购买时间:buydate    not null;
          设备所属线路:  lineid   not null;
          设备所属主线路:mainlineid   not null;
  
   线路与主线路是一个层次关系表(3万条)。t_line       主线(mainlineid) ,  线路(lineid),设备电压等级:(4种值)
   集团,部门,公司也是一个层次关系表(3千条)。t_croporgdept 集团(crop)=>公司(org)=>部门(dept)   fid(上级部门)
---------------------------------------------------------------------------------------------------------
现在问题:t_equip表里面,没有记录集团的信息。所以要联合t_croporgdept,表查询。 设备表没有电压等级信息,所以要联合电压表。
          
   索引:1 设备类型
         2 delflag,设备所属,公司,部门,主线,设备类型。----------------------------------------------结果列表---------------------------------------
部门名称,主线名称,线路条数,设备类型A,设备类型B,设备类型C,设备类型D,设备类型E
---------------------------------------------------------------------------------------------存储过程传入参数:_fid(集团id),_buytime(小于购买时间),_etype设备类型,_eBelong设备所属,_volt电压
-----------------------------------------------------------------------------------------------
select COUNT(*) CT,e.orgid,e.deptid,e.mainlineid,e.etype FROM t_equip e,t_line l ,t_croporgdept  c
    where 
          e.lineid=l.lineid
          and l.volt=_volt
          and  e.orgid = c.orgid
          and  c.fid=_fid
          and  to_date(e.buydate,'YYYY-MM-DD,)<to_date(_buytime,'YYYY-MM-DD')
          and  e.etype in (_etype);
          and  e.delflag = 0
          and  e.设备所属 = A
    group by e.orgid,e.deptid,e.mainlineid,e.etype
-----------------------------------------------------------------------------------------------
最后在上面的SQL语句外面套一个行转列。
-----------------------------------------------------------------------------------------------
问题:表的链接条件 e.lineid=l.lineid ,  e.orgid = c.orgid......... 
      和过滤条件  e.etype in (_etype); e.delflag = 0 ............
      是不是连接条件放在靠近where的地方,过滤条件放在外面?  
      过滤条件的顺序与索引顺序的关系。
      
      像时间这种类型的比较,他的顺序要放在那里好?放在里面还是靠外面?
---------------------------------------------------------------------------------------
     具体怎么走,真的很迷惑。
有没有什么书,讲解SQL语句执行的过程,先做什么,后来做什么。其原理和规则是什么?
---------------------------------------------------------------------------------------
现在执行计划,是走etype索引,就是把 e.etype in (_etype) 里面的设备并行查询。
=====================================================================================
 

解决方案 »

  1.   

    1、是不是连接条件放在靠近where的地方,过滤条件放在外面?他的顺序要放在那里好?放在里面还是靠外面?
       首先确定你的oracle数据库是什么版本
       a、9i以下(包括9i),查看数据库优化器是什么模式,如果是role模式,可以考虑where后面过滤条件的位置。
       b、10g以后(包括10g),oracle对role模式优化器不在进行技术支持,oracle不建议使用。所以不用考虑where后面过滤条件的位置。2、像时间这种类型的比较
       建议使用“函数索引”3、有没有什么书,讲解SQL语句执行的过程,先做什么,后来做什么。其原理和规则是什么?
        首先看一些关于EXPLAIN PLAN、SQL Trace使用方法,学习跟踪sql,解决一般优化问题。后续学习STATSPACK报表,深度了解oracle优化问题。4、现在执行计划,是走etype索引,就是把 e.etype in (_etype) 里面的设备并行查询。
        a、这里有一个问题,“设备并行查询”的意思是“并行查询”吗?如果是并行查询话,一定不走索引。是全表扫描查询数据,这里是资源换取时间。消耗的是cpu资源。
        b、如果不使用并行查询,执行你的sql,查看执行计划,filler那些字段执行的全表扫描,在相应的字段上面建立索引,反复调试。
      

  2.   

    用autotrace 分析你现在sql哪些没走索引,在相应的字段上建立索引.
      

  3.   

    尽量少用in,连表应该都比in快。还有就是可以建多个索引,条件字段要按照索引顺序排序