Bulkcopy对应的实现是Oracle的SQL*LOADER,期间造成Index Unusable,并且last_ddl_time上是不体现的
部分项目反馈系统整体突然变慢,经查询发现一个系统核心的大数据表的索引状态全部是Unusable。
导致索引失效的直接原因:当某些操作导致数据的rowid改变,索引就会完全失效。
那什么时候会导致rowid改变使得索引unuseable或者invalid呢?
一般普通表在在如下3个情况下可以使index unusable
1) 手动alter index unusable
2) Move 【alter table move】【alter table t02 move tablespace tbs01;】包括分区操作
3) sqlldr 【sqlldr ( parallel or direct ) append 】【sqlldr direct=y + 主键重复】
匹配三个选项:
1、检查dba_objects的last_ddl_time,对应的时间远早于问题发生的时间段,第一种可能性排除了
2、检查问题表没有分区,也没有做数据移动、统计信息收集之类的操作,last_ddl_time也可以作为佐证
3、回忆一下,貌似没有使用过sqlldr,很奇怪、郁闷
从AWR、ASH了解到问题发生的时间段索引失效的表发生了严重的library cache lock等待,查询历史性能视图dba_hist_active_sess_history,发现大量library cache lock等待的会话都在被同一个会话阻塞,而该会话没有被其他阻塞,等待事件为db file sequential read,不可理解,为什么会是索引查找呢?根据sql_id,已经查不到当前会话正在执行的SQL脚本了。
等待下一次问题重现,希望能够看到同样的信息,看一下阻塞源头的会话正在执行一个什么样的东东。
果然,第二天问题重现了,抓取所有会话及当前正在执行SQL,马上发现了问题:INSERT /*+ SYS_DL_CURSOR */ INTO "LC0079999"."JKL_TEST" ("ID", "C1","C2","C3",) VALUES (NULL,NULL,NULL,NULL)
第一、这是我们的数据表
第二、好像不是我们手工产生的SQL语句
第三、查了一下SYS_DL_CURSOR 关键字,等同于sqlldr(direct=true),重现一把BulkCopy,果然可以看到这条语句
注意:
Bulkcopy的方式本身产生的语句为:INSERT /*+ SYS_DL_CURSOR */ INTO "LC0079999"."JKL_TEST" ("ID", "C1","C2","C3",) VALUES (NULL,NULL,NULL,NULL)
/*+ SYS_DL_CURSOR */ 就是SQL Loader的方式,也就是说Bulkcopy需要谨慎使用,因为他会造成该表的索引失效。
并且在执行Sql Loader前,会执行对表的排他锁:LOCK TABLE "LC0079999"."JKL_TEST" IN EXCLUSIVE MODE NOWAIT
结论:按照目前发现的问题,BulkCopy应该仅适用于日志之类的极少并发的场景,建议谨慎使用Bulkcopy
Bulkcopy对应的实现是Oracle的SQL*LOADER,期间造成Index Unusable,并且last_ddl_time上是不体现的的更多相关文章
- Oracle【IT实验室】数据库备份与恢复之二:SQL*Loader
2.1 基本知识 Oracle 的 SQL* LOADER 可以将外部格式化的文本数据加载到数据库表中.通常 与 SPOOL导出文本数据方法配合使用. 1.命令格式 SQLLDR keyw ...
- 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...
- oracle数据处理之sql*loader(一)
SQL*Loader是oracle提供的可以从多种平面文件中向数据库中加载数据的工具,它比较适合业务分析类型数据库(数据仓库);使用sqlldr工具可以在很短的时间内向数据库中加载大量的数据,像把制作 ...
- oracle数据处理之sql*loader(二)
目录 SQL*Loader对不同文件及格式的处理方法 2.1 Excel文件 一般的Excel文件最大行数不超过65536行,说明数据处理量并不大,处理Excel的方式是将其另存为CSV格式文件,然后 ...
- SQL*Loader之CASE6
CASE6 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase6.sql set termout off rem host write sys$output &quo ...
- SQL*Loader 详解
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...
- MySQL、Oracle和SQL Server的分页查询语句
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...
- Datatypes translation between Oracle and SQL Server
Datatypes translation between Oracle and SQL Server part 1: character, binary strings Datatypes tran ...
- Oracle经典SQL
最近本人整理了一些Oracle sql,现分享给大家,后续还会更新.如果有错误的地方,请指正,共同学习.贴上去的sql都是我测试过的,大家可以粘贴在自己的电脑上试试. 1.查询部门的名称,及最低收入雇 ...
随机推荐
- IIS7+windows 64位配置注意事项
问题和解决办法 1 如果网站为Asp:再asp中注意启用父路径 2 操作必须使用一个可更新的查询:给用户iis_iusrs 一个完全控制的权限 3 Windows(64位IIS)未在本地计算机上 ...
- IOS百度地图获取所在的城市名称
笔者的app要实现定位所在省和城市名称,借此总结巩固一下! @interface VenueListVC : BasePageTableViewVC<BMKLocationServiceDele ...
- android SDK 离线下载更新
http://blog.csdn.net/harvic880925/article/details/37913801 前言:在公司配置eclipse做android开发,真是烦死了,不知公司做了哪门子 ...
- 4 多表代替密码之Hill 密码_1 矩阵工具类
在说明Hill加密之前要先复习线性代数的知识,主要是关于矩阵的一些运算和概念. 一.矩阵的逆: 定义方阵M的逆矩阵应该满足M*M^-1==I,其中I是单位矩阵,比如: 但是这个地方是对英文字母进行加密 ...
- Python学习之运算符
Python运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 取模 ** 幂 // 整除 比较运算符 运算符 描述 == 等于 != 不等于 <> 不等于 &g ...
- ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...
(一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...
- 利用Ajax+MSMQ(消息队列)+WebService实现服务器端向客户端的信息推送
需求: 每当数据库有数据更新时,推送到客户端 软需求: 1.服务器资源有限,要求资源占用尽可能小: 2.项目可控,不许调用第三方不可信不稳定的方法. 已有事例: 1.58到家采用的方法是TCP的长连接 ...
- ListView——android菜鸟成长之路
ListView的基本用法 建博客这么久了,一直没能写点什么,其实一直想写来着,却又无从下手,今天终于下定决心写点什么,好吧,就ListView吧,这个控件是个搞基控件,所以初学者都会觉得很难,于是乎 ...
- Autorun.inf文件(2):改变硬盘分区图标
改变F盘图标. 原理:在f盘下新建一个Autorun.inf文件,文件内容是 [AutoRun]icon=favicon.ico准备名为favicon.ico图标文件,将其放在工程目录里,设计程序将它 ...
- T卡热插拔
1.配置: GPIO 管脚 GPIO方向 Debounce polarity Sensitive_level Host1 CDpin (EINT16) 16 INPUT PULL UP Enable ...