Dummy Dataの作成

Generate Dummy Data

ベンチマークを実施する場合は、本番と同じデータとシステムで実施しないとあまり参考にする事は出来ませんが、おおよその検討を付ける為にダミーでデータを生成するケースも有るかと思います。TPCCなどを用いてデータを生成する事も可能ですが、ここではMySQLとPostgreSQLにて簡易的にデータを生成する方法を記載しておきます。

In Case of MySQL

MySQLにはランダムに値を生成する場合に以下の様な関数を利用する事が出来ます。

mysql> select uuid();
+--------------------------------------+
| uuid()                               |
+--------------------------------------+
| 9ccacd01-49cd-11ed-8782-0242ac120002 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> select uuid_to_bin(uuid());
+------------------------------------------+
| uuid_to_bin(uuid())                      |
+------------------------------------------+
| 0x9E56819A49CD11ED87820242AC120002       |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select bin_to_uuid(0x9E56819A49CD11ED87820242AC120002);
+-------------------------------------------------+
| bin_to_uuid(0x9E56819A49CD11ED87820242AC120002) |
+-------------------------------------------------+
| 9e56819a-49cd-11ed-8782-0242ac120002            |
+-------------------------------------------------+
1 row in set (0.00 sec)

mysql> select UUID_SHORT();
+-------------------+
| UUID_SHORT()      |
+-------------------+
| 99980316407496704 |
+-------------------+
1 row in set (0.00 sec)
MySQLにおけるランダムデータ生成関数

これらの関数には制限事項があるのでもし本番で利用する場合はマニュアルを事前に確認下さい。

参照:12.24 その他の関数

以下の例では、上記関数を利用せずに関数を作成してデータを生成しています。


/***  Create Test Database ***/

CREATE DATABASE `CONFIRM` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

/*** Create Test Table ***/

CREATE TABLE `T_Dummy` (
`id` bigint NOT NULL AUTO_INCREMENT,
`fk_id` bigint DEFAULT NULL,
`dummy_id` bigint NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;


/*** Create Test Procedure for generating data. ***/

DELIMITER //
CREATE PROCEDURE proc_dummpy_data()
BEGIN
 DECLARE cnt bigint DEFAULT 0;
 WHILE cnt < 100000 DO
  INSERT INTO T_Dummy (fk_id, dummy_id)
  SELECT cnt, RAND()*8;
 
  SET cnt = cnt + 1;
 END WHILE;

 SELECT cnt;
END
;
//


/*** Call Procedure ***/

CALL proc_dummpy_data();

Creating Dummy Data

In Case of PostgreSQL

PostgreSQLには、generate_seriesという連続値を生成する関数があるので、此方を利用するとダミーデータの作成は簡単に出来そうです。以下は一例なので、詳細についてはマニュアルを確認下さい。

POC=# SELECT GENERATE_SERIES(1, 10);
 generate_series
-----------------
               1
               2
               3
               4
               5
               6
               7
               8
               9
              10
(10 rows)

POC=# SELECT RANDOM() FROM GENERATE_SERIES(1, 10);
        random
----------------------
  0.24989755156359905
   0.7697032073714389
  0.47755888928472245
 0.023517539907981444
   0.1439651319513544
   0.5516281183040128
   0.9511921394431369
   0.6643616235339458
   0.5505690505151151
  0.41254574516895914
(10 rows)

POC=# SELECT '2022-10-01'::DATE + GENERATE_SERIES(0, 9);
  ?column?
------------
 2022-10-01
 2022-10-02
 2022-10-03
 2022-10-04
 2022-10-05
 2022-10-06
 2022-10-07
 2022-10-08
 2022-10-09
 2022-10-10
(10 rows)

上記関数を利用してCalendarデータを含むサンプルデータの作成してみます

POC=# create database confirm owner 'postgres' encoding 'UTF8' lc_collate 'C' lc_ctype 'C' template 'template0';
CREATE DATABASE
POC=# \c confirm
psql (14.1 (Ubuntu 14.1-1.pgdg18.04+1), server 13.5 (Debian 13.5-1.pgdg110+1))
You are now connected to database "confirm" as user "postgres".
confirm=# CREATE SEQUENCE dummy_data_id START 1;
CREATE SEQUENCE
confirm=# create table T_Dummy (id integer DEFAULT nextval('dummy_data_id'),calendar timestamp without time zone);
CREATE TABLE
confirm=# \dt
          List of relations
 Schema |  Name   | Type  |  Owner
--------+---------+-------+----------
 public | t_dummy | table | postgres
(1 row)

confirm=# alter sequence dummy_data_id owned by T_Dummy.id;
ALTER SEQUENCE

confirm=# insert into t_dummy(calendar) SELECT '2022-10-01'::DATE + GENERATE_SERIES(0, 365);
INSERT 0 366
confirm=# select * from t_dummy order by id asc limit 1;
 id |      calendar
----+---------------------
  1 | 2022-10-01 00:00:00
(1 row)

confirm=# select * from t_dummy order by id desc limit 1;
 id  |      calendar
-----+---------------------
 366 | 2023-10-01 00:00:00
(1 row)

confirm=# select count(*) from t_dummy;
 count
-------
   366
(1 row)

関数は必須ではありませんが、拡張性を持たせるために作成してデータをLOOPして生成してみます。

confirm=#  truncate table t_dummy restart identity;
TRUNCATE TABLE
confirm=# insert into t_dummy(calendar) SELECT '2022-10-01'::DATE + GENERATE_SERIES(0,1);
INSERT 0 2
confirm=# select * from t_dummy;
 id |      calendar
----+---------------------
  1 | 2022-10-01 00:00:00
  2 | 2022-10-02 00:00:00
(2 rows)

confirm=# DROP FUNCTION fnc_generate_dummy_data;
ERROR:  could not find a function named "fnc_generate_dummy_data"
confirm=# CREATE OR REPLACE FUNCTION fnc_generate_dummy_data(loop_num int) RETURNS int AS $$
confirm$# DECLARE
confirm$#   i int;
confirm$# BEGIN
confirm$#    FOR i IN 1..loop_num loop
confirm$#    insert into t_dummy(calendar) SELECT max(calendar)::DATE + GENERATE_SERIES(1, 1) from t_dummy;
confirm$#    -- PERFORM  pg_sleep(1);
confirm$#    END LOOP;
confirm$#    RETURN 0;
confirm$# END;
confirm$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
confirm=# SELECT fnc_generate_dummy_data(365);
 fnc_generate_dummy_data
-------------------------
                       0
(1 row)

confirm=# select count(*) from t_dummy;
 count
-------
   367
(1 row)

confirm=# select * from t_dummy order by id asc limit 3;
 id |      calendar
----+---------------------
  1 | 2022-10-01 00:00:00
  2 | 2022-10-02 00:00:00
  3 | 2022-10-03 00:00:00
(3 rows)

confirm=# select * from t_dummy order by id desc limit 3;
 id  |      calendar
-----+---------------------
 367 | 2023-10-02 00:00:00
 366 | 2023-10-01 00:00:00
 365 | 2023-09-30 00:00:00
(3 rows)

Dummy Data with Calendar Data

カテゴリー:

最近のコメント

表示できるコメントはありません。