0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PostgreSQL13 1600カラムを1000万件いれてみた

Posted at

やりたいこと

カラム数の多さがどれだけパフォーマンスに影響するのかを確かめたいと思いやってみました。
そこで、PostgreSQLのMAXである1600カラムを作成し、データを1000万件入れました。

##結論から
かなりの差がでます。
select count(*)を行うと致命的
他にもデータ自体を検索してしまうとカラム数が多い場合、実行時間がまともに動作しないレベル。
カラム数はあんまり多くしないようにしましょう。
もちろん、インデックスは使いましょう。

前提

PostgreSQLで使ったのはAWS RDS(t3.micro)です。
以下の2つのテーブルを比べることでパフォーマンスを比較します

■testテーブル
 ・カラム数は、以下の3つ 
  1.character varying(256)
  2.integer
  3.timestamp with time zone
 ・CSVでインポート。サイズは650MBほど
 ・1000万件のデータがあります。
 ・インデックスなし

■test_1600テーブル
 ・カラム数は、以下の1600個
  1.character varying(256)
  2.timestamp with time zone
  3.integerが1598カラムあります。
 ・CSVでインポート。サイズは73GB・・(汗 でかい
 ・1000万件のデータがあります。
 ・インデックスなし

データ個数確認!

カラムが多いと実行時間が123倍かかるようです。

■testテーブルは1000万件確認
約4秒かかりました。
スクリーンショット 2021-12-09 15.28.05.png

実行計画を見てみます
スクリーンショット 2021-12-09 15.34.44.png

■test_1600テーブルも万件確認
約10分かかりました・・これはまずい
スクリーンショット 2021-12-09 15.27.49.png

実行計画を見てみます
Excustion Timeが実行時間です。10分ほどかかってます。
スクリーンショット 2021-12-09 13.52.03.png

##インデックスがない状態で1行取得してみる
存在しないデータを取得してみる
カラムが多いと実行時間が78倍かかるようです。

■testテーブル
約4秒
スクリーンショット 2021-12-09 15.47.56.png

■test_1600テーブル
約314秒
スクリーンショット 2021-12-09 15.47.40.png

##インデックスがある状態で存在する1行取得してみる

■testテーブル
インデックスはると、データ自体を使わないため、あんまりかわらないですね

約0.038ms
スクリーンショット 2021-12-09 16.06.08.png

■test_1600テーブル
約0.245秒
スクリーンショット 2021-12-09 16.08.05.png

##CPU使用率もスパイクしまくる
select count(*)と、インデックスなしでアクセスしたからだと思います。
スクリーンショット 2021-12-09 16.13.38.png

##読み取り IOPS
スクリーンショット 2021-12-09 16.19.17.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?