select  id,hphm,nvl(c.lkmc,a.lkbh) as lkmc,to_char(jlrq,'yyyy-mm-dd hh24:mi:ss') as jlrq,
clsd,'详情' as xq,decode(hpzl,'01','大型','02','小型','其他') as hpzl,
decode(jllx,'0','A数据','1','B数据','A数据') as jllx,
decode(sfxg,'0','未修改','1','已修改','未修改') as sfxg, 
decode(jllx,1,decode (sign((clsd-xzsd)/xzsd-0.5),1,'1603','1303'),'未处理') as wfdm  
from kakou.veh_info a, kakou.lk_info c  
where  a.lkbh=c.LKBH(+) and a.xzsd>0  and a.lkbh='024'  
and a.jlrq>to_date('2006-09-14 00:00:00','yyyy-mm-dd hh24:mi:ss') 
and a.jlrq<=to_date('2006-10-15 00:00:00','yyyy-mm-dd hh24:mi:ss') order by id desc 
这个语句的数据量有多大?

解决方案 »

  1.   

    在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引
    IN、OR子句常会使用工作表,使索引失效
    使用IS NULL 或IS NOT NULL会限制索引的使用.被索引的列在某些行中存在NULL值,就不会使用这个索引
    比较不匹配的数据类型也是比较难于发现的性能问题之一
      

  2.   

    SQL> select count(id)
      2  from kakou.veh_info a, kakou.lk_info c
      3  where  a.lkbh=c.LKBH(+) and a.xzsd>0  and a.lkbh='024'
      4  and a.jlrq>to_date('2006-09-14 00:00:00','yyyy-mm-dd hh24:mi:ss')
      5  and a.jlrq<=to_date('2006-10-15 00:00:00','yyyy-mm-dd hh24:mi:ss') order b
     id desc; COUNT(ID)
    ----------
         60819已用时间:  00: 00: 29.01Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=6319 Card=1 Bytes=46
              )   1    0   SORT (AGGREGATE)
       2    1     MERGE JOIN (OUTER) (Cost=6319 Card=38344 Bytes=1763824)
       3    2       TABLE ACCESS (FULL) OF 'VEH_INFO' (Cost=6319 Card=3834
              4 Bytes=1572104)   4    2       BUFFER (SORT)
       5    4         INDEX (UNIQUE SCAN) OF 'PK_LK_INFO' (UNIQUE)
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          65581  consistent gets
          64766  physical reads
              0  redo size
            379  bytes sent via SQL*Net to client
            503  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              1  rows processed一共才6万多条数据,整个veh_info表是500万条数据。
      

  3.   

    order by去掉后,速度会有一点提高。
    没有使用好order by会使速度大受影响,建议order by要用的字段建立索引。
      

  4.   

    从执行计划上来看,对于veh_info ,LK_INFO两张表执行的是全表扫描, 这两步导致笛卡尔积巨大,影响了后面的效率.因此首先要解决这个问题.看到你的语句对a,c表都只涉及了Cost,Card,Bytes三个列,因此可以考虑建立个联合索引.先把对大表的全表扫描优化为索引扫描,再视情况而考虑后续的步骤.
      在执行前再对a,c表都用Analyse命令分析一遍,因为你的Optimizer=CHOOSE ,如果没有足够的信息,系统有时候会认为没有必要用索引.
      如果还没用索引,到init***.ora文件中,把OPTIMIZER_MODE改为RBO,强制使用索引试试,看效率有没有提高.执行前重启ORACLE.