1

タイトルが示すように、アクセス中にテーブル/パーティションを (名前を変更せずに) 移動すると、それにアクセスするクエリに悪影響を及ぼしますか?

たとえば、長時間実行されている があるとしSELECT COUNT(*) FROM some_tableます。
だったらALTER TABLE some_table MOVE TABLESPACE some_other_tablespaceSELECT失敗しますか?
完了しますが、結果は正しくありませんか? たぶん、まったく別の何か?

私が見つけた唯一の情報は、テーブルを別のテーブルスペースに移動するには、特定の状況下でインデックスを再構築する必要があるということでしたが、アクティブなクエリに何が起こるかについては誰も言及していませんでした.

4

2 に答える 2

3

で失敗する場合がありORA-08103: object no longer existsます。

Oracle では、リーダーとライターは互いにブロックしません。これは、UNDO スペースが不足するなどのいくつかの奇妙なケースを除いて、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;
/

セッション 2 は最終的に次のように終了します。

ORA-08103: object no longer exists
ORA-06512: at line 6

セッション 3 は失敗しません。変更されたパーティションを照会していません。各パーティションには独自のセグメントがあり、「もはや存在しない」可能性がある別個のオブジェクトです。

于 2013-03-20T19:55:22.523 に答える
0

パーティションを移動すると、パーティションにアクセスしている場合、DML が失敗します。

私はちょうどそれを証明した:-/.

大規模な削除を行っていて、パーティションを移動しようとしました (alter table move partition)。
私が受け取ったエラーは次のとおりです: ORA-12801: 並列クエリ サーバーでエラーが通知されました

于 2013-09-19T23:39:06.853 に答える