laravel-performance/README.md

3.1 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

Result

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, . . .);
quantity method time seconds
1.000 UpdateMassive1Job 1,00s
1.000 UpdateMassive2Job 0,01s
10.000 UpdateMassive1Job 14,00s
10.000 UpdateMassive2Job 0,14s
100.000 UpdateMassive1Job (2m 36s) 156,00s
100.000 UpdateMassive2Job 1,00s
1.000.000 UpdateMassive1Job (26m 10s) 1570,00s
1.000.000 UpdateMassive2Job 15,00s

Grupo 2:

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

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;
quantity method time seconds
1.000 UpdateMassive3Job 1,00s
1.000 UpdateMassive4Job 0,08s
1.000 UpdateMassive5Job 0,06s
10.000 UpdateMassive3Job 14,00s
10.000 UpdateMassive4Job 0,73s
10.000 UpdateMassive5Job 0,59s
100.000 UpdateMassive3Job (2m 44s) 164,00s
100.000 UpdateMassive4Job 8,00s
100.000 UpdateMassive5Job 7,00s
1.000.000 UpdateMassive3Job (27m 10s) 1630,00s
1.000.000 UpdateMassive4Job (1m 15s) 75,00s
1.000.000 UpdateMassive5Job 58,00s