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
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 |
25m 6s 1506 |
1.000.000 |
Insert2 |
error |
1.000.000 |
Insert3 |
1m 27s 87 |
1.000.000 |
Insert4 |
6m 31s 391 |
1.000.000 |
Insert5 |
6m 40s 400 |
1.000.000 |
Insert6 |
20m 50s 1.250 |
Analyse Delete
php artisan app:mass-delete --count=100
php artisan queue:work --queue=default
Result
quantity |
method |
time seconds |
100 |
Delete1 |
0,303 |
100 |
Delete2 |
0,015 |
100 |
Delete3 |
0,015 |
quantity |
method |
time seconds |
1.000 |
Delete1 |
2,000 |
1.000 |
Delete2 |
0,087 |
1.000 |
Delete3 |
0,087 |
quantity |
method |
time seconds |
10.000 |
Delete1 |
27,000 |
10.000 |
Delete2 |
0,789 |
10.000 |
Delete3 |
0,795 |
quantity |
method |
time seconds |
100.000 |
Delete1 |
2m 43s 149 |
100.000 |
Delete2 |
error |
100.000 |
Delete3 |
8 |
quantity |
method |
time second |
1.000.000 |
Delete1 |
2m 29s 1506 |
1.000.000 |
Delete2 |
error |
1.000.000 |
Delete3 |
1m 27s 87 |
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 |