麻烦各位大哥了! 现声明:我对ORALCE一窍不通,只停留在PL/SQL中写写Select语句,因为语句效率太低,疑似运行是会导致锁表,所以有人建议多用索引,貌似先在Explain Plan Window 中运行检查什么.......
  我的问题来了:1、Select语句超时运行会导致锁表,用索引优化是做好的方式吗?或者说不用索引还有其他的优化方式吗?
                 2、怎么使用索引(没用过),是否先要检查现在的Orlace中现有的索引哪些可用?怎样看现有的索引?
                 3、怎样新建索引,建立要遵循什么原则
                 4、写Select 语句是怎样调用索引
                 5、Explain Plan Window的作用,怎么用?附件:下面是我用到一个查询语句、大家可以作为例子给个解答,不胜感激,谢谢啦!!
      SELECT DRDL01,
       MCDL01,
       IMDSC1,
       ILDOC,
       ILTRDJ,
       IOLOT1,
       ILMCU,
       IOLOT2,
       ILPAID,
       ILTRUM,
       ILTRQT,
       ILUNCS,
       IORLOT
   FROM (select * from PRODDTA.F4111
                 WHERE ILDCT = 'FG' and TRIM(F4111.ILFRTO) = 'F'
                   AND ILKCO NOT IN ('02500', '05100', '05200', '06000', '06100', '08000')
                   AND (1=1)) F4111
          LEFT OUTER JOIN (SELECT *
                            FROM PRODDTA.F0006
                                 INNER JOIN PRODCTL.F0005 
                                 ON TRIM(PRODCTL.F0005.DRKY) = TRIM(PRODDTA.F0006.MCRP01)
                                    AND PRODCTL.F0005.DRSY = '00'
                                    AND PRODCTL.F0005.DRRT = '01') A 
               ON trim(F4111.ILMCU) = trim(A.MCMCU)
          LEFT OUTER JOIN PRODDTA.F4101 ON PRODDTA.F4101.IMITM = F4111.ILITM
          LEFT OUTER JOIN PRODDTA.F4102 ON PRODDTA.F4102.IBITM = F4111.ILITM
                                       AND trim(PRODDTA.F4102.IBMCU) = trim(F4111.ILMCU)
          LEFT OUTER JOIN PRODDTA.F4108 ON PRODDTA.F4108.IOLITM =
                                           F4111.ILLITM
                                       AND trim(PRODDTA.F4108.IOLOTN) = trim(F4111.ILLOTN)
                                       AND trim(PRODDTA.F4108.IOMCU) = trim(F4111.ILMCU)      

解决方案 »

  1.   

    1、Select语句超时运行会导致锁表,用索引优化是做好的方式吗?或者说不用索引还有其他的优化方式吗? 
     -- 索引优化是很好的方式,也是很有效的方式,
     -- 不用索引也有相应的优化方式,就是调整你的PL/SQL脚本,减少不必要的输入和关联2、怎么使用索引(没用过),是否先要检查现在的Orlace中现有的索引哪些可用?怎样看现有的索引? 
     -- 使用索引是系统会默认帮你选择,也可以通过 hint来显式地指定索引.
     -- 在创建之前,最好先检查一下现有的索引,
     -- select * from   user_indexes 查询现有的索引  
      
    3、怎样新建索引,建立要遵循什么原则 
     -- 需要平衡query合DML的需要,常用于(子)查询的表应建立索引; 
     -- 把索引建到不同的表空间中; 
     -- 用统一的extent大小: 五个block的倍数或者tablespace指定的MINIMUM EXTENT的倍数; 
     -- 创建索引考虑用NOLOGGING参数,重建索引的时候也一样; 
     -- 创建索引时INITRANS值应该比相应的table的值高一些; 
     -- 对常用SQL语句的where条件中的列建立唯一索引或组合索引,组合条件查询中相应的组合索引更有效; 
     -- 对于组合索引,根据列的唯一值概率,安排索引顺序; 
     -- 如果一个列具有很低的数据基数,并且或者可具有空值,不应作为索引列; 
     -- 如果where语句中不得不对查询列采用函数查询,如upper函数,最好建立相应函数索引; 
     -- 对于低基数集的列,并包含OR等逻辑运算,考虑用Bitmap索引,对于从大量行的表中返回大量的行时也可以考虑Bitmap索引; 
     -- 避免在有大量并发DML运算的表中使用Bitmap索引;4、写Select 语句是怎样调用索引 
    -- oracle中查询时指定索引的方法
    -- http://hi.baidu.com/toriycn/blog/item/1afe3e7faa0a300c28388a36.html5、Explain Plan Window的作用,怎么用? 
    -- 执行计划窗口,监视执行计划的.
      

  2.   

    总结得太好,现在性能优化的方法很多,有系统级的,比如参数调优,有从设计上的,还有SQL语句优化,要多从实践中总结
      

  3.   

    总结得太好,现在性能优化的方法很多,有系统级的,比如参数调优,有从设计上的,还有SQL语句优化,要多从实践中总结
      

  4.   

    你首先要确定你的瓶颈在哪里,然后根据瓶颈建立合适的索引。比如你的查询里有两个子查询:
    select * from PRODDTA.F4111
                     WHERE ILDCT = 'FG' and TRIM(F4111.ILFRTO) = 'F'
                       AND ILKCO NOT IN ('02500', '05100', '05200', '06000', '06100', '08000')
                       AND (1=1)
    以及
    SELECT *
                                FROM PRODDTA.F0006
                                     INNER JOIN PRODCTL.F0005 
                                     ON TRIM(PRODCTL.F0005.DRKY) = TRIM(PRODDTA.F0006.MCRP01)
                                        AND PRODCTL.F0005.DRSY = '00'
                                        AND PRODCTL.F0005.DRRT = '01'
    你先把这两个查询分别单独执行一下,看看它们的速度。如果都很快,说明瓶颈不在他们这里。
    然后再看几个LEFT OUTER JOIN右边的表数据量大不大,如果很大,可能会导致两个表join的时候很慢,你可以在相应的关联字段上建立索引,比如PRODDTA.F4101.IMITM或者PRODDTA.F4102.IBITM.默认oracle会找最合适的索引使用,但是你也可以在sql语句里面使用暗示的方法建议它用哪个索引.
      

  5.   

    lz "Explain Plan Window" 指的是在toad 或者 pl/sql developer中的 “执行计划窗口”?lz的SQL为什么都是 left outter join?复杂程度和SAP有得一拼 哈哈
      

  6.   

    首先要知道SQL优化没有定式,否则Oracle自己就做了,
    没有一个规则能够解决所有问题,
    所以,没有执行计划分析,恐怕找到病根困难,
    提供执行计划,什么都知道了。
      

  7.   

    能不能通过把Select结果放在临时表中,这样来解决读取的速度,
    比如在SQL SEVER 中  Select * Into #TableName From Table   
                       Select* From #TableName 那么我在Oracle中怎样在Select时建立临时表