サポートされているDMLと例
Oracle Globally Distributed DatabaseのDMLは、重複表またはシャード表のいずれかをターゲットにできます。ターゲットが重複表の場合、DMLに制限はありません。
シャード表をターゲットとするDML (主に挿入、更新および削除)は、次のようにできます。
- ターゲット表のみが参照される単純なDML
- 他の表を参照するDML
- MERGE文
ターゲット表のみが参照される単純なDML
次に、サポートされているDMLの例をいくつか示します。
例8-13 すべての行の更新
UPDATE employees SET salary = salary *1.1;
例8-14 単一行の挿入
INSERT INTO employees VALUES (102494, 'Jane Doe, ...
);
例8-15 単一行の削除
DELETE employees WHERE employee_id = 103678;
他の表を参照するDML
シャード表のDMLは、他のシャード表、重複表またはローカル表を参照できます。
例8-16 重複表を参照するDML
この例では、employees
はシャード表で、ref_jobs
は重複表です。
DELETE employees
WHERE job_id IN (SELECT job_id FROM ref_jobs
WHERE job_id = 'SA_REP');
例8-17 別のシャード表を参照するDML
UPDATE departments SET department_name = 'ABC‘
WHERE department_id IN (SELECT department_id
FROM employees
WHERE salary < 10000);
例8-18 ローカル表からのINSERT AS SELECT
INSERT INTO employees SELECT * FROM local_employees;
例8-19 1つのシャードに影響するDML
DML文は、1つのシャードのみに影響することも、複数のシャードに影響することもあります。たとえば、ここに示すDELETE
文は、WHERE
句のシャーディング・キー(employee_id
)に述語があるため、1つのシャードにのみ影響します。
DELETE employees WHERE employee_id = 103678;
例8-20 複数のシャードに影響するDML
次の文は、WHERE
句がないため、EMPLOYEES
表のすべての行に影響します。
UPDATE employees SET salary = salary *1.1;
このUPDATE
文をすべてのシャードで実行するために、シャード・コーディネータがすべてのプライマリ・データベースに対して反復処理を行い、UPDATE
文をリモートに呼び出します。コーディネータは分散トランザクションを開始し、2フェーズ・コミットを実行して分散トランザクションの一貫性を保証します。インダウト・トランザクションがある場合は、手動でリカバリする必要があります。
MERGE文の例
MERGE
文で、シャード表または重複表をターゲットにできます。MERGE
操作自体をシャードにプッシュできるかぎり、マージは許可されます。
例8-21 シャード表employeesをターゲット表とするMerge文
この例では、employee_id
列がシャーディング・キーで、ソース問合せの結合述語がシャーディング・キーにあるため、MERGE
文は処理されるすべてのシャードにプッシュされます。
MERGE INTO employees D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.salary = D.salary + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.salary)
VALUES (S.employee_id, S.salary*0.1)
WHERE (S.salary <= 8000);
例8-22 重複表をターゲット表とするMerge文
この例では、ターゲット表は重複表ref_employees
です。ソース問合せはシャード表employees
を参照し、結合述語はシャーディング・キーemployee_id
にあります。
MERGE INTO ref_employees D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.salary = D.salary + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.salary)
VALUES (S.employee_id, S.salary*0.1)
WHERE (S.salary <= 8000);
マルチシャードDMLのサポートの制限事項
次のDML機能は、Oracle Globally Distributed DatabaseのマルチシャードDMLではサポートされません。
- エラー・ロギング DMLの
ERROR LOG
句は、マルチシャードDMLではサポートされません。この場合、ユーザー・エラーが発生します。 - 配列DML 配列DMLはマルチシャードDMLではサポートされません。この場合、ORA-2681が発生します。
- RETURNING句
RETURNING INTO
句は通常の分散DMLでサポートされないため、サポートされません。マルチシャードDMLでRETURNING INTO
句の使用を試みると、ORA-22816が発生します。 - MERGEおよびUPSERT
MERGE
文は部分的にサポートされます。つまり、単一のシャードのみに影響を与えるMERGE
文はサポートされます。MERGE
文で複数のシャードの変更が必要となる場合は、ORAエラーが発生します。 - 複数表へのINSERT複数表への挿入はデータベース・リンクでサポートされないため、複数表への挿入はサポートされていません。
- 更新可能な結合ビュー 更新可能な結合ビューでシャード表がシャーディング・キーで結合されている場合、ORA-1779がスローされます。このエラーの理由は、シャード表に定義されている主キーが内部列
SYS_HASHVAL
+ シャーディング・キーの組合せであるため、更新可能な結合ビューにSYS_HASHVAL
を指定できないからです。この制限により、キー保存表を設定できないため、ORA-1779が発生します。 - トリガー