【PostgreSQL】連番の大量データを作成する(generate_series関数)


# はじめに
パフォーマンス性能を検証するために100万行のデータが必要でした。
これを作成するためにPostgreSQLの関数`generate_series`を使用しました。
そのデータベースの作成からテーブルにデータを挿入するまでを備忘録的に記事にしました。

# やりたいこと(作成イメージ)

今回の記事で作成するテーブル定義は以下の通りです。
サンプルなのでざっくりです。

- DB名：sample
- テーブル名：sample_renban

| カラム名    | データ型      | NOT NULL |列制約      |
|:---------:|:-----------:|:--------:|:---------:|
| id        |   INTEGER   | NOT NULL |PRYMARY KEY|
| val1      | varchar(10) | NOT NULL |    -      |
| val2      | varchar(10) | NOT NULL |    -      |
| val3      | varchar(10) | NOT NULL |    -      |
| val4      | varchar(10) | NOT NULL |    -      |
| val5      | varchar(10) | NOT NULL |    -      |
| val6      | varchar(10) | NOT NULL |    -      |
| val7      | varchar(10) | NOT NULL |    -      |
| val8      | varchar(10) | NOT NULL |    -      |
| val9      | varchar(10) | NOT NULL |    -      |
| val10     | varchar(10) | NOT NULL |    -      |

このテーブルに下記のイメージでidカラムに1〜100万の連番の数字をつけた行を一気に挿入します。

```
  id   | val1 | val2 | val3 | val4 | val5 | val6 | val7 | val8 | val9 | val10 
-------+------+------+------+------+------+------+------+------+------+-------
     1 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     2 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     3 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     4 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 999998| aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
 999999| aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
1000000| aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
```

# バージョン情報

- postgreSQL version 11.3
- Mac OS Mojave10.14.6

尚、homebrowでpostgreSQLを導入しています。
windowsでもpostgresSQLがインストールされていて起動していれば実施可能です。

# 方法

実際には100万件で実施したのですがちょっと多いので
今回の記事は`1,000行のデータを作成`します。
ターミナルのみを使用します。データベースが既にある方は5に飛んでください。

## 1.データベースにログインする

```
MacBook-Pro:~ hoge$ psql -d postgres
psql (11.3)
Type "help" for help.
```

## 2.データベースを作成する

```
postgres=# CREATE DATABASE sample;
CREATE DATABASE
```

## 3.データベースが作成されているか確認する

データベースの一覧を表示します。

```
postgres=# \l
                                      List of databases
   Name    |  Owner | Encoding | Collate | Ctype |         Access privileges         
-----------+--------+----------+---------+-------+-----------------------------------
 sample    |  hoge  | UTF8     | C       | C     | 

```

今回は`sample`という名前のものがあれば大丈夫です。

## 4.データベースを変更する

```
postgres=# \c sample
You are now connected to database "sample" as user "hoge".
```

## 5.テーブルを作成する

```
sample=# CREATE TABLE sample_renban(
sample(#   id INTEGER NOT NULL PRIMARY KEY,
sample(#   val1 varchar(10) NOT NULL,
sample(#   val2 varchar(10) NOT NULL,
sample(#   val3 varchar(10) NOT NULL,  
sample(#   val4 varchar(10) NOT NULL,
sample(#   val5 varchar(10) NOT NULL,  
sample(#   val6 varchar(10) NOT NULL,
sample(#   val7 varchar(10) NOT NULL,  
sample(#   val8 varchar(10) NOT NULL,
sample(#   val9 varchar(10) NOT NULL,  
sample(#   val10 varchar(10) NOT NULL
sample(# );
CREATE TABLE
```

## 6.テーブルにデータを挿入する

```
sample=# insert into
sample-# sample_renban(id, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10)
sample-# select
sample-# row_number() over() as id,
sample-# 'aaa' as val1,
sample-# 'aaa' as val2,
sample-# 'aaa' as val3,
sample-# 'aaa' as val4,
sample-# 'aaa' as val5,
sample-# 'aaa' as val6,
sample-# 'aaa' as val7,
sample-# 'aaa' as val8,
sample-# 'aaa' as val9,
sample-# 'aaa' as val10
sample-# from generate_series(1, 1000) as id
sample-# ;
INSERT 0 1000
```

※`generate_series(1, 1000)`の1000を1000000にすれば100万行のデータが追加されます。

# 結果

下記のSQLを実行し、データを確認してみます。

```
select * from sample_renban;
```

```
  id   | val1 | val2 | val3 | val4 | val5 | val6 | val7 | val8 | val9 | val10 
-------+------+------+------+------+------+------+------+------+------+-------
     1 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     2 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     3 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     4 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
     5 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1000 | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa  | aaa
```

できました！！

#　参考
- [PostgreSQL: 集合を返すGENERATE_SERIES関数で大量データを生成して集計する｜TECHSCORE](https://www.techscore.com/blog/2013/03/12/%E9%9B%86%E5%90%88%E3%82%92%E8%BF%94%E3%81%99generate_series%E9%96%A2%E6%95%B0%E3%81%A7%E5%A4%A7%E9%87%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%A6%E9%9B%86%E8%A8%88/)