mass insert
parent
cd4ea422e3
commit
dfb4a9a1da
40
README.md
40
README.md
|
@ -74,22 +74,34 @@ values (1001, 50, '2023-04-01'),
|
|||
(1003, 70, '2023-04-03'), ....; --limit 1.000
|
||||
```
|
||||
|
||||
[MassInsert1](/app/Tasks/MassInsert/MassInsert1Task.php)
|
||||
|
||||
### Result
|
||||
|
||||
| quantity | method | time seconds | performance |
|
||||
|----------:|---------|-------------------:|------------:|
|
||||
| 1.000 | Insert1 | 1,44s | - |
|
||||
| 1.000 | Insert2 | 0,09s | 16x |
|
||||
| 1.000 | Insert3 | 0,09s | 16x |
|
||||
| 10.000 | Insert1 | 14,25s | - |
|
||||
| 10.000 | Insert2 | 0,88s | 16x |
|
||||
| 10.000 | Insert3 | 0,83s | 17x |
|
||||
| 100.000 | Insert1 | (2m 38s) 158,41s | - |
|
||||
| 100.000 | Insert2 | `error` | `error` |
|
||||
| 100.000 | Insert3 | 8,25s | 19x |
|
||||
| 1.000.000 | Insert1 | (31m 52s) 1952,32s | - |
|
||||
| 1.000.000 | Insert2 | `error` | `error` |
|
||||
| 1.000.000 | Insert3 | (1m 35s) 95s | 20x |
|
||||
| quantity | method | time seconds |
|
||||
|----------:|---------|-------------------:|
|
||||
| 100 | Insert1 | 0,016s |
|
||||
| 100 | Insert2 | 0,001s |
|
||||
| 100 | Insert3 | 0,001s |
|
||||
| 100 | Insert4 | 0,044s |
|
||||
| 100 | Insert5 | 0,040s |
|
||||
| 100 | Insert6 | 0,125s |
|
||||
| 1.000 | Insert1 | 1,000s |
|
||||
| 1.000 | Insert2 | 0,09s |
|
||||
| 1.000 | Insert3 | 0,09s |
|
||||
| 1.000 | Insert4 | 0,09s |
|
||||
| 1.000 | Insert5 | 0,09s |
|
||||
| 1.000 | Insert6 | 0,09s |
|
||||
| 1.000 | Insert3 | 0,09s |
|
||||
| 10.000 | Insert1 | 14,25s |
|
||||
| 10.000 | Insert2 | 0,88s |
|
||||
| 10.000 | Insert3 | 0,83s |
|
||||
| 100.000 | Insert1 | (2m 38s) 158,41s |
|
||||
| 100.000 | Insert2 | `error` |
|
||||
| 100.000 | Insert3 | 8,25s |
|
||||
| 1.000.000 | Insert1 | (31m 52s) 1952,32s |
|
||||
| 1.000.000 | Insert2 | `error` |
|
||||
| 1.000.000 | Insert3 | (1m 35s) 95s |
|
||||
|
||||
# Analyse Update
|
||||
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Jobs\MassInsert;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Bus;
|
||||
|
||||
class MassInsertCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'app:mass-insert
|
||||
{--count=100: number of rows inserted}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'mass insert';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
$count = (int)$this->option('count');
|
||||
|
||||
Bus::chain([
|
||||
(new MassInsert\MassInsert1Job($count)),
|
||||
(new MassInsert\MassInsert2Job($count)),
|
||||
(new MassInsert\MassInsert3Job($count)),
|
||||
(new MassInsert\MassInsert4Job($count)),
|
||||
(new MassInsert\MassInsert5Job($count)),
|
||||
(new MassInsert\MassInsert6Job($count)),
|
||||
])->dispatch();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Jobs\MassUpdate\Group1;
|
||||
use App\Jobs\MassUpdate\Group2;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Bus;
|
||||
|
||||
class MassUpdateCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'app:mass-update';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'mass update';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
// $this->group1();
|
||||
$this->group2();
|
||||
}
|
||||
|
||||
private function group1(): void
|
||||
{
|
||||
Bus::chain([
|
||||
new Group1\MassUpdate1Job(),
|
||||
new Group1\MassUpdate2Job(),
|
||||
])->dispatch();
|
||||
}
|
||||
|
||||
private function group2()
|
||||
{
|
||||
Bus::chain([
|
||||
new Group2\MassUpdate3Job(),
|
||||
// new Group2\MassUpdate4Job(),
|
||||
// new Group2\MassUpdate5Job(),
|
||||
new Group2\MassUpdate6Job(),
|
||||
])->dispatch();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,109 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Jobs\UpdateMassive1Job;
|
||||
use App\Jobs\UpdateMassive2Job;
|
||||
use App\Jobs\UpdateMassive3Job;
|
||||
use App\Jobs\UpdateMassive4Job;
|
||||
use App\Jobs\UpdateMassive5Job;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Bus;
|
||||
|
||||
class UpdateMassiveCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'app:update-massive-command';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Command description';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
Bus::chain([
|
||||
/**
|
||||
* Atualiza o campo data e valor, uma transação por vez.
|
||||
* Atualizando de forma unitária com where('id', 1), where('id', 2).
|
||||
*
|
||||
* 1000 - App\Jobs\UpdateMassive1Job .......... 1s DONE
|
||||
* 10000 - App\Jobs\UpdateMassive1Job .......... 14s DONE
|
||||
* 100000 - App\Jobs\UpdateMassive1Job ....... 2m 36s DONE
|
||||
* 1000000 - App\Jobs\UpdateMassive1Job ...... 26m 10s DONE
|
||||
*/
|
||||
// new UpdateMassive1Job(),
|
||||
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas passando todos os ids das transações,
|
||||
* Atualizando com where id in(1,2,3...).
|
||||
*
|
||||
* 1000 - App\Jobs\UpdateMassive2Job ...... 19.87ms DONE
|
||||
* 10000 - App\Jobs\UpdateMassive2Job ..... 149.19ms DONE
|
||||
* 100000 - App\Jobs\UpdateMassive2Job ........... 1s DONE
|
||||
* 1000000 - App\Jobs\UpdateMassive2Job .......... 15s DONE
|
||||
*/
|
||||
// new UpdateMassive2Job(),
|
||||
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas o campo data será preenchido com um valor diferente para cada transação,
|
||||
* Atualizando de forma unitária com where('id', 1), where('id', 2).
|
||||
*
|
||||
* 1000 - App\Jobs\UpdateMassive3Job ........... 1s DONE
|
||||
* 10000 - App\Jobs\UpdateMassive3Job .......... 14s DONE
|
||||
* 100000 - App\Jobs\UpdateMassive3Job ....... 2m 44s DONE
|
||||
* 1000000 - App\Jobs\UpdateMassive3Job ...... 27m 10s DONE
|
||||
*/
|
||||
// new UpdateMassive3Job(),
|
||||
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas o campo data será preenchido com um valor diferente para cada transação,
|
||||
* Atualizando de forma multipla com UpdateMassive
|
||||
*
|
||||
* 1000 - App\Jobs\UpdateMassive4Job ..... 85.32ms DONE
|
||||
* 10000 - App\Jobs\UpdateMassive4Job .... 737.00ms DONE
|
||||
* 100000 - App\Jobs\UpdateMassive4Job .......... 8s DONE
|
||||
* 1000000 - App\Jobs\UpdateMassive4Job ...... 1m 15s DONE
|
||||
*/
|
||||
// new UpdateMassive4Job(),
|
||||
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas o campo data será preenchido com um valor diferente para cada transação,
|
||||
* Atualizando de forma multipla com UpdateMassive2
|
||||
*
|
||||
* 1000 - App\Jobs\UpdateMassive5Job ..... 64.16ms DONE
|
||||
* 10000 - App\Jobs\UpdateMassive5Job .... 590.20ms DONE
|
||||
* 100000 - App\Jobs\UpdateMassive5Job .......... 7s DONE
|
||||
* 1000000 - App\Jobs\UpdateMassive5Job ......... 58s DONE
|
||||
*/
|
||||
new UpdateMassive5Job(),
|
||||
])->dispatch();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsert;
|
||||
|
||||
use App\Tasks\MassInsert\MassInsert1Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassInsert1Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public int $count)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassInsert1Task())->handle($this->count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsert;
|
||||
|
||||
use App\Tasks\MassInsert\MassInsert1Task;
|
||||
use App\Tasks\MassInsert\MassInsert2Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassInsert2Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public int $count)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassInsert2Task())->handle($this->count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsert;
|
||||
|
||||
use App\Tasks\MassInsert\MassInsert1Task;
|
||||
use App\Tasks\MassInsert\MassInsert2Task;
|
||||
use App\Tasks\MassInsert\MassInsert3Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassInsert3Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public int $count)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassInsert3Task())->handle($this->count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsert;
|
||||
|
||||
use App\Tasks\MassInsert\MassInsert1Task;
|
||||
use App\Tasks\MassInsert\MassInsert2Task;
|
||||
use App\Tasks\MassInsert\MassInsert3Task;
|
||||
use App\Tasks\MassInsert\MassInsert4Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassInsert4Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public int $count)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassInsert4Task())->handle($this->count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsert;
|
||||
|
||||
use App\Tasks\MassInsert\MassInsert1Task;
|
||||
use App\Tasks\MassInsert\MassInsert2Task;
|
||||
use App\Tasks\MassInsert\MassInsert3Task;
|
||||
use App\Tasks\MassInsert\MassInsert4Task;
|
||||
use App\Tasks\MassInsert\MassInsert5Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassInsert5Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public int $count)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassInsert5Task())->handle($this->count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsert;
|
||||
|
||||
use App\Tasks\MassInsert\MassInsert1Task;
|
||||
use App\Tasks\MassInsert\MassInsert2Task;
|
||||
use App\Tasks\MassInsert\MassInsert3Task;
|
||||
use App\Tasks\MassInsert\MassInsert4Task;
|
||||
use App\Tasks\MassInsert\MassInsert5Task;
|
||||
use App\Tasks\MassInsert\MassInsert6Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassInsert6Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(public int $count)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassInsert6Task())->handle($this->count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassInsertRelationship;
|
||||
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class InsertMassiveRelationship1Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new InsertMassiveRelationship1Task())->handle();
|
||||
}
|
||||
}
|
|
@ -1,15 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
namespace App\Jobs\MassUpdate\Group1;
|
||||
|
||||
use App\Tasks\UpdateMassive4Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate1Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class UpdateMassive4Job implements ShouldQueue
|
||||
class MassUpdate1Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
|
@ -33,6 +33,6 @@ class UpdateMassive4Job implements ShouldQueue
|
|||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new UpdateMassive4Task())->handle();
|
||||
(new MassUpdate1Task())->handle();
|
||||
}
|
||||
}
|
|
@ -1,15 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
namespace App\Jobs\MassUpdate\Group1;
|
||||
|
||||
use App\Tasks\UpdateMassive1Task;
|
||||
use App\Tasks\MassUpdate\Group1\MassUpdate2Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class UpdateMassive1Job implements ShouldQueue
|
||||
class MassUpdate2Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
|
@ -33,6 +33,6 @@ class UpdateMassive1Job implements ShouldQueue
|
|||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new UpdateMassive1Task())->handle();
|
||||
(new MassUpdate2Task())->handle();
|
||||
}
|
||||
}
|
|
@ -1,15 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
namespace App\Jobs\MassUpdate\Group2;
|
||||
|
||||
use App\Tasks\UpdateMassive2Task;
|
||||
use App\Tasks\MassUpdate\Group2\MassUpdate3Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class UpdateMassive2Job implements ShouldQueue
|
||||
class MassUpdate3Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
|
@ -33,6 +33,6 @@ class UpdateMassive2Job implements ShouldQueue
|
|||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new UpdateMassive2Task())->handle();
|
||||
(new MassUpdate3Task())->handle();
|
||||
}
|
||||
}
|
|
@ -1,15 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
namespace App\Jobs\MassUpdate\Group2;
|
||||
|
||||
use App\Tasks\UpdateMassive3Task;
|
||||
use App\Tasks\MassUpdate\Group2\MassUpdate4Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class UpdateMassive3Job implements ShouldQueue
|
||||
class MassUpdate4Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
|
@ -33,6 +33,6 @@ class UpdateMassive3Job implements ShouldQueue
|
|||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new UpdateMassive3Task())->handle();
|
||||
(new MassUpdate4Task())->handle();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassUpdate\Group2;
|
||||
|
||||
use App\Tasks\MassUpdate\Group2\MassUpdate5Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassUpdate5Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassUpdate5Task())->handle();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs\MassUpdate\Group2;
|
||||
|
||||
use App\Tasks\MassUpdate\Group2\MassUpdate6Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MassUpdate6Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new MassUpdate6Task())->handle();
|
||||
}
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Tasks\UpdateMassive5Task;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class UpdateMassive5Job implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* The number of seconds the job can run before timing out.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $timeout = 3600; //20min
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
(new UpdateMassive5Task())->handle();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassInsert;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassInsert1Task
|
||||
{
|
||||
|
||||
/**
|
||||
* insert unit
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 1,443.86 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 14,256.24 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 158,413.75 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* - index, view materialized
|
||||
*
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* - index, view materialized
|
||||
*/
|
||||
public function handle(int $count): void
|
||||
{
|
||||
Transaction::factory($count)->create();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassInsert;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassInsert2Task
|
||||
{
|
||||
|
||||
/**
|
||||
* insert multiple
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ......... 96.11 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ........ 887.48 ms DONE
|
||||
* 100000 - SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535
|
||||
* 1000000 - SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535
|
||||
*/
|
||||
public function handle(int $count): void
|
||||
{
|
||||
$transactions = Transaction::factory($count)->make();
|
||||
Transaction::query()->insert($transactions->toArray());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassInsert;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassInsert3Task
|
||||
{
|
||||
|
||||
/**
|
||||
* insert multiple block
|
||||
*
|
||||
* insert into values ( ...), (....), ... 1000
|
||||
* commit
|
||||
*
|
||||
* insert into values ( ...), (....), ... 1000
|
||||
* commit
|
||||
*
|
||||
* insert into values ( ...), (....), ... 1000
|
||||
* commit
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 1,443.86 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 14,256.24 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 158,413.75 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* - index, view materialized
|
||||
*
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* - index, view materialized
|
||||
*/
|
||||
public function handle(int $count): void
|
||||
{
|
||||
$block = 1000;
|
||||
while ($count > 0) {
|
||||
|
||||
if ($count < $block) {
|
||||
$block = $count;
|
||||
}
|
||||
|
||||
$transactions = Transaction::factory($block)->make();
|
||||
Transaction::query()->insert($transactions->toArray());
|
||||
|
||||
|
||||
$count -= $block;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassInsert;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassInsert4Task
|
||||
{
|
||||
|
||||
/**
|
||||
* insert unit with transaction
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 391.11 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 3,741.94 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 38,605.27 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* .... 100.000
|
||||
*
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*/
|
||||
public function handle(int $count): void
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
Transaction::factory($count)->create();
|
||||
DB::commit();
|
||||
} catch (\Exception $exception) {
|
||||
DB::rollBack();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassInsert;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassInsert5Task
|
||||
{
|
||||
|
||||
/**
|
||||
* insert unit block with transaction
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 380.20 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 3,716.59 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 39,143.04 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* .... 1.000 commit
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*
|
||||
* 1001. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* 1002. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* .... 1.000 commit
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*
|
||||
*/
|
||||
public function handle(int $count): void
|
||||
{
|
||||
$block = 1000;
|
||||
while ($count > 0) {
|
||||
|
||||
if ($count < $block) {
|
||||
$block = $count;
|
||||
}
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
Transaction::factory($block)->create();
|
||||
|
||||
DB::commit();
|
||||
$count -= $block;
|
||||
} catch (\Exception $exception) {
|
||||
DB::rollBack();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassInsert;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassInsert6Task
|
||||
{
|
||||
|
||||
/**
|
||||
* insert with prepare
|
||||
*
|
||||
* PDO
|
||||
* Prepared statement insert verificar
|
||||
*
|
||||
* PREPARE transactions_plan (decimal, timestamp) AS
|
||||
* INSERT INTO transactions (value, date)
|
||||
* VALUES ($1, $2);
|
||||
*
|
||||
* EXECUTE transactions_plan(23.44, '2023-01-05 00:00:00'::timestamp);
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 1,341.07 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 13,415.95 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder ............ - ms DONE
|
||||
* 1000000 - Database\Seeders\TransactionSeeder ............ - ms DONE
|
||||
*
|
||||
* @param mixed $count
|
||||
* @return void
|
||||
*/
|
||||
public function handle(int $count): void
|
||||
{
|
||||
$sql1 = 'PREPARE transactions_plan5 (decimal, timestamp) AS INSERT INTO transactions (value, date) VALUES ($1::decimal, $2::timestamp)';
|
||||
DB::unprepared($sql1);
|
||||
|
||||
$transactions = Transaction::factory($count)->make();
|
||||
|
||||
foreach ($transactions as $transaction) {
|
||||
$sql3 = vsprintf('EXECUTE transactions_plan5 (%s, \'%s\')', [
|
||||
(float)$transaction->value,
|
||||
$transaction->date->format('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
DB::unprepared($sql3);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassUpdate\Group1;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassUpdate1Task
|
||||
{
|
||||
/**
|
||||
* Atualiza o campo data e valor, uma transação por vez.
|
||||
* Atualizando de forma unitária com where('id', 1), where('id', 2).
|
||||
*
|
||||
* 1000 .......... 1s DONE
|
||||
* 10000 .......... 14s DONE
|
||||
* 100000 ....... 2m 36s DONE
|
||||
* 1000000 ...... 26m 10s DONE
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
Transaction::query()
|
||||
->select([
|
||||
'id',
|
||||
])
|
||||
->where('id', '>', 0)
|
||||
->chunkById(1000, function ($transactions) {
|
||||
foreach ($transactions as $transaction) {
|
||||
Transaction::query()
|
||||
->where('id', '=', $transaction->id)
|
||||
->update([
|
||||
'date' => Carbon::now(),
|
||||
'value' => 1,
|
||||
]);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
|
@ -1,13 +1,21 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks;
|
||||
namespace App\Tasks\MassUpdate\Group1;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class UpdateMassive2Task
|
||||
class MassUpdate2Task
|
||||
{
|
||||
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas passando todos os ids das transações,
|
||||
* Atualizando com where id in(1,2,3...).
|
||||
*
|
||||
* 1000 ...... 19.87ms DONE
|
||||
* 10000 ..... 149.19ms DONE
|
||||
* 100000 ........... 1s DONE
|
||||
* 1000000 .......... 15s DONE
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
Transaction::query()
|
|
@ -1,12 +1,21 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks;
|
||||
namespace App\Tasks\MassUpdate\Group2;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class UpdateMassive3Task
|
||||
class MassUpdate3Task
|
||||
{
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas o campo data será preenchido com um valor diferente para cada transação,
|
||||
* Atualizando de forma unitária com where('id', 1), where('id', 2).
|
||||
*
|
||||
* 1000 ........... 1s DONE
|
||||
* 10000 .......... 14s DONE
|
||||
* 100000 ....... 2m 44s DONE
|
||||
* 1000000 ...... 27m 10s DONE
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Transaction::query()
|
|
@ -1,14 +1,23 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks;
|
||||
namespace App\Tasks\MassUpdate\Group2;
|
||||
|
||||
use App\Database\UpdateMassive4;
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Ramsey\Collection\Collection;
|
||||
|
||||
class UpdateMassive4Task
|
||||
class MassUpdate4Task
|
||||
{
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas o campo data será preenchido com um valor diferente para cada transação,
|
||||
* Atualizando de forma multipla com MassUpdate
|
||||
*
|
||||
* 1000 ..... 85.32ms DONE
|
||||
* 10000 .... 737.00ms DONE
|
||||
* 100000 .......... 8s DONE
|
||||
* 1000000 ...... 1m 15s DONE
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Transaction::query()
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassUpdate\Group2;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassUpdate5Task
|
||||
{
|
||||
/**
|
||||
* Atualiza o campo data e valor, mas o campo data será preenchido com um valor diferente para cada transação,
|
||||
* Atualizando de forma multipla com UpdateMassive2
|
||||
*
|
||||
* 1000 ..... 64.16ms DONE
|
||||
* 10000 .... 590.20ms DONE
|
||||
* 100000 .......... 7s DONE
|
||||
* 1000000 ......... 58s DONE
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Transaction::query()
|
||||
->select([
|
||||
'id',
|
||||
'date',
|
||||
'value',
|
||||
])
|
||||
->where('id', '>', 0)
|
||||
->chunkById(1000, function ($transactions) {
|
||||
|
||||
$values = [];
|
||||
/** @var Collection $transactions */
|
||||
foreach ($transactions as $transaction) {
|
||||
$transaction->date = Carbon::now()->subDays(random_int(1, 3));
|
||||
$transaction->value = 10 + random_int(0, 10);
|
||||
|
||||
$values[] = [
|
||||
'id' => $transaction->id,
|
||||
'date' => $transaction->date,
|
||||
'value' => $transaction->value,
|
||||
];
|
||||
}
|
||||
|
||||
DB::table('transactions as t')
|
||||
->joinFrom($values, 'm', DB::raw('m.id::bigint'), '=', 't.id')
|
||||
->updateFrom([
|
||||
'value' => DB::raw('m.value::decimal'),
|
||||
'date' => DB::raw('m.date::timestamp'),
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks\MassUpdate\Group2;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MassUpdate6Task
|
||||
{
|
||||
/**
|
||||
*
|
||||
* 1000 ........... 7s DONE
|
||||
* 10000 ......... - DONE
|
||||
* 100000 ......... . - DONE
|
||||
* 1000000 .......... - DONE
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Transaction::query()
|
||||
->select([
|
||||
'id',
|
||||
'date',
|
||||
'value',
|
||||
])
|
||||
->where('id', '>', 0)
|
||||
->chunkById(1000, function ($transactions) {
|
||||
|
||||
$items = [];
|
||||
/** @var Collection $transactions */
|
||||
foreach ($transactions as $transaction) {
|
||||
$transaction->date = Carbon::now()->subDays(random_int(1, 3));
|
||||
$transaction->value = 10 + random_int(0, 10);
|
||||
|
||||
$items[] = [
|
||||
'id' => $transaction->id,
|
||||
'date' => $transaction->date,
|
||||
'value' => $transaction->value,
|
||||
];
|
||||
}
|
||||
|
||||
$withs = [];
|
||||
$unions = [];
|
||||
foreach ($items as $key => $item) {
|
||||
$withs[] = vsprintf('u%s as (update transactions set value = %s where id = %s returning null)', [
|
||||
$key,
|
||||
$item['value'],
|
||||
$item['id'],
|
||||
]);
|
||||
|
||||
$unions[] = vsprintf('u%s', [
|
||||
$key
|
||||
]);
|
||||
}
|
||||
|
||||
$withs = implode(', ', $withs);
|
||||
$unions = implode(', ', $unions);
|
||||
|
||||
$sql = "with $withs, uall as (select * from $unions) select * from uall";
|
||||
|
||||
DB::statement($sql);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class UpdateMassive1Task
|
||||
{
|
||||
|
||||
public function handle()
|
||||
{
|
||||
|
||||
Transaction::query()
|
||||
->select([
|
||||
'id',
|
||||
])
|
||||
->where('id', '>', 0)
|
||||
->chunkById(1000, function ($transactions) {
|
||||
|
||||
// DB::beginTransaction();
|
||||
// try {
|
||||
foreach ($transactions as $transaction) {
|
||||
Transaction::query()
|
||||
->where('id', '=', $transaction->id)
|
||||
->update([
|
||||
'date' => Carbon::now(),
|
||||
'value' => 1,
|
||||
]);
|
||||
}
|
||||
DB::commit();
|
||||
// } catch (\Exception $exception) {
|
||||
// DB::rollBack();
|
||||
// }
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
}
|
|
@ -1,254 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Tasks;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class UpdateMassive5Task
|
||||
{
|
||||
public function handle(): void
|
||||
{
|
||||
Transaction::query()
|
||||
->select([
|
||||
'id',
|
||||
'date',
|
||||
'value',
|
||||
])
|
||||
->where('id', '>', 0)
|
||||
->chunkById(1000, function ($transactions) {
|
||||
|
||||
$values = [];
|
||||
/** @var Collection $transactions */
|
||||
foreach ($transactions as $transaction) {
|
||||
$transaction->date = Carbon::now()->subDays(random_int(1, 3));
|
||||
$transaction->value = 10 + random_int(0, 10);
|
||||
|
||||
// $values[] = [
|
||||
// 'primary_key' => $transaction->id,
|
||||
// 'columns' => [
|
||||
// 'date' => "'$transaction->date'::timestamp",
|
||||
// 'value' => $transaction->value,
|
||||
// ]
|
||||
// ];
|
||||
|
||||
$values[] = [
|
||||
'id' => $transaction->id,
|
||||
'date' => $transaction->date,
|
||||
'value' => $transaction->value,
|
||||
];
|
||||
}
|
||||
|
||||
// $values = [
|
||||
// [
|
||||
// 'id' => 1,
|
||||
// 'date' => Carbon::now(),
|
||||
// 'value' => 10,
|
||||
// ],
|
||||
// [
|
||||
// 'id' => 2,
|
||||
// 'date' => '2023-01-02',
|
||||
// 'value' => 20,
|
||||
//// 'value' => DB::raw('t.value + 1'),
|
||||
// ]
|
||||
// ];
|
||||
//
|
||||
// $values = [
|
||||
//// [
|
||||
//// 'id' => DB::raw('1::int8'),
|
||||
//// 'date' => DB::raw('\'' . Carbon::now()->format('Y-m-d H:i:s') . '\'::timestamp'),
|
||||
//// 'value' => DB::raw('10::numeric'),
|
||||
//// ],
|
||||
// [
|
||||
// 'id' => 2,
|
||||
// 'date' => '2023-01-02',
|
||||
// 'value' => 20,
|
||||
//// 'value' => DB::raw('t.value + 1'),
|
||||
// ]
|
||||
// ];
|
||||
|
||||
|
||||
DB::enableQueryLog();
|
||||
|
||||
// DB::table('transactions')
|
||||
// ->insert($values);
|
||||
|
||||
$values = [
|
||||
[
|
||||
'id' => 1,
|
||||
'value' => 20,
|
||||
// 'day' => 2,
|
||||
],
|
||||
[
|
||||
'id' => 2,
|
||||
'value' => 30,
|
||||
// 'day' => 5,
|
||||
],
|
||||
[
|
||||
'value' => 30,
|
||||
'id' => 3,
|
||||
// 'day' => 3,
|
||||
|
||||
],
|
||||
];
|
||||
|
||||
|
||||
DB::table('transactions as t')
|
||||
->joinFrom($values, 'm', DB::raw('m.id::bigint'), '=', 't.id')
|
||||
->updateFrom([
|
||||
'value' => DB::raw('m.value::decimal'),
|
||||
]);
|
||||
|
||||
|
||||
DB::table('transactions as t')
|
||||
->massUpdate([
|
||||
[
|
||||
'id' => 1,
|
||||
'value' => DB::raw('20::float'),
|
||||
'date' => '2023-01-01',
|
||||
],
|
||||
[
|
||||
'id' => 2,
|
||||
'value' => 30,
|
||||
'date' => '2023-01-01',
|
||||
],
|
||||
[
|
||||
'id' => 1,
|
||||
'value' => 30,
|
||||
'date' => '2023-01-01',
|
||||
],
|
||||
], 'id');
|
||||
|
||||
|
||||
// $properties = array_keys($values[0]);
|
||||
// $x = [];
|
||||
// $propertiesCount = count($properties);
|
||||
// foreach ($values as $item) {
|
||||
// foreach ($properties as $property) {
|
||||
// if (count(array_keys($item)) !== $propertiesCount) {
|
||||
// throw new \Exception('a quantidade de propriedades é diferente');
|
||||
// }
|
||||
//
|
||||
// $x [] = $item[$property];
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//// dd($x);
|
||||
//// DB::table('transactions as t')
|
||||
//// ->massUpdate($values, $uniqueKeys = ['id', 'value'], );
|
||||
//
|
||||
// DB::table('transaction as t')
|
||||
// ->whereIn('id', [1,2,3])
|
||||
// ->update([
|
||||
// 'value'=> DB::raw('value + (case id when 1 then 2.0 when 2 then 5.0 when 3 then 2.32 end)')
|
||||
// ]);
|
||||
|
||||
|
||||
// $table = DB::raw('(values (?, ?), (?, ?), (?, ?)) as "m" (' . implode(', ', $properties) . ')');
|
||||
|
||||
DB::enableQueryLog();
|
||||
DB::table('transactions as t')
|
||||
// ->join($table, DB::raw('m.id::bigint'), '=', 't.id')
|
||||
// ->addBinding($x)
|
||||
->joinFrom($values, 'm', DB::raw('m.id::bigint'), '=', 't.id')
|
||||
// ->where('t.date', '>', Carbon::now()->subDays(5))
|
||||
->updateFrom([
|
||||
// "value" => DB::raw('t.value + "m"."value"::decimal'),
|
||||
// "date" => DB::raw('(t.date::timestamp + (interval \'1\' day * m.day::int))'),
|
||||
"value" => DB::raw('m.value::decimal'),
|
||||
]);
|
||||
|
||||
dd(DB::getQueryLog());
|
||||
dd('aa');
|
||||
|
||||
// t.value = m.value + 1;
|
||||
// t.value = m.value + 1;
|
||||
|
||||
|
||||
DB::table('transactions as t')
|
||||
->joinFrom($values, 'm', DB::raw('m.id::bigint'), '=', 't.id')
|
||||
->updateFrom([
|
||||
'value' => DB::raw('m.value::decimal'),
|
||||
]);
|
||||
dd(DB::getQueryLog());
|
||||
|
||||
$values = [
|
||||
[
|
||||
'id' => 1,
|
||||
'date' => Carbon::now(),
|
||||
'value' => 20,
|
||||
],
|
||||
[
|
||||
'id' => 2,
|
||||
'date' => '2023-01-02',
|
||||
'value' => 30,
|
||||
],
|
||||
];
|
||||
|
||||
|
||||
DB::table('transactions as t')
|
||||
->joinFrom($values, 'm', DB::raw('m.id::bigint'), '=', 't.id')
|
||||
->updateFrom([
|
||||
'value' => DB::raw('(m.value::decimal + 1)::decimal'),
|
||||
'date' => DB::raw('m.date::timestamp'),
|
||||
'type' => 2,
|
||||
'status' => DB::raw('case t.id when 1 then \'paid\' else t.status end'),
|
||||
]);
|
||||
|
||||
|
||||
// DB::table('transactions as t')
|
||||
// ->join(DB::raw('(values (1,\'2019-01-15 10:00:00\',10), (2,\'2019-01-15 10:00:00\', 20) ) as mu (id, value, date)'), 'mu.id', '=', 't.id')
|
||||
// ->updateFrom([
|
||||
// 'value' => DB::raw('(mu.value::decimal + 1)::decimal'),
|
||||
// 'date' => DB::raw('mu.date::timestamp'),
|
||||
// 'type' => 2,
|
||||
// 'status' => DB::raw('case t.id when 1 then \'paid\' else t.status end'),
|
||||
// ]);
|
||||
|
||||
dd(DB::getQueryLog());
|
||||
dd('aa');
|
||||
// DB::table('transactions as t')
|
||||
// ->massUpdateWithFrom(
|
||||
// values: [
|
||||
// [
|
||||
// 'id' => 1,
|
||||
// 'date' => Carbon::now(),
|
||||
// 'value' => 10,
|
||||
// ]
|
||||
// ],
|
||||
//// valuesAlias: 'mu',
|
||||
//// updateColumns: [
|
||||
//// 'date' => 'mu.date::timestamp',
|
||||
//// 'value' => 'mu.value + 1',
|
||||
//// 'type' => '2',
|
||||
//// 'fee' => '(t.value / mu.value) * 0.1',
|
||||
//// ]
|
||||
// );
|
||||
|
||||
// $queryLog = DB::getQueryLog();
|
||||
//
|
||||
// $sql = $queryLog[1]['query'];
|
||||
// $bindings = $queryLog[1]['bindings'];
|
||||
//
|
||||
// foreach ($bindings as $i => $binding) {
|
||||
// if ($binding instanceof \DateTimeInterface) {
|
||||
// $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
|
||||
// } else {
|
||||
// $bindings[$i] = "'$binding'";
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// $sql = vsprintf(str_replace('?', '%s', $sql), $bindings);
|
||||
//
|
||||
// dd($sql);
|
||||
|
||||
//
|
||||
// dd('aa');
|
||||
// $updateMassive2 = new UpdateMassive5();
|
||||
// $updateMassive2->apply('transactions', 'id', $values);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
|
||||
|
@ -17,6 +18,7 @@ class TransactionFactory extends Factory
|
|||
public function definition(): array
|
||||
{
|
||||
return [
|
||||
// 'id' => Str::uuid(),
|
||||
'date' => fake()->dateTimeBetween('-30 days'),
|
||||
'value' => fake()->numerify('####.##')
|
||||
];
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use App\Tasks\MassInsert\MassInsert3Task;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
|
@ -15,289 +16,6 @@ class TransactionSeeder extends Seeder
|
|||
{
|
||||
$count = config('update-massive.items_count');
|
||||
|
||||
$type = 3;
|
||||
|
||||
if ($type === 1) {
|
||||
$this->type1($count);
|
||||
}
|
||||
|
||||
if ($type === 2) {
|
||||
$this->type2($count);
|
||||
}
|
||||
|
||||
if ($type === 3) {
|
||||
$this->type3($count);
|
||||
}
|
||||
|
||||
if ($type === 4) {
|
||||
$this->type4($count);
|
||||
}
|
||||
|
||||
if ($type === 5) {
|
||||
$this->type5($count);
|
||||
}
|
||||
|
||||
if ($type === 6) {
|
||||
$this->type6($count);
|
||||
}
|
||||
|
||||
if ($type === 7) {
|
||||
$this->type7($count);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $count
|
||||
* @return void
|
||||
*/
|
||||
public function type1(mixed $count): void
|
||||
{
|
||||
/**
|
||||
* insert unit
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 1,443.86 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 14,256.24 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 158,413.75 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*/
|
||||
// DB::enableQueryLog();
|
||||
Transaction::factory($count)->create();
|
||||
// dd(DB::getQueryLog());
|
||||
|
||||
// $result = DB::getQueryLog();
|
||||
// dump(collect($result)->sum('time'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $count
|
||||
*/
|
||||
public function type2(mixed $count): void
|
||||
{
|
||||
/**
|
||||
* insert multiple
|
||||
* 1000 - Database\Seeders\TransactionSeeder ......... 96.11 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ........ 887.48 ms DONE
|
||||
* 100000 - SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535
|
||||
* 1000000 - SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535
|
||||
*/
|
||||
$transactions = Transaction::factory($count)->make();
|
||||
Transaction::query()->insert($transactions->toArray());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Limit insert sql string
|
||||
* insert multiple block
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ......... 97.71 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ........ 833.27 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder ...... 8,256.29 ms DONE
|
||||
* 1000000 - Database\Seeders\TransactionSeeder ..... 95,473.46 ms DONE
|
||||
*/
|
||||
private function type3(mixed $count)
|
||||
{
|
||||
|
||||
$block = 1000;
|
||||
while ($count > 0) {
|
||||
|
||||
if ($count < $block) {
|
||||
$block = $count;
|
||||
}
|
||||
|
||||
$transactions = Transaction::factory($block)->make();
|
||||
Transaction::query()->insert($transactions->toArray());
|
||||
// insert into values ( ...), (....), ... 1000
|
||||
// commit
|
||||
|
||||
// insert into values ( ...), (....), ... 1000
|
||||
// commit
|
||||
|
||||
// insert into values ( ...), (....), ... 1000
|
||||
// commit
|
||||
|
||||
$count -= $block;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* insert unit
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 391.11 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 3,741.94 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 38,605.27 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* .... 100.000
|
||||
*
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*/
|
||||
private function type4(int $count)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
Transaction::factory($count)->create();
|
||||
DB::commit();
|
||||
} catch (\Exception $exception) {
|
||||
DB::rollBack();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* insert unit
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 380.20 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 3,716.59 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder .... 39,143.04 ms DONE
|
||||
* 1000000 -
|
||||
*
|
||||
* 1. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* 2. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* .... 1.000 commit
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*
|
||||
* 1001. insert into transactions (id, value, date) values (1, 10, '2023-04-01');
|
||||
* 1002. insert into transactions (id, value, date) values (2, 20, '2023-04-02');
|
||||
* .... 1.000 commit
|
||||
* - reconstroi os indices, verifica chave, view materializada
|
||||
*
|
||||
*/
|
||||
private function type5(mixed $count)
|
||||
{
|
||||
$block = 1000;
|
||||
while ($count > 0) {
|
||||
|
||||
if ($count < $block) {
|
||||
$block = $count;
|
||||
}
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
Transaction::factory($block)->create();
|
||||
|
||||
DB::commit();
|
||||
// echo 'commit' . PHP_EOL;
|
||||
$count -= $block;
|
||||
} catch (\Exception $exception) {
|
||||
DB::rollBack();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* PDO
|
||||
* Prepared statement insert verificar
|
||||
*
|
||||
* PREPARE transactions_plan (decimal, timestamp) AS
|
||||
* INSERT INTO transactions (value, date)
|
||||
* VALUES ($1, $2);
|
||||
*
|
||||
* EXECUTE transactions_plan(23.44, '2023-01-05 00:00:00'::timestamp);
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ...... 1,341.07 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ..... 13,415.95 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder ............ - ms DONE
|
||||
* 1000000 - Database\Seeders\TransactionSeeder ............ - ms DONE
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ........ 173.91 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ...... 1,591.86 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder ......16,331.67 ms DONE
|
||||
* 1000000 - Database\Seeders\TransactionSeeder ............ - ms DONE
|
||||
*
|
||||
* @param mixed $count
|
||||
* @return void
|
||||
*/
|
||||
private function type6(mixed $count)
|
||||
{
|
||||
// DB::enableQueryLog();
|
||||
|
||||
// DB::beginTransaction();
|
||||
//
|
||||
// try {
|
||||
|
||||
// DB::enableQueryLog();
|
||||
|
||||
$sql1 = 'PREPARE transactions_plan5 (decimal, timestamp) AS INSERT INTO transactions (value, date) VALUES ($1::decimal, $2::timestamp)';
|
||||
DB::unprepared($sql1);
|
||||
|
||||
$transactions = Transaction::factory($count)->make();
|
||||
|
||||
// $sql2 = 'EXECUTE transactions_plan5 (?, ?)';
|
||||
|
||||
foreach ($transactions as $transaction) {
|
||||
$sql3 = vsprintf('EXECUTE transactions_plan5 (%s, \'%s\')', [
|
||||
(float)$transaction->value,
|
||||
$transaction->date->format('Y-m-d H:i:s')
|
||||
]);
|
||||
DB::unprepared($sql3);
|
||||
|
||||
// $dateFormatted = $transaction->date->format('Y-m-d H:i:s');
|
||||
// $bindings = [
|
||||
// (float)$transaction->value,
|
||||
// $dateFormatted,
|
||||
// ];
|
||||
|
||||
// DB::statement($sql2, $bindings);
|
||||
}
|
||||
|
||||
// dd(DB::getQueryLog());
|
||||
// DB::commit();
|
||||
// } catch (\Exception $exception) {
|
||||
// DB::rollBack();
|
||||
// }
|
||||
|
||||
// $result = DB::getQueryLog();
|
||||
// dump(collect($result)->sum('time'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Limit insert sql string
|
||||
* insert multiple block
|
||||
*
|
||||
* 1000 - Database\Seeders\TransactionSeeder ......... 97.71 ms DONE
|
||||
* 10000 - Database\Seeders\TransactionSeeder ........ 858.70 ms DONE
|
||||
* 100000 - Database\Seeders\TransactionSeeder ...... 8,819.44 ms DONE
|
||||
* 1000000 - Database\Seeders\TransactionSeeder ..... 87,649.37 ms DONE
|
||||
*/
|
||||
private function type7(mixed $count)
|
||||
{
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
$block = 1000;
|
||||
while ($count > 0) {
|
||||
|
||||
if ($count < $block) {
|
||||
$block = $count;
|
||||
}
|
||||
|
||||
$transactions = Transaction::factory($block)->make();
|
||||
Transaction::query()->insert($transactions->toArray());
|
||||
|
||||
// insert into values ( ...), (....), ... 1000
|
||||
// insert into values ( ...), (....), ... 1000
|
||||
// insert into values ( ...), (....), ... 1000
|
||||
|
||||
$count -= $block;
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
// commit
|
||||
} catch (\Exception $exception) {
|
||||
DB::rollBack();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private function champion($count)
|
||||
{
|
||||
$this->type3($count);
|
||||
(new MassInsert3Task())->handle($count);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue