因为是做统计,总觉得做什么索引,不能控制。表: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) 里面的设备并行查询。
=====================================================================================
字段: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) 里面的设备并行查询。
=====================================================================================
首先确定你的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那些字段执行的全表扫描,在相应的字段上面建立索引,反复调试。