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

ApsaraDB RDS:SQL スロットリング (rds_ccl)

最終更新日:Dec 06, 2025

ApsaraDB RDS for PostgreSQL の SQL スロットリング機能は、高い同時実行性の期間中やリソースを大量に消費する SQL 文を処理する際に、データベースの安定性を確保するのに役立ちます。特定の SQL 文の同時実行性を制限することで、悪意のある攻撃を防ぎ、バックアップやモニタリングなどの操作のリソース使用量を制御できます。この機能は、個々の SQL 文がデータベースのパフォーマンスを低下させたり、サービスの中断を引き起こしたりするのを防ぎます。

前提条件

  • ApsaraDB RDS for PostgreSQL インスタンスは、次の要件を満たしている必要があります。

    メジャーエンジンバージョン

    マイナーエンジンバージョン

    PostgreSQL 16 および 17

    すべてのマイナーバージョン

    PostgreSQL 14 および 15

    20230330 以後

    PostgreSQL 13

    20250430 以後

    説明

    詳細については、「マイナーエンジンバージョンを更新する」をご参照ください。

  • 次のように パラメーター設定 を完了していること。

    • rds_enable_cclon に設定されている。

    • compute_query_idauto または on に設定されている。

  • 特権アカウント を作成していること。

使用上の注意

  • インスタンスの再起動後、またはプライマリ/セカンダリのフェールオーバー後、SQL 速度制限ルールを手動でロードする必要があります。

  • 最大同時実行値を低く設定するなど、速度制限ルールが正しく設定されていないと、ワークロードに影響を与える可能性があります。 ルールを設定する前に、ビジネスワークロードを評価してください。

  • 速度制限ルールはプライマリインスタンスで作成されます。 読み取り専用インスタンスにルールを適用するには、ルールの node_tag パラメータに読み取り専用ノードを含める必要があり、読み取り専用インスタンスにSQL 速度制限ルールを個別にロードする必要があります。

  • Database Autonomy Service (DAS) の SQL スロットリング 機能を使用してスロットリングルールを作成すると、プラグインはデフォルトでターゲットデータベースの `information_schema` にインストールされます。このルールは SQL コマンドを使用して呼び出すことはできず、DAS の SQL スロットリング機能でのみ使用できます。

課金

この機能は無料です。

プラグインの作成と削除

コンソールでのプラグインの作成と削除

  1. インスタンス ページに移動します。上部のナビゲーションバーでリージョンを選択します。次に、ターゲットインスタンスの ID をクリックします。

  2. 左側のナビゲーションウィンドウで、プラグイン をクリックします。

  3. プラグインの概要 ページで、rds_ccl プラグインを見つけ、インストール をクリックします。

    image

    または、プラグインの管理 ページに移動し、rds_ccl プラグインを検索して、操作 列の インストール をクリックします。

  4. ポップアップウィンドウで、ターゲットデータベースと特権アカウントを選択し、インストール をクリックして、ターゲットデータベースにプラグインをインストールします。

    インスタンスの状態が メンテナンス中 から Running に変わると、プラグインがインストールされます。

説明

プラグインの管理 ページで、プラグインがインストール済みです タブをクリックします。 ターゲットプラグインを見つけて、操作 列の アンインストール をクリックして、プラグインをアンインストールします。

SQL コマンドを使用した拡張機能の作成と削除

重要

特権アカウントを使用して、次のコマンドを実行します。

  • 拡張機能を作成します。

    CREATE EXTENSION rds_ccl;
  • 拡張機能を削除します。

    DROP EXTENSION rds_ccl;

使用例

重要

特権アカウントを使用して、次のコマンドを実行します。

SQL 速度制限ルールの作成

シナリオ

この関数は、プライマリインスタンスでのみ呼び出して SQL スロットリングルールを作成できます。

構文

  • 構文 1: 特定の SQL 文に対してスロットリングを実行します。

    SELECT rds_add_ccl_rule(
    	query_string varchar,
    	node_tag int,
    	max_concurrency int,
    	max_waiting int,
    	is_enabled boolean,
    	comment varchar,		-- オプション
    	search_path varchar		-- オプション
    );
  • 構文 2: 特定の query_id に基づいてスロットリングを実行します。

    SELECT rds_add_ccl_rule_with_query_id(
      query_id		bigint,
      node_tag		int,
      max_concurrency	int,
      max_waiting		int,
      is_enabled		boolean,
      query_string		varchar,	-- オプション
      comment		varchar,	-- オプション
      search_path           varchar		-- オプション (バージョン 1.2 以後でサポート)
    );

パラメータ

パラメータ

タイプ

説明

query_string

varchar

速度制限を行う SQL 文。

このパラメータを設定する場合は、$$ または $<任意の文字>$ を使用して SQL 文を囲みます。 詳細については、「ドル引用符で囲まれた文字列定数」を参照してください。

例:

-- $$ を使用して SQL 文を囲みます。
$$SELECT * FROM my_table;$$

-- SQL 文に既に $$ が含まれている場合は、$ccl$ を使用して SQL 文を囲みます。
$ccl$SELECT * FROM my_table WHERE my_column = $$hello$$;$ccl$

この関数は、query_string の値に基づいて query_id を計算し、query_id に基づいて類似の SQL 文を照合して速度制限を実行します。 query_id の詳細については、「query_id について」をご参照ください。

query_id

bigint

速度制限を行う SQL 文の query_id。 詳細については、「query_id について」をご参照ください。

node_tag

int

速度制限を行うノード。

  • 1: プライマリインスタンスのみを速度制限します。

  • 2: 読み取り専用インスタンスのみを速度制限します。

  • 3: プライマリインスタンスと読み取り専用インスタンスの両方を速度制限します。

説明

SQL 速度制限ルールを作成する関数では、このパラメータはルールを適用できる範囲のみを指定します。 ルールは読み取り専用インスタンスに自動的に適用されるわけではありません。 読み取り専用インスタンスにルールを適用するには、手動でロードする必要があります。 詳細については、「SQL 速度制限ルールを読み込む」をご参照ください。

max_concurrency

int

このタイプの SQL 文の最大同時実行数。

有効な値: 0~100000

max_waiting

int

このタイプの待機中の SQL 文の最大数。 この制限を超えると、新しい SQL 文によって PostgreSQL カーネルが ABORT をトリガーしてトランザクションを停止し、ロールバックします。

有効な値: 0~100000

is_enabled

boolean

ルールが有効かどうかを指定します。

  • true: ルールはすぐに有効になります。

  • false: ルールは有効になりません。

comment

varchar

ルールの説明。

search_path

varchar

ターゲット SQL 文の実行時のスキーマ検索パス (search_path)。 このパラメータを空の文字列 ('') に設定すると、デフォルトの検索パスが使用されます。 SHOW search_path; コマンドを実行して、デフォルトの検索パスをクエリできます。

使用上の注意

  • 構文 1 では、comment パラメータと search_path パラメータを設定しない場合は、空の文字列 ('') に設定できます。 NULL に設定すると、関数は何も実行せずにすぐに返されます。

  • 構文 2 では:

    • query_string パラメータと comment パラメータを設定しない場合は、空の文字列 ('') に設定できます。 NULL に設定すると、関数は何も実行せずにすぐに返されます。

    • query_idquery_string の両方を設定すると、AliPG カーネルは query_id に基づいて SQL 速度制限を実行します。

  • この関数は ccl_id を返します。これは、現在のデータベースにおける速度制限ルールの固有識別子です。

SQL の例

プライマリインスタンスの `ccl_test` データベースに `ccl_tbl` という名前のデータテーブルが存在するとします。次の要件を満たす SQL スロットリングルールを作成します。

  1. すべての SELECT * FROM ccl_tbl 文をスロットリングします。それらの query_id は `1` であるとします。

  2. このような SQL 文の同時実行は最大 3 つまで許可します。

  3. このような SQL 文の最大 2 つを待機できるようにします。

  4. ルールは作成後すぐに有効にする必要があります。

  • 構文 1:

    SELECT rds_add_ccl_rule(
      $$SELECT * FROM ccl_tbl;$$,		-- 速度制限の対象となる SQL 文。$$ で囲みます。
      1,					-- プライマリインスタンスのみを速度制限します。
      3,					-- このような SQL 文の最大 3 つを同時に実行できるようにします。
      2,					-- このような SQL 文の最大 2 つを待機できるようにします。
      true,					-- ルールはすぐに有効になります。
      'limit constant select',		-- ルールの説明。
      ''					-- デフォルトの search_path を使用します。
    );
  • 構文 2:

    SELECT rds_add_ccl_rule_with_query_id(
      1,					-- 速度制限の対象となる SQL 文の query_id。
      1,					-- プライマリインスタンスのみを速度制限します。
      3,					-- このような SQL 文の最大 3 つを同時に実行できるようにします。
      2,					-- このような SQL 文の最大 2 つを待機できるようにします。
      true,					-- ルールはすぐに有効になります。
      '',					-- SQL 文のテキスト。この例では指定されていません。
      'limit constant select',		-- ルールの説明。
      'public'                              -- search_path。
    );

SQL 速度制限ルールのクエリ

シナリオ

このコマンドは、プライマリインスタンスまたは読み取り専用インスタンスで実行して、作成された SQL スロットリングルールをクエリできます。

構文

  • 現在のインスタンスのすべてのデータベースにあるすべての SQL スロットリングルールを表示するには:

    SELECT * FROM rds_enabled_ccl_rule;
    説明
    • このコマンドのクエリ結果では、表示上の制限により、query_stringcomment の値は 200 文字に切り捨てられます。完全な情報を表示するには、SELECT * FROM rds_show_current_db_ccl_rule(); コマンドを実行します。

    • rds_ccl のバージョン 1.2 以降では、search_path の返却をサポートしています。

  • 現在のデータベースのすべての SQL スロットリングルールをクエリするには:

    SELECT * FROM rds_show_current_db_ccl_rule();

SQL 速度制限ルールの有効化

シナリオ

この関数はプライマリインスタンスでのみ呼び出すことができます。この関数は、次のシナリオに適用されます。

  • SQL スロットリングルールを作成するときに is_enabled パラメーターを false に設定した場合、この関数を使用してルールを有効にできます。

  • この関数を使用して、以前に無効にされたルールを有効にすることもできます。

構文

SELECT rds_enable_ccl_rule(ccl_id int);

パラメータ

パラメータ

タイプ

説明

ccl_id

int

SQL 速度制限ルールの ID。 ID のクエリ方法の詳細については、「SQL 速度制限ルールのクエリ」をご参照ください。

使用上の注意

なし。

SQL の例

SELECT rds_enable_ccl_rule(1);

SQL 速度制限ルールを読み込む

シナリオ

この関数は、プライマリインスタンスまたは読み取り専用インスタンスで呼び出して SQL スロットリングルールをロードできます。ロードされたルールのみが SQL スロットリングに使用できます。

この関数は、次のシナリオに適用されます。

  • プライマリインスタンス:

    • SQL スロットリングルールを作成するときに、is_enabledtrue に設定されている場合、ルールはプライマリインスタンスに自動的にロードされます。この場合、この関数を呼び出す必要はありません。

    • SQL スロットリングルールを作成するときに、is_enabledfalse に設定されている場合、rds_enable_ccl_rule 関数を呼び出して有効にすると、ルールはプライマリインスタンスに自動的にロードされます。この場合、この関数を呼び出す必要はありません。

    • プライマリインスタンスが再起動された場合は、この関数を手動で呼び出してルールをロードする必要があります。

  • 読み取り専用インスタンス:

    ルールを読み取り専用インスタンスで有効にする必要がある場合は、プライマリインスタンスでルールを作成し、node_tag パラメーターを 2 または 3 に設定する必要があります。次に、読み取り専用インスタンスでこの関数を呼び出して、ルールを手動でロードする必要があります。

構文

SELECT rds_load_ccl_rule(ccl_id int);

パラメータ

パラメータ

タイプ

説明

ccl_id

int

SQL 速度制限ルールの ID。 ID のクエリ方法の詳細については、「SQL 速度制限ルールのクエリ」をご参照ください。

使用上の注意

  • 読み取り専用インスタンスにルールをロードできるのは、rds_add_ccl_rule 関数を呼び出してプライマリインスタンスに SQL スロットリングルールを作成し、node_tag パラメーターを 2 または 3 に設定した後のみです。

  • 無効化されたルールはロードできません。無効化されたルールを読み取り専用インスタンスにロードするには、まずプライマリインスタンスでルールを有効にする必要があります。詳細については、「SQL スロットリングルールを有効にする」をご参照ください。

SQL の例

SELECT rds_load_ccl_rule(1);

SQL 速度制限ルールを変更する

シナリオ

この関数は、プライマリインスタンスでのみ呼び出して、SQL スロットリングルールの最大同時実行数と最大待機数を変更できます。

構文

SELECT rds_update_ccl_rule(
	ccl_id int,
	new_max_concurrency int,
	new_max_waiting int
);

パラメータ

パラメータ

タイプ

説明

ccl_id

int

SQL 速度制限ルールの ID。 ID のクエリ方法の詳細については、「SQL 速度制限ルールのクエリ」をご参照ください。

new_max_concurrency

int

新しい最大同時実行数。

  • 最大同時実行数を増やすと、待機中の SQL 文がすぐに実行されます。

  • 最大同時実行数を減らしても、現在実行中の SQL 文は影響を受けません。 待機中の SQL 文は、現在の同時実行数が新しい最大同時実行数を下回った後にのみ実行を開始します。

new_max_waiting

int

新しい最大待機数。

  • 最大待機数を増やすと、より多くの速度制限された SQL 文が待機できるようになります。

  • 最大待機数を減らしても、現在待機中の SQL 文は影響を受けません。 ただし、新しい SQL 文が待機する必要があり、待機中の SQL 文の現在の数が新しい最大数を超えると、PostgreSQL カーネルは ABORT をトリガーしてトランザクションを停止し、ロールバックします。

使用上の注意

  • SQL スロットリングルールへの更新はすぐに有効になります。

  • SQL スロットリングルールでは、最大同時実行数と最大待機数のみを変更できます。

SQL の例

SELECT rds_update_ccl_rule(
 2,     -- ccl_id
 4,     -- 新しい最大同時実行数は 4 です。
 5      -- 新しい最大待機数は 5 です。
);

SQL 速度制限ルールを無効にする

シナリオ

この関数は、プライマリインスタンスでのみ呼び出して SQL スロットリングルールを無効にできます。ルールが無効になると、SQL 文はスロットリングされなくなります。

説明

特定のルールを再度有効にするには、「SQL スロットリングルールを有効にする」をご参照ください。

構文

  • 特定の SQL スロットリングルールを無効にするには:

    SELECT rds_disable_ccl_rule(ccl_id int);
  • 現在のデータベースのすべての SQL スロットリングルールを無効にするには:

    SELECT rds_disable_all();

パラメータ

パラメータ

タイプ

説明

ccl_id

int

SQL 速度制限ルールの ID。 ID のクエリ方法の詳細については、「SQL 速度制限ルールのクエリ」をご参照ください。

使用上の注意

  • 無効化されたルールはロードできません。無効化されたルールを読み取り専用インスタンスにロードするには、まずプライマリインスタンスでルールを有効にする必要があります。詳細については、「SQL スロットリングルールを有効にする」をご参照ください。

  • SQL スロットリングルールを無効にすると、ルールはプライマリインスタンスから自動的にアンロードされ、SQL 文はスロットリングされなくなります。

SQL の例

SELECT rds_disable_ccl_rule(1);

SQL 速度制限ルールをアンロードする

シナリオ

この関数は、プライマリインスタンスまたは読み取り専用インスタンスで呼び出して SQL スロットリングルールをアンロードできます。アンロードされたルールは、SQL 文をスロットリングしなくなります。

この関数は、次のシナリオに適用されます。

  • プライマリインスタンス:

    • プライマリインスタンスで rds_disable_ccl_rule または rds_disable_all 関数を呼び出してルールを無効にすると、ルールはプライマリインスタンスから自動的にアンロードされます。この場合、この関数を呼び出す必要はありません。

    • プライマリインスタンスで rds_del_ccl_rule 関数を呼び出してルールを削除すると、ルールはプライマリインスタンスから自動的にアンロードされます。この場合、この関数を呼び出す必要はありません。

    • この関数を呼び出して、プライマリインスタンスからルールを手動でアンロードすることもできます。

  • 読み取り専用インスタンス:

    ルールが読み取り専用インスタンスで SQL 文をスロットリングしないようにする場合は、この関数を呼び出して読み取り専用インスタンスから手動でアンロードできます。

構文

SELECT rds_unload_ccl_rule(ccl_id int, db_name varchar default '');

パラメータ

パラメータ

タイプ

説明

ccl_id

int

SQL 速度制限ルールの ID。 ID のクエリ方法の詳細については、「SQL 速度制限ルールのクエリ」をご参照ください。

db_name

varchar

デフォルト値は空の文字列で、現在のデータベースを示します。 別のデータベースを指定して、そこから SQL 速度制限ルールをアンロードすることもできます。

使用上の注意

ルールがアンロードされると、SQL 文はスロットリングされなくなります。ルールを再度使用するには、リロードする必要があります。詳細については、「SQL スロットリングルールをロードする」をご参照ください。

SQL の例

SELECT rds_unload_ccl_rule(1,'');

SQL 速度制限ルールを削除する

シナリオ

この関数は、プライマリインスタンスでのみ呼び出して、SQL 速度制限ルールを削除できます。 ルールが削除されると、プライマリインスタンスから自動的にアンロードされます。

構文

SELECT rds_del_ccl_rule(ccl_id int);

パラメータ

パラメータ

タイプ

説明

ccl_id

int

SQL 速度制限ルールの ID。 ID のクエリ方法の詳細については、「SQL 速度制限ルールのクエリ」をご参照ください。

使用上の注意

なし。

SQL の例

SELECT rds_del_ccl_rule(1);

結果の例:

   rds_del_ccl_rule   
----------------------
 -7851264404688445170
(1 row)
説明
  • 結果は query_id です。

  • ルールが存在しない場合はエラーが返されます。

付録

query_id について

  • query_id は、PostgreSQL の SQL 文の特別な識別子です。類似の SQL 文は同じ query_id を共有します。

    例:

    -- 次の 2 つの SQL 文は同じ query_id を持ちます。
    SELECT * FROM tbl WHERE a = 1;
    SELECT * FROM tbl WHERE a = 2;
  • query_id には、オブジェクト識別子 (oid) に基づく SQL 文内のオブジェクトに関する情報が含まれています。同じ名前のテーブルでも、異なるデータベースまたはスキーマにある場合は、異なるオブジェクトと見なされます。したがって、同一の SQL 文でも、参照するオブジェクトが異なれば query_id の値は異なります。

  • SQL 文でアクセスされるオブジェクトがグローバルテーブルまたはグローバル関数の場合、文が実行されるデータベースに関係なく query_id は同じになります。

    • 例 1: pg_database はグローバルテーブルです。このテーブルを異なるデータベースからクエリした場合、query_id は同じになります。

      • `ccl_test` データベースで次の文を実行します。

        SELECT rds_get_query_id($$SELECT * FROM pg_database;$$);

        結果の例:

           rds_get_query_id   
        ----------------------
         -8733244708994363681
        (1 row)
      • `ccl_test2` データベースで次の文を実行します。

        SELECT rds_get_query_id($$SELECT * FROM pg_database;$$);

        結果の例:

           rds_get_query_id   
        ----------------------
         -8733244708994363681
        (1 row)
    • 例 2: pg_sleep はグローバル関数です。この関数を異なるデータベースから呼び出した場合、query_id は同じになります。

      • `ccl_test` データベースで次の文を実行します。

        SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);

        結果の例:

          rds_get_query_id  
        --------------------
         440101247839410938
        (1 row)
      • `ccl_test2` データベースで次の文を実行します。

        SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);

        結果の例:

          rds_get_query_id  
        --------------------
         440101247839410938
        (1 row)
  • 関数を呼び出す場合、パラメータタイプが変更された場合、または FROM 句が追加または削除された場合、query_id は変更されます。

    たとえば、pg_sleep 関数を呼び出すと、返される query_id はコンテキストによって異なります。

    • `FROM` 句なし:

      SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);

      結果の例:

        rds_get_query_id  
      --------------------
       440101247839410938
      (1 row)
    • `FROM` 句あり:

      SELECT rds_get_query_id($$SELECT * FROM pg_sleep(1);$$);

      結果の例:

         rds_get_query_id   
      ----------------------
       -3404018605099167039
      (1 row)
    • パラメーターの型が変更された場合:

      select rds_get_query_id($$SELECT * FROM pg_sleep(1.0);$$);

      結果の例:

        rds_get_query_id   
      ---------------------
       3073869725037049158
      (1 row)