Azure DB for PostgreSQL バルクINSERT, Single vs Flexible

Flexibleの方が同じインスタンスサイズでも速くなってるはずだけれど、バルクで入れたらどうなるんかな、と。コードは以下。1,000ファイルに分割されたトータル143GBのデータをINSERT文で投入(COPYではない)。

# cat bulk-load.py 
#!/usr/bin/env python3

import os
import csv
import multiprocessing as multi
import psycopg2
from psycopg2.extras import execute_values

def ingest(num):
    with psycopg2.connect('host=riotargetflexible.postgres.database.azure.com port=5432 dbname=postgres user=rifujita password={} sslmode=require'.format(os.getenv('PGPASSWORD'))) as con:
        with con.cursor() as cur:
            with open('/opt/chunks/dummy{:03d}.data'.format(num), 'r') as f:
                reader = csv.reader(f, quoting=csv.QUOTE_ALL)
                params = []
                for row in reader:
                    params.append(tuple(row))

            query = "INSERT INTO users (id, username, name, sex, address, email, birthdate) VALUES %s"
            ret = execute_values(cur, query, params)
            con.commit()

def main():
    p = multi.Pool()
    result = p.map(ingest, range(1000))
    p.close()

if __name__ == "__main__":
    main()

比較対象のPostgreSQLとデータ投入用のVMはAzure東日本に。ただし、FlexibleとVMは同じZone 1にデプロイされているので、Singleよりも絶対に速い。(Singleが偶然Zone 1にデプロイされない限り)

  • Single: PostgreSQL 11、汎用目的、32 個の仮想コア、4097 GB
  • Flexible: PostgreSQL 12、汎用目的, D32ds_v4、32 個の仮想コア、128 GiB RAM、4096 GiB ストレージ、Zone 1
  • データ投入VM: Ubuntu 20.04、Standard D16as v4 (16 vcpu 数、64 GiB メモリ)、Zone 1

まずSingle。

# time ./bulk-load.py 

real	85m49.610s
user	158m0.038s
sys	16m36.706s

ついでFlexible。

# time ./bulk-load.py 

real	39m38.942s
user	192m43.051s
sys	21m42.774s

Zoneを揃えてテストしたいなぁ…。

コメント

タイトルとURLをコピーしました