1<?php 2/** 3 * Benchmark SQL DELETE vs SQL TRUNCATE. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup Benchmark 22 */ 23 24require_once __DIR__ . '/../includes/Benchmarker.php'; 25 26use Wikimedia\Rdbms\IDatabase; 27use Wikimedia\Rdbms\IMaintainableDatabase; 28 29/** 30 * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE. 31 * 32 * @ingroup Benchmark 33 */ 34class BenchmarkDeleteTruncate extends Benchmarker { 35 protected $defaultCount = 10; 36 37 public function __construct() { 38 parent::__construct(); 39 $this->addDescription( 'Benchmarks SQL DELETE vs SQL TRUNCATE.' ); 40 } 41 42 public function execute() { 43 $dbw = $this->getDB( DB_MASTER ); 44 45 $test = $dbw->tableName( 'test' ); 46 $dbw->query( "CREATE TABLE IF NOT EXISTS /*_*/$test ( 47 test_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, 48 text varbinary(255) NOT NULL 49);", __METHOD__ ); 50 51 $this->bench( [ 52 'Delete' => [ 53 'setup' => function () use ( $dbw ) { 54 $this->insertData( $dbw ); 55 }, 56 'function' => function () use ( $dbw ) { 57 $this->delete( $dbw ); 58 } 59 ], 60 'Truncate' => [ 61 'setup' => function () use ( $dbw ) { 62 $this->insertData( $dbw ); 63 }, 64 'function' => function () use ( $dbw ) { 65 $this->truncate( $dbw ); 66 } 67 ] 68 ] ); 69 70 $dbw->dropTable( 'test', __METHOD__ ); 71 } 72 73 /** 74 * @param IDatabase $dbw 75 * @return void 76 */ 77 private function insertData( $dbw ) { 78 $range = range( 0, 1024 ); 79 $data = []; 80 foreach ( $range as $r ) { 81 $data[] = [ 'text' => $r ]; 82 } 83 $dbw->insert( 'test', $data, __METHOD__ ); 84 } 85 86 /** 87 * @param IDatabase $dbw 88 * @return void 89 */ 90 private function delete( $dbw ) { 91 $dbw->delete( 'text', '*', __METHOD__ ); 92 } 93 94 /** 95 * @param IMaintainableDatabase $dbw 96 * @return void 97 */ 98 private function truncate( $dbw ) { 99 $test = $dbw->tableName( 'test' ); 100 $dbw->query( "TRUNCATE TABLE $test", __METHOD__ ); 101 } 102} 103 104$maintClass = BenchmarkDeleteTruncate::class; 105require_once RUN_MAINTENANCE_IF_MAIN; 106