PolarDB-X ベストプラクティスシリーズ (3): Qwen とストアドプロシージャを使用してテストデータを迅速に生成する

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/polardb-x-best-practice-series-3-use-qwen-and-stored-procedures-to-quickly-generate-test-data_602034?spm=a2c65.11461433.0.0.4ee35355zOUPsx)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# PolarDB-Xでストアドプロシージャを使用してテストデータを生成する方法

_By Mengshi_

データベースのパフォーマンスをテストする際、通常はテストデータの一括生成が必要です。以前は、この作業を行うためにプログラムやスクリプトを書く必要がありましたが、今ではそれが変わりました！[PolarDB-X](https://www.alibabacloud.com/product/polardb-for-xscale) は現在、ストアドプロシージャをサポートしている数少ない分散データベースの1つです。大規模なモデルと組み合わせることで、テストデータを簡単に作成できます。

- [ストアドプロシージャの原理と使用方法](https://www.alibabacloud.com/help/en/polardb/polardb-for-xscale/stored-procedures)
- [Qwen](https://tongyi.aliyun.com/)

例えば、次のようなテーブル構造があるとします：sql
CREATE TABLE t2 (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        c1 varchar(64) NOT NULL ,
        c2 tinyint(4) NOT NULL ,
        c3 varchar(64) NOT NULL ,
        c4 tinyint(4) NOT NULL ,
        c5 varchar(64) NOT NULL ,
        c6 bigint(20) DEFAULT NULL ,
        c7 bigint(20) DEFAULT NULL ,
        c8 double DEFAULT NULL ,
        c9 bigint(20) DEFAULT NULL ,
        PRIMARY KEY (id),
        CLUSTERED INDEX gsi1 (c3)
                PARTITION BY KEY(c3)
                PARTITIONS 32,
        UNIQUE KEY uk1 (c5, c3, c1),
        KEY idx1 (c1),
        KEY idx2 (c5, c1, c8),
        KEY idx3 (c5, c3, c8)
) ENGINE = InnoDB PARTITION BY KEY(c1) PARTITIONS 32;

私たちは、Qwenに質問し、次の要件を記述するだけで、自動的にストアドプロシージャを生成させることができます：

「以下のテーブルに対して100万件のデータを生成するストアドプロシージャを作成してください。ここで、`c1` と `c5` は40ビットの16進数文字列です。」（SQL内容省略）

![1](https://yqintl.alicdn.com/692c8455a8eb14dbbea52ae37868d5cbc8ed339b.jpeg)

Qwenは以下のようなストアドプロシージャを生成します：sql
DELIMITER ;;
CREATE PROCEDURE GenerateTestData()
BEGIN
    DECLARE v_counter INT DEFAULT 0;
    DECLARE v_hex_string CHAR(40);

    WHILE v_counter < 1000000 DO
        -- 40桁の16進数文字列を生成
        SET v_hex_string = LPAD(LOWER(REPLACE(UUID(), '-', '')), 40, '0');

        INSERT INTO t2 (
            c1,
            c2,
            c3,
            c4,
            c5,
            c6,
            c7,
            c8,
            c9
        ) VALUES (
            -- c1用の16進数文字列を生成
            v_hex_string,
            -- ランダムなtinyint値を生成（例：0から255の範囲）
            FLOOR(RAND() * 256),
            -- c3用のランダムな文字列を生成（ここでは16進数も適用可能、サンプルとして表示）
            LPAD(LOWER(REPLACE(UUID(), '-', '')), 32, '0'),
            -- ランダムなtinyint値を生成
            FLOOR(RAND() * 256),
            -- c5用の16進数文字列を生成
            v_hex_string,
            -- ランダムなbigint値を生成
            FLOOR(RAND() * POW(2, 63)),
            -- ランダムなbigint値を生成
            FLOOR(RAND() * POW(2, 63)),
            -- ランダムなdouble値を生成
            RAND(),
            -- ランダムなbigint値を生成
            FLOOR(RAND() * POW(2, 63))
        );

        SET v_counter = v_counter + 1;
    END WHILE;

END;;
DELIMITER ;

CALL GenerateTestData();

PolarDB-XはMySQLの構文と高い互換性を持つため、生成された結果を修正する必要はありません。そのままPolarDB-Xに貼り付けて実行することができます：

![2](https://yqintl.alicdn.com/6627ebb1683b54e442f33d927f3000487aa8dea9.jpeg)

テストデータは短時間で作成されます：

![3](https://yqintl.alicdn.com/877c13b975c42c9186978a53e04bc808568138ae.png)

今後も、[PolarDB-X](https://www.alibabacloud.com/product/polardb-for-xscale) のベストプラクティスについてお伝えしていきますので、お楽しみに。