正如标题所说:在访问表格/分区时移动(不重命名)会对访问它的任何查询产生负面影响吗?
例如,假设有一个长期运行的SELECT COUNT(*) FROM some_table
如果我ALTER TABLE some_table MOVE TABLESPACE some_other_tablespace
SELECT
,{{1}}会失败吗?
它会完成,但结果不正确吗?也许还有别的什么呢?
我能找到的唯一信息是将表移动到不同的表空间需要在某些情况下重建索引,但没有提到任何活动查询会发生什么。
答案 0 :(得分:2)
ORA-08103: object no longer exists
可能会失败。
在Oracle中,读者和作者不会互相阻止。这意味着DML和查询不会相互干扰,排除一些奇怪的情况,比如耗尽UNDO空间。但是移动表空间或任何类型的ALTER或其他DDL语句不是正常的写入。当您运行DDL时,多版本并发控制模型会崩溃,至少对于所涉及的对象而言,并且奇怪的事情开始发生。
测试大型移动很困难,但您可以通过循环执行大量小改动和查询来重现这些错误。如果您认为这只是一个理论问题,我已经看到这些错误发生在现实生活中的生产数据库中。
警告:下面是无限循环,因为我无法预测重现此错误需要多长时间。但它通常只需要几十秒钟。
--Create sample table.
drop table test1 purge;
create table test1(a number, b number)
partition by list(a) (partition p1 values(1), partition p2 values(2))
nologging tablespace users;
--Session 1
begin
loop
execute immediate '
insert /*+ append */ into test1 select mod(level,2)+1, level
from dual connect by level <= 100000';
commit;
execute immediate 'alter table test1 move partition p1 tablespace users';
end loop;
end;
/
--Session 2: Read from moved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 1;
end loop;
end;
/
--Session 3: Read from unmoved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 2;
end loop;
end;
/
第二场会议最终将会死于:
ORA-08103: object no longer exists
ORA-06512: at line 6
会话3不会失败,它不会查询更改的分区。每个分区都有自己的段,并且是一个可能“不再存在”的独立对象。
答案 1 :(得分:0)
分区移动会导致DML在访问分区时失败。
我刚刚证明了这一点: - /。
我正在进行大量删除并尝试移动分区(alter table move partition) 我收到的错误是: ORA-12801:在并行查询服务器P004ORA-08103中发出错误信号:对象不再存在