# Install create database `example-update-massive` configure `.env` ```dotenv 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; ```shell php artisan migrate:fresh --seed ``` # Analyse Insert ```shell php artisan app:mass-insert --count=100 php artisan queue:work --queue=default ``` [MassInsert1](https://gitea.nteia.com/johdougss/example-update-massive/src/branch/main/app/Tasks/MassInsert/MassInsert1Task.php), [MassInsert2](https://gitea.nteia.com/johdougss/example-update-massive/src/branch/main/app/Tasks/MassInsert/MassInsert2Task.php), [MassInsert3](https://gitea.nteia.com/johdougss/example-update-massive/src/branch/main/app/Tasks/MassInsert/MassInsert3Task.php), [MassInsert4](https://gitea.nteia.com/johdougss/example-update-massive/src/branch/main/app/Tasks/MassInsert/MassInsert4Task.php), [MassInsert5](https://gitea.nteia.com/johdougss/example-update-massive/src/branch/main/app/Tasks/MassInsert/MassInsert5Task.php), [MassInsert6](https://gitea.nteia.com/johdougss/example-update-massive/src/branch/main/app/Tasks/MassInsert/MassInsert6Task.php) ### 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` ```sql 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` ```sql 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` ```sql 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` ```sql 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` ```sql 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 |