日期:2014-05-17  浏览次数:20902 次

oracle查询语句 请教如何把这个查询的效率提高
select f.type_name, b.elec_string, e.source_name, d.supplyer_name
  from mobile_storage a,
  mobile_sale_detail b,
  mobile_contract c,
  mobile_param_supplyer d,
  mobile_param_mobile_type f,
  mobile_param_source e
 where a.elec_string = b.elec_string
  and a.source_id = e.source_id
  and c.supplyer_id = d.supplyer_id
  and a.contract_id = c.contract_id
  and b.mobile_type = f.mobile_type
  and b.sale_id = '12345' --条件1 id='12345' (页面传入条件) 
  and b.mobile_type = 'HUAW0003'; --条件2 mobile_type = 'HUAW0003' (页面传入条件)

这是我现在的查询方法,效率不高,我不知道怎么改进,而且不同的条件查询有差,快的在10秒左右,慢的在1分钟左右,无法接受。

下面我先介绍下几个表结构,只将所需关键列给出 (数据量很大,必须要效率高)

【mobile_storage】 a  
  [mobile_type] //终端类型
  [elec_string] //终端串号●,每个终端唯一,根据串号可唯一确定一个终端
  [source_id] //用来关联【mobile_param_source表的source_id】查找终端的功能
  [contract_id] //用来关联【mobile_contract表的contract_id】查找供应商[supplyer_id]
  再用[supplyer_id]去对于【mobile_param_supplyer表的supplyer_id】查找供应商名称[supplyer_name]
  
【mobile_sale_detail】 b 
  [sale_id] //销售单号,一个单号可能包含多个终端  
  [mobile_type] //终端类型  
  (用[sale_id],[mobile_type]来确定[elec_string]去对应【mobile_storage表中的】[elec_string])
  [elec_string] //终端串号,每个终端唯一,根据串号可唯一确定一个终端

【mobile_contract】 c
  [contract_id] //
  [supplyer_id] //用来关联【mobile_param_supplyer表】查询出供应商名称字段[supplyer_name]

【mobile_param_supplyer】 d
  [supplyer_id] //供应商ID
  [supplyer_name]//供应商名称字段●
 
【mobile_param_mobile_type】 f
  [mobile_type] //终端类型
  [type_name] //终端类型名称●
  
【mobile_param_source】 e
  [source_id] //功能ID
  [source_name] //终端功能名称●
  
  
  注:●为需要查询出来的四个字段
  
基本逻辑:
  输入2个参数为 id='12345' 和 mobile_type='HUAW0003'
  从【b表】中查找到elec_string去关联【a表】查找到contract_id和source_id分别对应【c表】【e表】
  再根据【c表】中的supplyer_id去【d表】中找到supplyer_name

还有不清楚的请问我,我想应该很详细了

------解决方案--------------------
每个表的数据量有多少? 相关字段建索引。如果还慢就把执行计划贴上来。

1:
b.sale_id -- 数据类型是number型的还是varchar2型的,如果是number型的换成下面的语句试试:
and b.sale_id = 12345

2: 如果是web程序传过来的值,把下面换成绑定变量的方式:
and b.sale_id = '12345' --条件1 id='12345' (页面传入条件) 
and b.mobile_type = 'HUAW0003'; --条件2 mobile_type = 'HUAW0003' (页面传入条件) 


比如:在JAVA里面,
...
and b.sale_id = ?
and b.mobile_type = ?;
...

------解决方案--------------------
使用绑定变量,不要直接输入字符串。