错误的索引统计信息导致oracle expdp导500多G的大分区表时hang住
2017-05-15 18:43
519 查看
1:用expdp导数据,语句如下
expdp system/oracle directory=xxx TABLES=xxx.AC51 dumpfile=xxx_%U.dmp logfile=xxx.log EXCLUDE=index,STATISTICS,constraint parallel=15 compression=ALL cluster=n version=11.2.0.4.0
Note:从语句中看到是不导出表的索引,统计信息和约束的
2:数据库hang住
数据库导出4个小时,hang住,停止导出。
2.1查询导出的进度
select sid,serial# from v$session s,dba_datapump_sessions d where s.saddr=d.saddr;
2.2查询消耗资源多,长时间runing的sql
2.3 定位问题
发现一条长时间无法执行完的sql
SELECT NVL((SELECT /*+ NESTED_TABLE_GET_REFS NO_PARALLEL */ 1 FROM "xxx"."AC51" PARTITION("AC51_MAX") WHERE ROWNUM = 1), 0) FROM SYS.DUAL
找到该问题
3:问题分析
3.1 Oracle记录相关的一些信息,当expdp使用network的方式的时候,如果cursor_sharing=similar,可能会因为没有正确的做绑定变量窥探而导致错误的结果,从而导致poor
performance。但这里是本地的expdp方式,并没有使用network。
3.2 运行
SELECT NVL((SELECT /*+ NESTED_TABLE_GET_REFS NO_PARALLEL */ 1 FROM "xxx"."AC51" PARTITION("AC51_MAX") WHERE ROWNUM = 1), 0) FROM SYS.DUAL
发现确实无法出现结果
3.3 查看执行计划
CBO采用的是index full scan
因为他们有一个额外的环境可以测试此表,测试一样的sql,发现可以秒出信息
CBO采用的table access full
两者的执行计划不一样,索引的统计信息出了问题?
查看索引的统计信息
发现索引的统计的信息确实不正常。
在有问题的sql的加上full的hint,发现查询正常响应。
在出现问题的数据,加入hint强制走table access full
4: 解决方案
因为这条表的size大于500G,重新收集统计信息,时间太长。所以让他从测试的库上导出“正确”的统计信息,复制到有问题的表上。然后重新运行expdp。结果运行正常。
expdp system/oracle directory=xxx TABLES=xxx.AC51 dumpfile=xxx_%U.dmp logfile=xxx.log EXCLUDE=index,STATISTICS,constraint parallel=15 compression=ALL cluster=n version=11.2.0.4.0
Note:从语句中看到是不导出表的索引,统计信息和约束的
2:数据库hang住
数据库导出4个小时,hang住,停止导出。
2.1查询导出的进度
select sid,serial# from v$session s,dba_datapump_sessions d where s.saddr=d.saddr;
2.2查询消耗资源多,长时间runing的sql
2.3 定位问题
发现一条长时间无法执行完的sql
SELECT NVL((SELECT /*+ NESTED_TABLE_GET_REFS NO_PARALLEL */ 1 FROM "xxx"."AC51" PARTITION("AC51_MAX") WHERE ROWNUM = 1), 0) FROM SYS.DUAL
找到该问题
3:问题分析
3.1 Oracle记录相关的一些信息,当expdp使用network的方式的时候,如果cursor_sharing=similar,可能会因为没有正确的做绑定变量窥探而导致错误的结果,从而导致poor
performance。但这里是本地的expdp方式,并没有使用network。
3.2 运行
SELECT NVL((SELECT /*+ NESTED_TABLE_GET_REFS NO_PARALLEL */ 1 FROM "xxx"."AC51" PARTITION("AC51_MAX") WHERE ROWNUM = 1), 0) FROM SYS.DUAL
发现确实无法出现结果
3.3 查看执行计划
CBO采用的是index full scan
因为他们有一个额外的环境可以测试此表,测试一样的sql,发现可以秒出信息
CBO采用的table access full
两者的执行计划不一样,索引的统计信息出了问题?
查看索引的统计信息
发现索引的统计的信息确实不正常。
在有问题的sql的加上full的hint,发现查询正常响应。
在出现问题的数据,加入hint强制走table access full
4: 解决方案
因为这条表的size大于500G,重新收集统计信息,时间太长。所以让他从测试的库上导出“正确”的统计信息,复制到有问题的表上。然后重新运行expdp。结果运行正常。
相关文章推荐
- Oracle收集统计信息和重建索引
- Oracle数据库案例整理-Oracle系统运行时故障-表空间所在的目录没有可用空间导致收集统计信息失败
- oracle重建、更新索引、索引统计信息命令
- oracle 11g 自动收集统计信息 导致IO过大
- Oracle Service Bus集群“聚集器无法接受聚集统计信息”错误处理
- Oracle性能优化之oracle里表、索引、列的统计信息
- 解决oracle 11g安装导致数据库无法自动搜集统计信息
- 10g r2后impdp 导入仅数据结构导致 索引等统计信息锁定
- Oracle收集索引统计信息
- ORACLE SQL调优之统计信息缺失导致的逻辑读暴增
- 统计信息自动收集时间窗口导致分区表执行计划错误
- oracle表不走索引,收集一下表的统计信息
- Oracle重建表索引及手工收集统计信息
- oracle重建、更新索引、索引统计信息命令
- 收集统计信息导致索引被监控
- SQL Server索引统计信息未及时更新,导致排序混乱
- oracle反序索引导致出现“ORA-03113: 通信通道的文件结束”错误
- Oracle统计信息的导出、导入
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引——oracle
- oracle表分区:更改分区键值列的数据,导致ORA-14402错误