laravel-performance/README.md

5.8 KiB

Install

create database example-update-massive

configure .env

DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=example-update-massive
DB_USERNAME=default
DB_PASSWORD=secret

QUEUE_CONNECTION=database

ITEMS_COUNT=10000

ITEMS_COUNT é a variavel que irá definir quantos registros a fatory irá criar no banco de dados.

run migrate;

php artisan migrate:fresh --seed

Analyse Insert

php artisan app:mass-insert --count=100
php artisan queue:work --queue=default

MassInsert1, MassInsert2, MassInsert3, MassInsert4, MassInsert5, MassInsert6

Result

quantity method time seconds
100 Insert1 0,166
100 Insert2 0,015
100 Insert3 0,015
100 Insert4 0,044
100 Insert5 0,040
100 Insert6 0,125
quantity method time seconds
1.000 Insert1 1,000
1.000 Insert2 0,087
1.000 Insert3 0,087
1.000 Insert4 0,352
1.000 Insert5 0,343
1.000 Insert6 1,000
quantity method time seconds
10.000 Insert1 13,000
10.000 Insert2 0,789
10.000 Insert3 0,795
10.000 Insert4 3,000
10.000 Insert5 3,000
10.000 Insert6 11,000
quantity method time seconds
100.000 Insert1 2m 43s 163
100.000 Insert2 error
100.000 Insert3 8
100.000 Insert4 35
100.000 Insert5 34
100.000 Insert6 2m 27s 147
quantity method time second
1.000.000 Insert1 1952,320
1.000.000 Insert2 error
1.000.000 Insert3 950,000
1.000.000 Insert4 950,000
1.000.000 Insert5 -
1.000.000 Insert6 -

Analyse Update

Grupo 1:

Atualizar um campo ou mais, mas o valor é o mesmo para um determinado grupo:

Update1Job

update transactions
set date=now(),
    value=1
where id = 1;

update transactions
set date=now(),
    value=1
where id = 2;

update transactions
set date=now(),
    value=1
where id = 3;
...

Update2Job

update transactions
set date=now(),
    value=1
where id in (1, 2, 3, . . .);

Result

quantity method time seconds performance
1.000 UpdateMassive1Job 1,00s -
1.000 UpdateMassive2Job 0,01s 100x
10.000 UpdateMassive1Job 14,00s -
10.000 UpdateMassive2Job 0,14s 100x
100.000 UpdateMassive1Job (2m 36s) 156,00s -
100.000 UpdateMassive2Job 1,00s 156x
1.000.000 UpdateMassive1Job (26m 10s) 1570,00s -
1.000.000 UpdateMassive2Job 15,00s 104x

Grupo 2:

Atualizar um campo ou mais, mas o valor é o diferente para cada registro:

Update3Job

update transactions
set date='2023-04-01',
    value=10
where id = 1;

update transactions
set date='2023-04-02',
    value=20
where id = 2;

update transactions
set date='2023-04-03',
    value=30
where id = 3;

Update4Job

update transactions
set date = case id when 1 then '2023-04-01'::date
     when 2 then '2023-04-02'::date 
     when 3 then '2023-04-03'::date
end
,
    value = case id when 1 then 10
     when 2 then 20 
     when 3 then 30
end
where id in (1, 2, 3);

Update5Job

update transactions as t
set date  = v.date,
    value = v.value from (
      values (1, '2023-04-01'::date, 10),
             (2, '2023-04-02'::date, 20),
             (3, '2023-04-03'::date, 30)
    ) as v(id, date, value)
where t.id = v.id;

Result

quantity method time seconds performance
1.000 UpdateMassive3Job 1,00s -
1.000 UpdateMassive4Job 0,08s 12x
1.000 UpdateMassive5Job 0,06s 16x
10.000 UpdateMassive3Job 14,00s -
10.000 UpdateMassive4Job 0,73s 19x
10.000 UpdateMassive5Job 0,59s 23x
100.000 UpdateMassive3Job (2m 44s) 164,00s -
100.000 UpdateMassive4Job 8,00s 20x
100.000 UpdateMassive5Job 7,00s 23x
1.000.000 UpdateMassive3Job (27m 10s) 1630,00s -
1.000.000 UpdateMassive4Job (1m 15s) 75,00s 21x
1.000.000 UpdateMassive5Job 58,00s 28x