すべてのプロダクト
Search
ドキュメントセンター

:概要

最終更新日:Aug 02, 2024

data Management (DMS) のロックフリーデータ操作言語 (DML) 機能を使用して、1つのSQL文を実行するデータを複数のバッチに分割し、バッチごとにSQL文を実行できます。 このようにして、実行パフォーマンスを保証することができ、データベースパフォーマンスまたはデータベースストレージに対するSQL文の影響を低減することができる。 この機能は、大量のデータを変更する必要がある場合に特に役立ちます。 たとえば、この機能を使用して、履歴データを消去したり、テーブル内のすべての行を更新したりできます。

背景情報

ビジネスが成長するにつれて、ビジネスデータが蓄積されます。 この場合、テーブルデータを定期的に消去するか、オンラインデータと履歴データを個別に管理する必要があります。 次の問題が発生する可能性があります。

  • 1つのSQL文が多数のデータ行に影響します。 この場合、ログエントリの数が上限を超え、SQL文の実行に失敗します。

  • SQL文はインデックスを指定せずに実行されます。 これにより、テーブルのロック、データベースの負荷の増加、またはビジネスの障害が発生する可能性があります。

これらの問題を解決するには、影響を受けるデータを複数のバッチに分割し、各バッチでSQL文を実行します。 ただし、この方法にはリスクも伴います。

  • 開発者はデータを分割するプログラムを作成します。

    • 不適切な方法を使用してデータを分割した場合でも、テーブルはロックされている可能性があります。 たとえば、開発者はLIMIT句を使用してデータを分割することがありますが、これは不適切です。

    • 場合によっては、異なるバッチを実行する間隔が期待どおりに設定されていません。 これにより、データが変更されると、プライマリデータベースとセカンダリデータベース間の同期に大きな遅延が発生します。

  • データベース管理者 (DBA) は、データを手動で抽出して複数の部分に分割し、バッチ処理します。

    このプロセスは複雑で労働集約的である。 さらに、このプロセスはエラーが発生しやすく、調整が困難です。

上記の問題を解決するには、DMSのロックフリーDML機能を使用します。 詳細については、「ロックフリーDML操作の実行」をご参照ください。

サポートされるソースデータベースタイプ

  • MySQL: ApsaraDB RDS for MySQLPolarDB for MySQLMyBase for MySQLPolarDB for Xscale、およびサードパーティのMySQLデータベース

  • PostgreSQL: ApsaraDB RDS for PostgreSQLPolarDB for PostgreSQLMyBase for PostgreSQL、およびサードパーティのPostgreSQLデータベース

  • MariaDB: ApsaraDB for MariaDBおよびサードパーティのMariaDBデータベース

  • ApsaraDB for OceanBaseのMySQLモード

  • PolarDB for PostgreSQL (Oracleと互換)

メリット

  • あなたのビジネスは影響を受けません。

  • データベースのパフォーマンスとデータベースストレージへの影響が軽減されます。

  • 大量のデータ変更に対して実行効率が保証される。

制御ポリシー機能の動作

  • 単一のSQL文は、異なるバッチのデータに対して実行されます。 強力なDMSエンジンは、単一のSQLステートメントを実行するデータを複数のバッチに分割できます。

  • 各バッチでSQL文が実行された後、実行はバッファ期間に入ります。

制限事項

UPDATE、DELETE、およびINSERT SELECTステートメントのみがサポートされています。

ステートメントタイプ

説明

更新と削除

  • ステートメントは、1つのテーブルでのみ実行できます。

  • ステートメントでWHERE句を指定する必要があります。 テーブル内のすべての行を更新または削除するには、WHERE 1=1という句を使用する必要があります。

  • UPDATEまたはDELETEステートメントにサブクエリを含めることはできません。

  • UPDATEまたはDELETEステートメントにLIMIT句を含めることはできません。

INSERT_SELECT

  • SELECTステートメントは、1つのテーブルでのみ実行できます。

  • SELECT句でWHERE句を指定する必要があります。 テーブル内のすべての行を選択するには、WHERE 1=1句を使用する必要があります。

  • SELECT句には、LIMIT句、ORDER BY句、またはGROUP BY句を含めることはできません。

シナリオ

  • 履歴データを消去します。

  • テーブル内のすべての行を更新します。