mass insert

main
Johnathan Douglas 2023-07-17 09:59:21 -03:00
parent cd4ea422e3
commit dfb4a9a1da
34 changed files with 972 additions and 762 deletions

View File

@ -74,22 +74,34 @@ values (1001, 50, '2023-04-01'),
(1003, 70, '2023-04-03'), ....; --limit 1.000 (1003, 70, '2023-04-03'), ....; --limit 1.000
``` ```
[MassInsert1](/app/Tasks/MassInsert/MassInsert1Task.php)
### Result ### Result
| quantity | method | time seconds | performance | | quantity | method | time seconds |
|----------:|---------|-------------------:|------------:| |----------:|---------|-------------------:|
| 1.000 | Insert1 | 1,44s | - | | 100 | Insert1 | 0,016s |
| 1.000 | Insert2 | 0,09s | 16x | | 100 | Insert2 | 0,001s |
| 1.000 | Insert3 | 0,09s | 16x | | 100 | Insert3 | 0,001s |
| 10.000 | Insert1 | 14,25s | - | | 100 | Insert4 | 0,044s |
| 10.000 | Insert2 | 0,88s | 16x | | 100 | Insert5 | 0,040s |
| 10.000 | Insert3 | 0,83s | 17x | | 100 | Insert6 | 0,125s |
| 100.000 | Insert1 | (2m 38s) 158,41s | - | | 1.000 | Insert1 | 1,000s |
| 100.000 | Insert2 | `error` | `error` | | 1.000 | Insert2 | 0,09s |
| 100.000 | Insert3 | 8,25s | 19x | | 1.000 | Insert3 | 0,09s |
| 1.000.000 | Insert1 | (31m 52s) 1952,32s | - | | 1.000 | Insert4 | 0,09s |
| 1.000.000 | Insert2 | `error` | `error` | | 1.000 | Insert5 | 0,09s |
| 1.000.000 | Insert3 | (1m 35s) 95s | 20x | | 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 # Analyse Update

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -1,15 +1,15 @@
<?php <?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\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class UpdateMassive4Job implements ShouldQueue class MassUpdate1Job implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
@ -33,6 +33,6 @@ class UpdateMassive4Job implements ShouldQueue
*/ */
public function handle(): void public function handle(): void
{ {
(new UpdateMassive4Task())->handle(); (new MassUpdate1Task())->handle();
} }
} }

View File

@ -1,15 +1,15 @@
<?php <?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\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class UpdateMassive1Job implements ShouldQueue class MassUpdate2Job implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
@ -33,6 +33,6 @@ class UpdateMassive1Job implements ShouldQueue
*/ */
public function handle(): void public function handle(): void
{ {
(new UpdateMassive1Task())->handle(); (new MassUpdate2Task())->handle();
} }
} }

View File

@ -1,15 +1,15 @@
<?php <?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\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class UpdateMassive2Job implements ShouldQueue class MassUpdate3Job implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
@ -33,6 +33,6 @@ class UpdateMassive2Job implements ShouldQueue
*/ */
public function handle(): void public function handle(): void
{ {
(new UpdateMassive2Task())->handle(); (new MassUpdate3Task())->handle();
} }
} }

View File

@ -1,15 +1,15 @@
<?php <?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\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
class UpdateMassive3Job implements ShouldQueue class MassUpdate4Job implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
@ -33,6 +33,6 @@ class UpdateMassive3Job implements ShouldQueue
*/ */
public function handle(): void public function handle(): void
{ {
(new UpdateMassive3Task())->handle(); (new MassUpdate4Task())->handle();
} }
} }

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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());
}
}

View File

@ -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;
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -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,
]);
}
});
}
}

View File

@ -1,13 +1,21 @@
<?php <?php
namespace App\Tasks; namespace App\Tasks\MassUpdate\Group1;
use App\Models\Transaction; use App\Models\Transaction;
use Carbon\Carbon; 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() public function handle()
{ {
Transaction::query() Transaction::query()

View File

@ -1,12 +1,21 @@
<?php <?php
namespace App\Tasks; namespace App\Tasks\MassUpdate\Group2;
use App\Models\Transaction; use App\Models\Transaction;
use Carbon\Carbon; 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 public function handle(): void
{ {
Transaction::query() Transaction::query()

View File

@ -1,14 +1,23 @@
<?php <?php
namespace App\Tasks; namespace App\Tasks\MassUpdate\Group2;
use App\Database\UpdateMassive4; use App\Database\UpdateMassive4;
use App\Models\Transaction; use App\Models\Transaction;
use Carbon\Carbon; use Carbon\Carbon;
use Ramsey\Collection\Collection; 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 public function handle(): void
{ {
Transaction::query() Transaction::query()

View File

@ -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'),
]);
});
}
}

View File

@ -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);
});
}
}

View File

@ -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();
// }
});
}
}

View File

@ -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);
});
}
}

View File

@ -3,6 +3,7 @@
namespace Database\Factories; namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/** /**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User> * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
@ -17,6 +18,7 @@ class TransactionFactory extends Factory
public function definition(): array public function definition(): array
{ {
return [ return [
// 'id' => Str::uuid(),
'date' => fake()->dateTimeBetween('-30 days'), 'date' => fake()->dateTimeBetween('-30 days'),
'value' => fake()->numerify('####.##') 'value' => fake()->numerify('####.##')
]; ];

View File

@ -3,6 +3,7 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\Transaction; use App\Models\Transaction;
use App\Tasks\MassInsert\MassInsert3Task;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -15,289 +16,6 @@ class TransactionSeeder extends Seeder
{ {
$count = config('update-massive.items_count'); $count = config('update-massive.items_count');
$type = 3; (new MassInsert3Task())->handle($count);
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);
} }
} }