多表级联删除表数据特别慢

多表级联删除表数据特别慢,第1张

删除表记录非常慢有好几个原因:

1.机器性能问题,cpu被其他进程占用。这种方式最好解决,在进程管理器中关掉几个进程,释放出cpu用于处理删除记录 *** 作;

2.sql语句本身优化,使用exists或者not exists比用“=”来的快;

3.表的关联关系影响了删除的速度。如果目标表和其它表建立了关联关系过多也会造成处理效率下降问题。如A表的和B表建立外关联的话,而B表又是一张很大的表,删除A表的记录时oracle执行过程是先在A表中选中一条记录进入待删除区,然后进行关联关系分析的,就是对B表进行全表查询一遍。同理如果A表和其它表 也有关联的话相同的查询也会在其它表中执行查询,等所有关联表查询完成确定没有引用关系的话,A表中选中记录会被打一个可以删除的标记,然后执行A表下一条的查询工作。值得注意的是被标记为可删除标记的记录不是立刻被删除的,删除 *** 作一直要等到A表符合删除记录全部被打成可删除标记,删除 *** 作才会被执行。如果有一条没有被标记成可删除标识的话,oracle 数据库会根据你设置给出相应的处理。

4.表与表引用关系存储在系统表dba_constraints 中,要有dba权限才能够执行的。查询语句如下:注意要更换'TableName':

select owner,constraint_name,CONSTRAINT_TYPE,TABLE_NAME

from dba_constraints

where r_constraint_name in (select CONSTRAINT_NAME from dba_constraints where table_name='TableName')

如果这个还不能解决问题的话。还有更复杂的办法。

5.使用oralce自带10046 的trace。该方法使用方法需要谨慎的,随用随关的。启用当前session的跟踪:

SQL>alter session set sql_trace=true-- 开启trace

Session altered.

此时的SQL *** 作将被跟踪:

SQL>select count(*) from dba_users

COUNT(*)

----------

34

结束跟踪:

SQL>alter session set sql_trace=false--关闭trace

Session altered.

删除dept表中的数据:

delete

from

dept

t

where

t.city

=

'shanghai'

删除与之关联的emp表中的数据:

delete

from

emp

e

where

e.deptno

in

(

select

t.deptno

from

dept

t

where

t.city

=

'shanghai'

)

删主键值之前,必须先删掉它的外键,这两条SQL的执行顺序楼主自己调一下。

在ORACLE中ON

DELETE

CASCADE和ON

DELETE

SET

NULL两个命令主要在外键改foreign

key约束中使用,主要区别体现在对数据的影响上。

其中ON

DELETE

CASCADE的功能是在主数据删除的时候,从属数据一并删除,常用于强耦合关系中。

而ON

DELETE

SET

NULL的功能是在主数据删除的时候,从属数据不会删除,只是将从属数据的关联属性字段设置成NULL,从而变为无主待关联数据,这个常用于弱耦合关系中。

主键和外键是两种类型的约束,可用于强制表中的数据完整性。

这些是重要的数据库对象。

外键

(FK)

是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。

在外键引用中,当包含一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,就在这两个表之间创建了链接。

这个列就成为第二个表的外键


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9923511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存