一、背景
最近客户一个线下开发环境,同一个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 off
set echo off
set flush off
set pagesize 9000
set linesize 80
set long 100000
spool rcindscr.sql
select dbms_metadata.get_ddl('INDEX', index_name, owner) from dba_indexes where owner in ('HR');
执行完上述SQL之后,rcindscr.sql文件包含你需要的索引定义语句。
3、执行生成的创建索引语句文件--开发环境
SQL>@rcindscr.sql
三、小结
欢迎大家留言讨论,喜欢的朋友,欢迎大家点赞关注。
