OceanBase logo

OceanBase

トランザクション処理、分析、AIワークロードに最適な分散データベース

デプロイを自由に

OceanBase Cloud

OceanBaseの導入とスケーリングを最適化

エンタープライズ版

自社インフラ上での運用・管理に対応

オープンソース版を試す

コミュニティ版

開発者向けオープンソース分散データベース

OceanBase seekdb

AIネイティブなオープンソースの検索データベース

顧客事例

さまざまな業界の企業による導入事例を紹介します。

さらに見る
利用シーン別

あらゆるシナリオに対応するOLTP

ハイブリッドクラウドソリューション

大容量ストレージデータベースのコスト削減

リアルタイム分析混合ワークロード

複数インスタンスの統合

ドキュメント

会社概要

OceanBaseの企業情報、パートナーシップ、そして信頼性・セキュリティへの取り組みについて紹介します。

OceanBaseについて

法的情報

お問い合わせ

日本 - 日本語
International - English
中国站 - 简体中文
クラウドで始める

トランザクション処理、分析、AIワークロードに最適な分散データベース

デプロイを自由に

OceanBase Cloud

OceanBaseの導入とスケーリングを最適化

エンタープライズ版

自社インフラ上での運用・管理に対応

オープンソース版を試す

コミュニティ版

開発者向けオープンソース分散データベース

OceanBase seekdb

AIネイティブなオープンソースの検索データベース

顧客事例

さまざまな業界の企業による導入事例を紹介します。

さらに見る
利用シーン別

あらゆるシナリオに対応するOLTP

ハイブリッドクラウドソリューション

大容量ストレージデータベースのコスト削減

リアルタイム分析混合ワークロード

複数インスタンスの統合

OceanBaseの企業情報、パートナーシップ、そして信頼性・セキュリティへの取り組みについて紹介します。

OceanBaseについて

法的情報

お問い合わせ

クラウドで始める
编组
すべての製品
    • データベース
    • アイコンOceanBaseデータベース
アイコン

OceanBaseデータベース

V4.3.5

    OceanBase logo

    AI時代を支える分散データベース

    日本 - 日本語
    International - English
    中国站 - 简体中文
    プロダクト
    OceanBase Cloudエンタープライズ版コミュニティ版OceanBase seekdb
    会社概要
    OceanBaseについて法的情報お問い合わせ
    公式アカウント
    ConnpassXQiitaLumaGitHub

    © OceanBase 2026. All rights reserved

    クラウドサービス契約個人情報保護ポリシーセキュリティ
    お問い合わせ
    ドキュメントフィードバック
    1. ホーム
    2. OceanBaseデータベース
    3. V4.3.5
    アイコンOceanBaseデータベース
    V 4.3.5
    • V 4.3.5

    DELETE

    最終更新日:2026-04-09 08:28:49  更新
    シェア
    このページの内容
    DELETE
    DISTRIBUTED DELETE

    折りたたみ

    シェア

    DELETE演算子は、データテーブル内の指定された条件を満たすデータ行を削除するために使用されます。

    OceanBaseデータベースでサポートされているDELETE演算子には、DELETEとDISTRIBUTED DELETEがあります。

    DELETE

    DELETE演算子は、データテーブルの単一パーティション内のデータを削除するために使用されます。

    次の例のように、Q1クエリは、c2 > '100' を満たすt1テーブル内のすべての行を削除します。

    --Oracleモード:
    
    obclient> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR2(10));
    Query OK, 0 rows affected
    
    obclient> CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 VARCHAR2(10)) PARTITION BY
                 HASH(c1) PARTITIONS 10;
    Query OK, 0 rows affected
    
    obclient> CREATE TABLE t3 (c1 INT PRIMARY KEY, c2 VARCHAR2(10));
    Query OK, 0 rows affected
    
    obclient> CREATE INDEX IDX_t3_c2 ON t3 (c2) PARTITION BY HASH(c2) PARTITIONS 3;
    Query OK, 0 rows affected
    
    --MySQLモード:
    
    obclient> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT);
    Query OK, 0 rows affected
    
    obclient> CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 INT) PARTITION BY
                 HASH(c1) PARTITIONS 10;
    Query OK, 0 rows affected
    
    obclient> CREATE TABLE t3 (c1 INT PRIMARY KEY, c2 INT);
    Query OK, 0 rows affected
    
    obclient> CREATE INDEX IDX_t3_c2 ON t3 (c2) PARTITION BY HASH(c2) PARTITIONS 3;
    Query OK, 0 rows affected
    Q1:
    obclient> EXPLAIN DELETE FROM t1 WHERE c2 > '100';
    
    Query Plan:
    ======================================
    |ID|OPERATOR   |NAME|EST. ROWS|COST  |
    --------------------------------------
    |0 |DELETE     |    |10000    |118697|
    |1 | TABLE SCAN|T1  |10000    |108697|
    ======================================
    
    Outputs & filters:
    -------------------------------------
      0 - output(nil), filter(nil), table_columns([{T1: ({T1: (T1.C1, T1.C2)})}])
      1 - output([T1.C1], [T1.C2]), filter([T1.C2 > '100']),
          access([T1.C1], [T1.C2]), partitions(p0)
    

    上記の例では、実行計画のoutputs & filtersに、DELETE演算子の出力情報が詳細に列挙されています。

    情報名 意味
    output この演算子が出力する式。
    filter この演算子上のフィルタ条件。例では DELETE 演算子に filter が設定されていないため、nil です。削除ステートメントの場合、WHERE の述語は基表にプッシュダウンされます。例えば、Q1クエリの c2>'100' は1号演算子にプッシュダウンされます。
    table_columns 削除操作に関連するデータテーブルの列。

    さらに DELETE 演算子の例を以下に示します。

    • Q2クエリは t1 テーブルのすべてのデータ行を削除します。

    • Q3クエリはパーティションテーブル t2 で c1 = 1 を満たすデータ行を削除します。

    • Q4クエリはパーティションテーブル t2 で c2 > '100' を満たすデータ行を削除します。実行計画から、DELETE 演算子が EXCHANGE 演算子の下に配置されていることがわかります。そのため、2号と3号演算子はパーティション単位で1つのタスクとしてスケジューリングされます。計画の実行において、4号演算子が t2 テーブルの1つのパーティション内で c2 > '100' を満たすデータをスキャンし、3号演算子の DELETE はそのパーティション内でスキャンされたデータのみを削除します。

    Q2: 
    obclient> EXPLAIN DELETE FROM t1;
    
    Query Plan:
    ======================================
    |ID|OPERATOR   |NAME|EST. ROWS|COST  |
    --------------------------------------
    |0 |DELETE     |    |100000   |161860|
    |1 | TABLE SCAN|T1  |100000   |61860 |
    ======================================
    
    Outputs & filters:
    -------------------------------------
      0 - output(nil), filter(nil), table_columns([{T1: ({T1: (T1.C1, T1.C2)})}])
      1 - output([T1.C1], [T1.C2]), filter(nil),
          access([T1.C1], [T1.C2]), partitions(p0)
     
    
    Q3: 
    obclient> EXPLAIN DELETE FROM t2 WHERE c1 = 1;
    
    Query Plan:
    ===================================
    |ID|OPERATOR  |NAME|EST. ROWS|COST|
    -----------------------------------
    |0 |DELETE    |    |1        |53  |
    |1 | TABLE GET|T2  |1        |52  |
    ===================================
    
    Outputs & filters:
    -------------------------------------
      0 - output(nil), filter(nil), table_columns([{T2: ({T2: (T2.C1, T2.C2)})}])
      1 - output([T2.C1], [T2.C2]), filter(nil),
          access([T2.C1], [T2.C2]), partitions(p5) 
     
    
    Q4: 
    obclient> EXPLAIN DELETE FROM t2 WHERE c2 > '100';
    
    Query Plan:
    ===============================================
    
    |ID|OPERATOR               |NAME    |EST. ROWS|COST   |
    -------------------------------------------------------
    |0 |PX COORDINATOR         |        |100000   |1186893|
    |1 | EXCHANGE OUT DISTR    |:EX10000|100000   |1186893|
    |2 |  PX PARTITION ITERATOR|        |100000   |1186893|
    |3 |   DELETE              |        |100000   |1186893|
    |4 |    TABLE SCAN         |T2      |100000   |1086893|
    ==================================================
    
    Outputs & filters:
    -------------------------------------
      0 - output(nil), filter(nil)
      1 - output(nil), filter(nil), dop=1
      2 - output(nil), filter(nil)
      3 - output(nil), filter(nil), table_columns([{T2: ({T2: (T2.C1, T2.C2)})}])
      4 - output([T2.C1], [T2.C2]), filter([T2.C2 > '100']),
          access([T2.C1], [T2.C2]), partitions(p[0-9])
    

    DISTRIBUTED DELETE

    DISTRIBUTED DELETE演算子は、データテーブルの複数のパーティション内のデータを削除するために使用されます。

    次の例のように、Q5クエリはテーブルt3内のすべてのc2 > '100'を満たすデータ行を削除します。t3自体はパーティション化されていないテーブルですが、t3上にグローバルインデックスidx_t3_c2が存在するため、各データ行は複数のパーティションに存在します。

    Q5: 
    obclient> EXPLAIN DELETE FROM t3 WHERE c2 > '100';
    
    +----------------------------------------------------------------------------------+
    | Query Plan                                                                       |
    +----------------------------------------------------------------------------------+
    | ====================================================================             |
    | |ID|OPERATOR                   |NAME         |EST.ROWS|EST.TIME(us)|             |
    | --------------------------------------------------------------------             |
    | |0 |DISTRIBUTED DELETE         |             |1       |26          |             |
    | |1 |└─PX COORDINATOR           |             |1       |8           |             |
    | |2 |  └─EXCHANGE OUT DISTR     |:EX10000     |1       |8           |             |
    | |3 |    └─PX PARTITION ITERATOR|             |1       |7           |             |
    | |4 |      └─TABLE RANGE SCAN   |t3(IDX_t3_c2)|1       |7           |             |
    | ====================================================================             |
    | Outputs & filters:                                                               |
    | -------------------------------------                                            |
    |   0 - output(nil), filter(nil)                                                   |
    |       table_columns([{t3: ({t3: (t3.c1, t3.c2)}, {IDX_t3_c2: (t3.c2, t3.c1)})}]) |
    |   1 - output([t3.c1], [t3.c2]), filter(nil), rowset=16                           |
    |   2 - output([t3.c1], [t3.c2]), filter(nil), rowset=16                           |
    |       dop=1                                                                      |
    |   3 - output([t3.c1], [t3.c2]), filter(nil), rowset=16                           |
    |       force partition granule                                                    |
    |   4 - output([t3.c1], [t3.c2]), filter(nil), rowset=16                           |
    |       access([t3.c1], [t3.c2]), partitions(p[0-2])                               |
    |       is_index_back=false, is_global_index=true,                                 |
    |       range_key([t3.c2], [t3.c1]), range(100,MAX ; MAX,MAX),                     |
    |       range_cond([t3.c2 > demote_cast('100', INT(11, 0))])                       |
    +----------------------------------------------------------------------------------+
    23 rows in set
    

    上記の例の実行計画のoutputs & filtersでは、DISTRIBUTED DELETE演算子の詳細な情報が列挙されています。フィールドの意味はDELETE演算子と同じです。

    前のトピック

    INSERT
    最後

    次のトピック

    UPDATE
    次
    このページの内容
    DELETE
    DISTRIBUTED DELETE