laravel-performance/database/seeders/TransactionSeeder.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);
}
}