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を揃えてテストしたいなぁ…。