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