同样的SQL语句在SQLPLUS下速度如何?

解决方案 »

  1.   

    谢谢各位!恢复方法:
        drop  此用户下的所有talbe,然后imp导入所有的库。“索引恢复的情况”怎样察看?谢谢。
      

  2.   

    不知道各位是否遇见过类似的问题。Oracle每次恢复都是这样吗?  打补丁会不会有效果??
      

  3.   

    如果性能出现问题,还是通过做STATSPACK性能报告来发现问题,我们见不到你的数据库,乱猜测不会有结果的。
    ORACLE的恢复不知道你是指什么恢复,IMP吗?
      

  4.   

    SORRY,没有看清,IMP以后请检查索引是否还是有效。
    select owner,index_name,table_owner,table_name from dba_indexes where status='INVALID';把结果贴出来看看
      

  5.   

    在ORACLE里按用户名重建索引的方法    
    2002-07 余枫 如果你管理的ORACLE数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的.

    它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小. 

    在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放. 

    重建索引可以释放已删除记录索引占用的数据块空间. 

    转移数据, 重命名的方法可以重新组织表里的数据.

    下面是可以按ORACLE用户名生成重建索引的SQL脚本:

    ---------------------------------------------------------------------------
    SET ECHO      OFF;
    SET FEEDBACK  OFF;
    SET VERIFY    OFF;
    SET PAGESIZE  0;
    SET TERMOUT   ON;
    SET HEADING   OFF;
    ACCEPT username CHAR PROMPT 'Enter the index username: '; 
    spool /oracle/rebuild_&username.sql;

    SELECT 
       'REM +-----------------------------------------------+' || chr(10) ||
       'REM | INDEX NAME : ' || owner   || '.' || segment_name 
              || lpad('|', 33 - (length(owner) + length(segment_name)) )
              || chr(10) ||
       'REM | BYTES      : ' || bytes   
              || lpad ('|', 34-(length(bytes)) ) || chr(10) ||
       'REM | EXTENTS    : ' || extents 
              || lpad ('|', 34-(length(extents)) ) || chr(10) ||
       'REM +-----------------------------------------------+' || chr(10) ||
       'ALTER INDEX ' || owner || '.' || segment_name || chr(10) ||
       'REBUILD ' || chr(10) ||
       'TABLESPACE ' || tablespace_name || chr(10) ||
       'STORAGE ( ' || chr(10) ||
       '  INITIAL     ' || initial_extent || chr(10) ||
       '  NEXT        ' || next_extent || chr(10) ||
       '  MINEXTENTS  ' || min_extents || chr(10) ||
       '  MAXEXTENTS  ' || max_extents || chr(10) ||
       '  PCTINCREASE ' || pct_increase || chr(10) ||
       ');' || chr(10) || chr(10)
    FROM   dba_segments
    WHERE  segment_type = 'INDEX'
       AND  owner='&username'
    ORDER BY owner, bytes DESC;

    spool off; ----------------------------------------------------------------------------- 如果你用的是WINDOWS系统, 想改变输出文件的存放目录, 修改spool后面的路径成:
    spool c:\oracle\rebuild_&username.sql; 如果你只想对大于max_bytes的索引重建索引, 可以修改上面的SQL语句:
    在AND  owner='&username' 后面加个限制条件 AND  bytes> &max_bytes  如果你想修改索引的存储参数, 在重建索引rebuild_&username.sql里改也可以. 
    比如把pctincrease不等于零的值改成是零. 生成的rebuild_&username.sql文件我们需要来分析一下, 它们是否到了需要重建的程度:

    分析索引,看是否碎片严重

    SQL>ANALYZE INDEX &index_name VALIDATE STRUCTURE; col name         heading 'Index Name'          format a30
    col del_lf_rows  heading 'Deleted|Leaf Rows'   format 99999999
    col lf_rows_used heading 'Used|Leaf Rows'      format 99999999
    col ratio    heading '% Deleted|Leaf Rows' format 999.99999 SELECT name,
            del_lf_rows,
            lf_rows - del_lf_rows lf_rows_used,
            to_char(del_lf_rows / (lf_rows)*100,'999.99999') ratio
           FROM index_stats where name = upper('&index_name'); 当删除的比率大于15 - 20% 时,肯定是需要索引重建的. 

    经过删改后的rebuild_&username.sql文件我们可以放到ORACLE的定时作业里: 
    比如一个月或者两个月在非繁忙时间运行.

    如果遇到ORA-00054错误, 表示索引在的表上有锁信息, 不能重建索引. 
    那就忽略这个错误, 看下次是否成功. 

    对那些特别忙的表要区别对待, 不能用这里介绍的方法, 
    还要把它们的索引从rebuild_&username.sql里删去.
      

  6.   

    谢谢各位!但是,我是drop用户下所有表后,使用imp导入的。
    如果此时是由于索引无效导致的,那Oracle应该在导入后,自动对索引状态进行调整。如果真是这样,那这是oracle需要改进的一个地方。如果有最新进展,我会通知各位,以便我们大家来交流。