304 lines
8.8 KiB
PHP
304 lines
8.8 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use App\Models\Transaction;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class TransactionSeeder extends Seeder
|
|
{
|
|
/**
|
|
* Seed the application's database.
|
|
*/
|
|
public function run(): void
|
|
{
|
|
$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);
|
|
}
|
|
}
|