Sql 将一个表/分区移动到另一个表空间会中断访问该表/分区的查询吗?

Sql 将一个表/分区移动到另一个表空间会中断访问该表/分区的查询吗?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,正如标题所说:在访问表/分区时移动(不重命名)表/分区会对访问它的任何查询产生负面影响吗 例如,假设有一个长时间运行的从某个表中选择COUNT(*) 如果我要改变TABLE some\u TABLE移动TABLE space some\u other\u TABLE space,选择是否会失败? 它是否会完成,但结果不正确?也许完全是别的什么 我能找到的唯一信息是,在某些情况下,将表移动到另一个表空间需要重建索引,但没有人提到任何活动查询的情况。如果ORA-08103:object不再存在,它可

正如标题所说:在访问表/分区时移动(不重命名)表/分区会对访问它的任何查询产生负面影响吗

例如,假设有一个长时间运行的
从某个表中选择COUNT(*)

如果我要
改变TABLE some\u TABLE移动TABLE space some\u other\u TABLE space
选择是否会失败?
它是否会完成,但结果不正确?也许完全是别的什么


我能找到的唯一信息是,在某些情况下,将表移动到另一个表空间需要重建索引,但没有人提到任何活动查询的情况。

如果
ORA-08103:object不再存在,它可能会失败。

在Oracle中,读写器不会相互阻塞。这意味着DML和查询不会相互干扰,排除了一些奇怪的情况,比如撤销空间不足。但移动表空间、任何类型的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;
/

会话3不会失败,它不会查询已更改的分区。每个分区都有自己的段,并且是一个可能“不再存在”的单独对象。

分区移动将导致DML在访问分区时失败

我刚刚证明了:-/

我正在执行一个大的删除操作,并试图移动一个分区(alter table move partition)。
我收到的错误是:
ORA-12801:并行查询服务器P004ORA-08103中发出错误信号:对象不再存在

在旁注中,移动单个分区与移动整个(未分区)表的结果会不同吗?-“ALTER TABLE…MOVE语句不允许在语句执行时对表使用DML。”我相信,如果表上有活动,在正常情况下甚至不会启动移动。直接路径操作可能没有那么有趣。(物联网可以在线移动,可能有一些限制)非常感谢您的回复。这不是我所希望的答案,但无论如何,这是一个很好的答案。在一个站点上注意:如果我移动一个表的分区,类似的错误会发生吗?@GigaWatt我相信会发生,但我还不能在使用分区时重现这个错误。我的简单示例没有抛出错误-可能是因为分区缓存数据的方式不同?我将尝试重现错误,稍后再与您联系。@GigaWatt我用一个更具体的分区示例更新了我的答案。分区和非分区都可能失败。出于某种原因,我不明白,分区版本往往需要更长的时间才能失败。但我不会依赖这种行为,在我的环境中可能只是运气不好。
ORA-08103: object no longer exists
ORA-06512: at line 6