oracle数据库imp导入数据,索引没有导入,如何补救?

一、背景

最近客户一个线下开发环境,同一个SQL语句,在开发环境与生产环境执行,执行时间差别很大。在生产环境执行时间很短,而在开发环境则需要很长的时间。客户让帮忙查找原因。

二、过程

2.1 分析SQL的执行计划

首先我们想到的,就是分析这个SQL的执行计划,看看这个SQL的执行计划在两个环境中是否一致。结果发现SQL执行计划在两个环境不一致。在生产环境中走的是索引,而在开发环境中,走的全表扫描。查看执行计划的方法如下:

explain plan for select * from 表名;--查看执行计划明细select * from table(dbms_xplan.display);

结果发现开发环境走的是全表扫描,进一步分析可知,是由于客户在导入数据的时候,索引没有成功导入所致。

2.2 如何单独导入索引

首先我们在生产环境获取这个schema的索引的定义。我们通过DBMS程序包来获取索引的定义

1、查看程序包DBMS_METADATA.GET_DDL表结构的定义

DBMS_METADATA.GET_DDL (object_type IN VARCHAR2,name IN VARCHAR2,schema IN VARCHAR2 DEFAULT NULL,version IN VARCHAR2 DEFAULT 'COMPATIBLE',model IN VARCHAR2 DEFAULT 'ORACLE',transform IN VARCHAR2 DEFAULT 'DDL')RETURN CLOB;

2、生产环境获取HR索引的定义

set heading offset echo offset flush offset pagesize 9000set linesize 80set long 100000spool rcindscr.sqlselect dbms_metadata.get_ddl('INDEX', index_name, owner) from dba_indexes where owner in ('HR');

执行完上述SQL之后,rcindscr.sql文件包含你需要的索引定义语句。

3、执行生成的创建索引语句文件--开发环境

SQL>@rcindscr.sql

三、小结

欢迎大家留言讨论,喜欢的朋友,欢迎大家点赞关注。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章