SELECT  zy_detail_charge.ward_code,zy_bill_item.code,sum(zy_detail_charge.charge_fee)
FROM 
zd_charge_item ,zy_detail_charge ,zy_bill_item,
(select distinct inpatient_no,admiss_times,ledger_sn  from zy_receipt 
where    account_date >='2007-01-01' and account_date < '2007-02-01' ) a
WHERE ( zy_detail_charge.charge_code = zd_charge_item.code ) and  
 ( zd_charge_item.bill_item_code = zy_bill_item.code ) and  
(  zy_detail_charge.inpatient_no = a.inpatient_no ) AND  
( zy_detail_charge.admiss_times = a.admiss_times ) AND  
( zy_detail_charge.ledger_sn = a.ledger_sn ) AND
  zy_detail_charge.charge_status = '3' and 
 zy_detail_charge.ward_code = '3020100'
GROUP BY zy_detail_charge.ward_code,
        zy_bill_item.code;
zy_detail_charge 这个表的数据超过100万条记录,花了十多分钟才能出结果,请问如何优化?每个表都有索引

解决方案 »

  1.   

    试 试 先 select zy_detail_charge.ward_code,sum(zy_detail_charge.charge_fee) into # from ....
    再 用 查 询 得 到 所 需 结 果 .
      

  2.   

    不明白into # 这个是什么意思?
      

  3.   

    用查询分析器“先是估计的执行计划”,大部分的花销都在table scan [zy_detail_charge], 也就是这个表中有100万行,就遍历99万行,几乎是遍历整个表 
      

  4.   

    FROM  
    zd_charge_item ,zy_detail_charge ,zy_bill_item, 
    (select distinct inpatient_no,admiss_times,ledger_sn  from zy_receipt  
    where account_date  >= '2007-01-01 ' and account_date  <  '2007-02-01 ' ) a
    这样写当然慢
    可以改成联接查询
      

  5.   

    --account_date时间列创聚集索引,zy_receipt表inpatient_no,admiss_times,ledger_sn建组合索引
    --zy_detail_charge表inpatient_no,admiss_times,ledger_sn建组合索引,charge_code另建一索引
    --zd_charge_item表Code建索引,zy_bill_item表建bill_item_code索引
    SELECT  
    b.ward_code,
    c.code,
    sum(b.charge_fee) 
    FROM  
    zd_charge_item  a
    join
    zy_detail_charge b on b.charge_code=a.Code
    join
    zy_bill_item c on a.bill_item_code=c.Code
    where
    exists(select 1 from zy_receipt where inpatient_no=b.inpatient_no and admiss_times=b.admiss_times and ledger_sn= b.ledger_sn
    and account_date between '2007-01-01 ' and '2007-01-31 23:59:59') and b.charge_status=3 and b.ward_code='3020100'
    group by 
    b.ward_code,c.code
      

  6.   

    使用存在谓词exists的效率比连接的效率高很多,它使用的内存小。