问题描述:
Oracle通过主键id删除2000条记录很慢,需要花费十二分钟。
解决过程:
1.首先查看SQL的执行计划,执行计划正常,cost只有4,用到了主键索引。
2.查看等待事件,
select * from v$session_wait where sid = 507
显示的event是db file sequential read,也没有异常。
3.查看统计信息是否正常
select * from user_tables where table_name = '';
经检测,统计信息也是正常的。
4.查看系统IO,也是正常的。
5.找不到原因,开启SQL跟踪
alter session set events='10046 trace name context forever,level 12';
delete from t_table1 where id >= xxx
alter session set events='10046 trace name context off';
SQL跟踪得到一个trace文件
tkprof orcl_ora_3708.trc myoutput.txt
cat myoutput.txt,这次发现异常,文件里面除了有delete语句,还有两个select语句:
select /*+ all_rows */ count(1)
from
"xxx"."T_TABLE2" where "FRESHMANID" = :1
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 2000 0.23 0.22 0 0 0 0
Fetch 2000 720.58 740.36 842 61038000 0 2000
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4001 720.82 740.59 842 61038000 0 2000
select /*+ all_rows */ count(1)
from
"xxx"."T_TABLE3" where "FRESHMANID" = :1
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 2000 0.27 0.27 0 0 0 0
Fetch 2000 1.84 1.93 0 136000 0 2000
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4001 2.11 2.20 0 136000 0 2000
这两张表各查询了2000次,可以判断出来,就是因为这个原因导致delete非常慢,询问现场相关人员,t_table2、t_table3跟t_table1有什么关系,现场人员说t_table2和t_table3个有一个外键
依赖t_table1的主键ID,经过查询,t_table2和t_table3的外键上都没有创建索引,于是创建索引,再执行delete语句,这次执行速度很快,经过SQL跟踪,也没有发现去查询t_table2和t_table3。
- 大小: 32 KB
分享到:
相关推荐
根据表主键id删除一条数据,在PL/SQL上执行commit后执行时间都大于5秒。!!! 问题分析: 需求是删除一个主表A,另有两个附表建有此表的主键ID的外键。删除A表的数据级联删除另两个表的关联数据。增删改查使用...
在这段代码中,我们首先创建了一个名为 `dumpy` 的表,其中包含三个字段:`id`(主键)、`name` 和 `rand`。接着,使用一个PL/SQL块来插入100万条随机数据,为了提高性能,每插入1000条数据就进行一次提交。 ##### ...
- `id`: varchar(36),主键; - `log_time`: bigint(20) unsigned,日志时间; - `device_id`: int(11),设备ID; - `stb_id`: int(11),STB ID; - `region_id`: int(11) unsigned,区域ID; - `product_id`: int...
例如,“主键ID=?”这样的条件通常能够过滤掉大量无关记录,因此应将其放在WHERE子句的最后。 #### 二、SELECT子句中避免使用 ‘ * ’ **原则二:** 在SELECT子句中使用‘*’意味着返回所有列,这会导致ORACLE...
oracle 甲骨文 获得最高认证级别的ISO标准安全认证,性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。但价格不菲 大型企业 db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2...
MyISAM 会在重启后从上次的最大值继续计数,而 InnoDB 则会记住最后一次自增值,即使删除记录,重启后也会从这个值继续。 2. **MySQL 技术特点**:MySQL 提供多线程支持、多种客户端库、广泛的 API 和管理工具,...
- **问题描述**:如果一张表中有ID自增主键,在插入17条记录后删除了最后三条记录(即第15、16、17条),然后重启MySQL服务,再次插入一条记录时,该记录的ID会是18还是15? - **知识点**:MySQL的自增主键(AUTO_...
- 参照完整性:保证引用的外键字段指向存在的记录,例如,如果有一个"Classes"表,"StudentList"中的"Class"字段应指向有效的班级ID。 - 用户定义的完整性:针对特定业务规则,比如年龄不能为负数。 5. 查询优化...
- 通过分析慢查询日志,可以找出性能瓶颈并优化查询。 2. **MySQL中的复制(Replication)是怎样工作的?有什么配置选项?** - **复制** 是指在一个或多个从属服务器上复制主服务器上的数据。 - **配置选项** ...
在这种情况下,如果查询条件与该顺序相关,DBMS可以通过二分查找等算法来加速查找,但依然比有索引的情况慢很多。 4. **优化器策略**:即使没有索引,数据库查询优化器也会尝试找出执行查询的最有效方法。它可能会...
这种方式最大的问题就是效率问题,逐条更新,每次都会连接数据库,然后更新,再释放连接资源(虽然通过连接池可以将频繁连接数据的效率大大提高,抗不住数据量大),这中损耗在数据量较大的时候便会体现出效率问题。...
<jp:mondrianQuery dataSource="" id="query01" jdbcDriver="oracle.jdbc.driver.OracleDriver" jdbcUrl="jdbc:oracle:thin:ngykt/ngyktadmin@172.16.46.241:1521:orcl10" catalogUri="/WEB-INF/queries/feeSchema....
此外,还可以通过慢查询日志分析性能瓶颈,调整查询语句或优化索引。 五、运维管理 1. 安全性:设置强密码策略,限制用户权限,定期更新和打补丁以防范安全风险。 2. 备份与恢复:定期备份数据库,使用mysqldump等...
你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。 Tomcat也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理...