什么叫没反应? 表sc_tt_stock数据量很大? 如果数据量很大,查看一下字段sc_tm_warehouse_id是主键吗,有索引吗? 确认一下sc_tm_warehouse_id是什么类型? 如果是varchar2,且有索引,则加上引号才能使用上索引 delete from sc_tt_stock s where s.sc_tm_warehouse_id = '1018626';最好查看一下执行计划!
s.sc_tm_warehouse_id 是外键
delete from sc_tt_stock s where s.sc_tt_stock_id = 342435; 我这样删除一条数据也删不掉 删除s.sc_tm_warehouse_id = 1018626该门店的库存记录都删不掉。。
你看下是不是有SQL语句还在执行,你删除要commit的 下面是查询系统正在运行的SQL语句,你检查下,,,select a.program,b.spid,c.sql_text from v$session a,v$process b,v$sqlarea c where a.paddr=b.addr and a.sql_hash_value=c.hash_value and a.username is not null;
谢谢潘哥,估价是行级锁住了。我这个warehouse的数据都删不了。。 但要怎么执行,怎么kill掉呢 不懂啊。。还请指教。。 select v$locked_object from dual;--???执行不了
--首先查看有哪些锁 select /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level, o.owner, o.object_name, o.object_type, s.sid,s.serial#, s.terminal, s.machine, s.program, s.osuser from v$session s,v$lock l,dba_objects o where l.sid = s.sid and l.id1 = o.object_id(+) and s.username is not null--如果发生了锁等待,看是谁锁了表而引起谁的等待 --以下的语句可以查询到谁锁了表,而谁在等待。 如果有子节点,则表示有等待发生 select /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name, o.owner, o.object_name, o.object_type, s.sid, s.serial# from v$locked_object l,dba_objects o,v$session s where l.object_id=o.object_id and l.session_id=s.sid order by o.object_id,xidusn desc --找到引起等待的session,杀掉该session: alter system kill session 'sid,serial#';
谢谢潘哥哈~~~还是有点疑问--首先查看有哪些锁 select /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level, o.owner, o.object_name, o.object_type, s.sid,s.serial#, s.terminal, s.machine, s.program, s.osuser from v$session s,v$lock l,dba_objects o where l.sid = s.sid and l.id1 = o.object_id(+) and s.username is not null--执行结果只有1条 --1 CRP ROW LOCK null null null 554 53236 LENOVO-C1E06E80 WORKGROUP\LENOVO-C1E06E80 plsqldev.exe Administrator--如果发生了锁等待,看是谁锁了表而引起谁的等待 --以下的语句可以查询到谁锁了表,而谁在等待。 如果有子节点,则表示有等待发生 --这条sql执行结果是0rows
alter system kill session '554,53236';我执行该sql后,已经没有锁了。。 再执行delete from sc_tt_stock s where s.sc_tm_warehouse_id = 1018626;还是执行不过去,一直显示:Executing
delete sc_tt_stock where sc_tm_warehouse_id = '1018626'; commit
这条记录数据库里有吗?如果有的话,需要Commit;Delete、Update、Insert这三条语执行后要Commit;才会做用到表里。
表sc_tt_stock数据量很大?
如果数据量很大,查看一下字段sc_tm_warehouse_id是主键吗,有索引吗?
确认一下sc_tm_warehouse_id是什么类型?
如果是varchar2,且有索引,则加上引号才能使用上索引
delete from sc_tt_stock s
where s.sc_tm_warehouse_id = '1018626';最好查看一下执行计划!
delete from sc_tt_stock s
where s.sc_tt_stock_id = 342435;
我这样删除一条数据也删不掉
删除s.sc_tm_warehouse_id = 1018626该门店的库存记录都删不掉。。
如果锁住了,你肯定就不能删除,只能等待那个session事务提交或回滚你才能做
找到那个sid,然后kill掉
下面是查询系统正在运行的SQL语句,你检查下,,,select a.program,b.spid,c.sql_text from v$session a,v$process b,v$sqlarea c where a.paddr=b.addr and a.sql_hash_value=c.hash_value and a.username is not null;
但要怎么执行,怎么kill掉呢
不懂啊。。还请指教。。
select v$locked_object from dual;--???执行不了
--首先查看有哪些锁
select /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level,
o.owner,
o.object_name,
o.object_type,
s.sid,s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
from v$session s,v$lock l,dba_objects o
where l.sid = s.sid
and l.id1 = o.object_id(+)
and s.username is not null--如果发生了锁等待,看是谁锁了表而引起谁的等待
--以下的语句可以查询到谁锁了表,而谁在等待。 如果有子节点,则表示有等待发生
select /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#
from v$locked_object l,dba_objects o,v$session s
where l.object_id=o.object_id
and l.session_id=s.sid
order by o.object_id,xidusn desc
--找到引起等待的session,杀掉该session:
alter system kill session 'sid,serial#';
select /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level,
o.owner,
o.object_name,
o.object_type,
s.sid,s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
from v$session s,v$lock l,dba_objects o
where l.sid = s.sid
and l.id1 = o.object_id(+)
and s.username is not null--执行结果只有1条
--1 CRP ROW LOCK null null null 554 53236 LENOVO-C1E06E80 WORKGROUP\LENOVO-C1E06E80 plsqldev.exe Administrator--如果发生了锁等待,看是谁锁了表而引起谁的等待
--以下的语句可以查询到谁锁了表,而谁在等待。 如果有子节点,则表示有等待发生
--这条sql执行结果是0rows
alter system kill session '554,53236';我执行该sql后,已经没有锁了。。
再执行delete from sc_tt_stock s
where s.sc_tm_warehouse_id = 1018626;还是执行不过去,一直显示:Executing
commit
我可能猜到你的原因了,你外健是不是不存在索引!
由于你delete会对从表进行施加行级锁,但是从表的外健是No action,oracle在删除主表的时候会去寻找所有以主表的主键作为外键的数据表,然后去看从表是否有该外键的索引,如果没有则会对整个从表施加表级锁,然后对从表进行全表扫描。当然如果从表存在外键的索引,会去访问对应的索引,而不会对从表本身进行加锁。
where s.sc_tt_stock_id = 342435;