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

PolarDB:SQL 速度制限

最終更新日:May 14, 2025

PolarDB-X は、SQL 速度制限機能を提供します。この機能を使用すると、データベースノードで問題を引き起こす SQL 文の実行に制限を指定できます。問題には、リクエストの急増、大量のリソースの消費、SQL アクセスモデルの変更などがあります。この機能により、PolarDB-X インスタンスが継続的かつ安定的に実行されるようになります。このトピックでは、SQL 速度制限機能の使用方法について説明します。

サポートされているバージョン

SQL 速度制限機能は、計算ノードのバージョンが 5.4.9-16167266 以降の PolarDB-X Enterprise Edition インスタンスでのみサポートされています。低速 SQL 速度制限トリガーは、計算ノードのバージョンが 5.4.11-16251897 以降の PolarDB-X Enterprise Edition インスタンスでのみサポートされています。

説明

速度制限ルールを作成する

構文

CREATE CCL_RULE [ IF NOT EXISTS ] `ccl_rule_name`
ON `database`.`table`
TO '<username>'@'<host>'
FOR { UPDATE | SELECT | INSERT | DELETE }
[ filter_options ]
with_options

filter_options:
    [ FILTER  BY KEYWORD('KEYWORD1', 'KEYWORD2',…) ]

パラメーター:

パラメーター

必須

説明

速度制限のために制限される SQL 文を識別するために使用されるパラメーター

`ccl_rule_name`

はい

速度制限ルール名。

説明

ルール名を SQL キーワードと区別するために、ルール名をバックティック (`) で囲むことをお勧めします。

`database`.`table`

はい

データベース名とテーブル名。アスタリスク (*) はワイルドカード文字としてサポートされています。

説明

名前を SQL キーワードと区別するために、各データベース名とテーブル名をバックティック (`) で囲むことをお勧めします。

'<username>'@'<host>'

はい

アカウントのユーザー名。host 部分では、パーセント記号 (%) をワイルドカード文字として使用できます。

UPDATE | SELECT | INSERT | DELETE

はい

SQL クエリタイプ。値は UPDATE、SELECT、INSERT、または DELETE を指定できます。

説明

各速度制限ルールは、1 つの SQL クエリタイプにのみ適用されます。

[ filter_options ]

いいえ

フィルター条件。有効な値:

  • KEYWORD: ルールをクエリすると、キーワードはクエリ結果の文字列に表示されます。文字列形式は ["kwd1","kw2","kw3"...] です。文字列には最大 512 文字を含めることができます。

    説明
    • キーワードが SQL 文の パラメーター値 と一致する場合、一致は大文字と小文字が区別されます。

    • キーワードが SQL 文の他の部分と一致する場合、一致は大文字と小文字が区別されません。

  • TEMPLATE: パラメーター化された SQL 文の 16 進数のハッシュ値として表される SQL テンプレート ID。この値は、SQL ログの sql_code フィールドに対応します。SHOW FULL PROCESSLIST 文または EXPLAIN 文を実行して、SQL テンプレート ID を確認できます。

速度制限操作を決定するために使用されるパラメーター

with_options

はい

WITH 句は、速度制限操作を決定するために次のパラメーターをサポートしています。

  • MAX_CONCURRENCY: ルールに一致する SQL 文の最大同時実行数。

    有効な値: 0 ~ 231 - 1。デフォルト値: 0。

  • WAIT_QUEUE_SIZE: 待機キューの最大長。最大同時実行数に達すると、速度制限ルールに一致する他の SQL 文が待機キューに追加されます。待機キューが最大長に達すると、システムが速度制限ルールに一致する別の SQL 文を検出するたびにエラーが報告されます。キューに入れられた SQL 文はスレッドを消費します。キューが長い場合、メモリ不足 (OOM) エラーが発生する可能性があります。

    有効な値: 0 ~ 231 - 1。デフォルト値: 0。

  • WAIT_TIMEOUT: SQL 文をキューに保持できる最大期間。SQL 文がキューに保持される期間が最大期間に達すると、SQL 文に対してエラーが返されます。

    有効な値: 0 ~ 231 - 1。デフォルト値: 600。単位: 秒。

  • FAST_MATCH: 一致を高速化するためにキャッシュを有効にするかどうかを指定します。キャッシュが有効になっている場合、システムはテンプレート ID を文のキャッシュキーの一部として使用します。キャッシュ値は、文が速度制限ルールに一致するかどうかを示します。このメカニズムにより、一致プロセスが高速化されます。

    有効な値: 0 と 1。値 0 はキャッシュが無効になっていることを指定します。値 1 はキャッシュが有効になっていることを指定します。

説明
  • 速度制限ルールを作成するときは、上記のオプションの少なくとも 1 つを指定する必要があります。

  • MAX_CONCURRENCY パラメーターのデフォルト値は 0 です。デフォルト値を使用すると、速度制限ルールに一致する SQL 文が実行されるたびにエラーが発生する可能性があります。この問題を防ぐには、このパラメーターを 0 以外の値に設定します。

  • PolarDB-X は、分散クラウドネイティブデータベースサービスです。PolarDB-X インスタンスは複数の計算ノードで構成されています。インスタンスの最大同時リクエスト数は、各ノードの最大同時リクエスト数の合計です。インスタンス内の計算ノードの負荷が不均衡な場合、インスタンスの同時 SQL リクエストの合計数は、インスタンスの最大同時 SQL リクエスト数に達することができません。

説明

WITH 句に含まれるパラメーターは、速度制限のために制限される SQL 文を識別するために使用されるパラメーターに含まれるすべての条件を満たす SQL 文にのみ有効です。

selectrule という名前の速度制限ルールを作成して、'ccltest'@'%' ユーザーによって実行され、cclmatched キーワードを含む SELECT クエリの最大同時実行数を 10 に制限します。

CREATE CCL_RULE IF NOT EXISTS `selectrule` ON *.* TO 'ccltest'@'%'
FOR SELECT
FILTER BY KEYWORD('cclmatched')
WITH MAX_CONCURRENCY=10;
説明

任意の IP から ccltest アカウントによって実行され、cclmatched キーワードを含む SELECT クエリの最大同時実行数は 10 です。

速度制限の結果

システムが速度制限ルールに一致する SQL 文を検出すると、SQL 文は速度制限ルールで指定された WITH オプションに基づいて次の状態に入ります。

  • RUN

    ルールに一致する SQL 文の同時実行数が MAX_CONCURRENCY で指定された値に達していない場合、SQL 文は想定どおりに実行されます。

  • WAIT

    同時実行数が最大同時実行数に達したが、キューに入れられた SQL 文の数が WAIT_QUEUE_SIZE で指定された値に達していない場合、SQL 文は WAIT 状態に入り、次に RUN または WAIT_TIMEOUT 状態に入ります。

    次の文を実行して、速度制限ルールに一致するキューに入れられた SQL 文をクエリできます。

    SHOW FULL PROCESSLIST;

    結果例:

    +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+
    | ID | USER          | HOST            | DB       | COMMAND                       | TIME | STATE | INFO                  | SQL_TEMPLATE_ID |
    +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+
    |  2 | polardbx_root | ***.*.*.*:62787 | polardbx | Query                         |    0 |       | show full processlist | NULL            |
    |  1 | polardbx_root | ***.*.*.*:62775 | polardbx | Query(Waiting-selectrulereal) |   12 |       | select 1              | 9037e5e2        |
    +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+
    2 rows in set (0.08 sec)
    説明

    select 1 SQL 文は selectrulereal 速度制限ルールに一致し、処理されるのを待機しています。

  • WAIT_TIMEOUT

    キューに入れられた SQL 文は、待機時間が WAIT_TIMEOUT で指定された期間を超えると、実行に失敗し、エラーを返します。

    たとえば、速度制限ルールの WAIT_TIMEOUT オプションを 10 秒に設定し、速度制限ルールに一致する SELECT sleep(11) 文が 10 秒間キューに留まっている場合、次のエラーが返されます。

    ERROR 3009 (HY000): [11a07e23fd800000][30.225.XXX.XX:8527][polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal after waiting for 10060 ms
  • KILL

    最大同時実行数と最大キュー長に達したときに、システムが速度制限ルールに一致する SQL 文を検出すると、クライアントはエラーを受信します。エラーメッセージは、最大同時実行数に達したことを示し、SQL 文が一致する速度制限ルール名を含みます。

    たとえば、最大同時実行数と最大キュー長に達したときに SELECT 1; 文を実行し、文が速度制限ルールに一致する場合、次のエラーが返されます。

    ERROR 3009 (HY000): [11a07c4425c00000][**.***.***.**:8527][polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal
    説明

    SELECT 1; は、selectrulereal で指定された最大同時実行数を超えているため、実行に失敗します。

速度制限ルールをクエリする

特定の速度制限ルールをクエリする

特定のルールを表示するには、次の文でルール名を指定し、名前をコンマ (,) で区切ります。

構文:

SHOW CCL_RULE `ccl_rule_name1` [, `ccl_rule_name2` ]

例:

SHOW CCL_RULE `selectrulereal` 

結果例:

                     NO.: 1
               RULE_NAME: selectrulereal
                 RUNNING: 2
                 WAITING: 29
                  KILLED: 0
         MATCH_HIT_CACHE: 21374
             TOTAL_MATCH: 21406
       ACTIVE_NODE_COUNT: 2
MAX_CONCURRENCY_PER_NODE: 1
WAIT_QUEUE_SIZE_PER_NODE: 100
            WAIT_TIMEOUT: 600
              FAST_MATCH: 1
                SQL_TYPE: SELECT
                    USER: ccltest@%
                   TABLE: *.*
                KEYWORDS: ["SELECT"]
              TEMPLATEID: NULL
            CREATED_TIME: 2020-11-26 17:04:08

フィールド:

フィールド

説明

NO.

ルールの優先順位。値が小さいほど、優先順位が高くなります。

RULE_NAME

速度制限ルール名。

RUNNING

速度制限ルールに一致し、想定どおりに実行された SQL 文の数。

WAITING

速度制限ルールに一致する SQL 文を使用して送信された、キューに入れられたリクエストの数。

KILLED

速度制限ルールに一致し、終了された SQL 文の数。

MATCH_HIT_CACHE

速度制限ルールに一致し、テンプレート ID がキャッシュキーに見つかった SQL 文の数。

TOTAL_MATCH

速度制限ルールが一致した回数の合計。

ACTIVE_NODE_COUNT

SQL 速度制限が有効になっている計算ノードの数。

MAX_CONCURRENCY_PER_NODE

各計算ノードの SQL 文の最大同時実行数。

WAIT_QUEUE_SIZE_PER_NODE

各計算ノードの待機キューの最大長。

WAIT_TIMEOUT

SQL 文を待機キューに保持できる最大期間。

FAST_MATCH

一致プロセスを高速化するためにキャッシュを有効にするかどうかを指定します。

SQL_TYPE

SQL 文のタイプ。

USER

ユーザー名。

TABLE

データベース名。

KEYWORDS

キーワードのリスト。

TEMPLATEID

SQL テンプレートの ID。

CREATED_TIME

速度制限ルールが作成されたローカル時刻。時刻は yyyy-MM-dd HH:mm:ss 形式です。

すべての速度制限ルールを表示する

SHOW CCL_RULES;

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

説明

速度制限ルールが削除されると、速度制限ルールはすぐに無効になり、キューに入れられた SQL 文は想定どおりに実行できます。

  • 特定の速度制限ルールを削除する

    特定の速度制限ルールを削除するには、次の文でルール名を指定し、名前をコンマ (,) で区切ります。

    構文:

    DROP CCL_RULE [ IF EXISTS ] `ccl_rule_name1` [, `ccl_rule_name2`, ...]

    例:

    DROP CCL_RULE IF EXISTS `selectrulereal`;

    すべての速度制限ルールを削除する:

    CLEAR CCL_RULES;

低速 SQL 速度制限トリガー

低速 SQL 速度制限トリガーを有効にする

低速 SQL 速度制限トリガーは、指定された実行時間のしきい値を超える SQL クエリに対して速度制限ルールを自動的に作成するように設計されたメカニズムです。

構文:

SLOW_SQL_CCL GO ['SQL_TYPE'[MAX_CONCURRENCY] [SLOW_SQL_TIME] [MAX_CCL_RULE]]

例:

SLOW_SQL_CCL GO 'SELECT' 2 5 2;
説明
  • パラメーター:

    • SQL_TYPE: SQL クエリタイプ。有効な値: ALL、SELECT、UPDATE、および INSERT。デフォルト値: SELECT。

    • MAX_CONCURRENCY: 自動的に作成された速度制限ルールで許可される SQL クエリの最大同時実行数。デフォルトでは、値は CPU コア数の半分です。

    • SLOW_SQL_TIME: 低速 SQL クエリのしきい値実行時間。デフォルト値: システムパラメーター SLOW_SQL_TIME の値。単位: ミリ秒。

    • MAX_CCL_RULE: 作成できる速度制限ルールの最大数。デフォルト値: 1000。

  • 低速 SQL 速度制限トリガーの仕組み:

    1. インスタンス全体のすべてのセッションをスキャンして、指定されたタイプのすべての低速 SQL クエリのテンプレート ID を識別します。

    2. 低速 SQL 速度制限トリガーを作成します。トリガーには、_SYSTEM_SLOW_SQL_CCL_TRIGGER_{SQL_TYPE}_ 形式で名前が付けられます。

    3. すべての低速 SQL クエリのテンプレート ID をトリガーに送信します。次に、トリガーは識別された テンプレート ID の速度制限ルールを作成します。

    4. MAX_CONCURRENCY 制限を超える、識別されたテンプレート ID を持つすべての SQL クエリを終了します。

低速 SQL 速度制限トリガーを表示する

SLOW_SQL_CCL SHOW;

結果のフィールド:

フィールド

NO.

1

SCHEMA

__cdc__

TEMPLATE_ID

1394f5db

SQL

SELECT * FROM test

RULE_NAME

AUTO__SYSTEM_SLOW_SQL_CCL_TRIGGER_SELECT____cdc___1394f5db_9e1c7f6d

RUNNING

0

WAITING

0

KILLED

0

TOTAL_MATCH

0

ACTIVE_NODE_COUNT

4

MAX_CONCURRENCY_PER_NODE

2

CREATED_TIME

2025-04-23 00:00:00

低速 SQL のしきい値を調整する

低速 SQL のしきい値は、次の方法のいずれかを使用して調整できます (優先順位の高い順にリストされています)。

  1. SLOW_SQL_CCL GO 文で SLOW_SQL_TIME を指定します。

  2. SLOW_SQL_CCL GO を実行する前に SLOW_SQL_TIME を指定します。

    例:

    SET @slow_sql_time=2000;
    SLOW_SQL_CCL GO;
  3. PolarDB-X コンソールで SLOW_SQL_TIME を指定します。

低速 SQL 速度制限トリガーを無効にする

SLOW_SQL_CCL GO 文を使用して作成された低速 SQL 速度制限トリガーを無効にすると、トリガーによって作成された速度制限ルールも削除されます。

SLOW_SQL_CCL BACK;