⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speed.tcl

📁 sqlite嵌入式数据库源码
💻 TCL
📖 第 1 页 / 共 2 页
字号:
## Run this Tcl script to generate the speed.html file.#set rcsid {$Id: speed.tcl,v 1.17 2005/03/12 15:55:11 drh Exp $ }source common.tclheader {SQLite Database Speed Comparison}puts {<h2>Database Speed Comparison</h2><font color="red"><b>Note:  This document is old.  It describes a speed comparison betweenan older version of SQLite against archaic versions of MySQL and PostgreSQL.Readers are invited to contribute more up-to-date speed comparisonson the <a href="http://www.sqlite.org/cvstrac/wiki">SQLite Wiki</a>.<p>The numbers here are old enough to be nearly meaningless.  Until it isupdated, use this document only as proof that SQLite is not asluggard.</b></font><h3>Executive Summary</h3><p>A series of tests were run to measure the relative performance ofSQLite 2.7.6, PostgreSQL 7.1.3, and MySQL 3.23.41.The following are generalconclusions drawn from these experiments:</p><ul><li><p>  SQLite 2.7.6 is significantly faster (sometimes as much as 10 or  20 times faster) than the default PostgreSQL 7.1.3 installation  on RedHat 7.2 for most common operations.  </p></li><li><p>  SQLite 2.7.6 is often faster (sometimes  more than twice as fast) than MySQL 3.23.41  for most common operations.</p></li><li><p>  SQLite does not execute CREATE INDEX or DROP TABLE as fast as  the other databases.  But this is not seen as a problem because  those are infrequent operations.</p></li><li><p>  SQLite works best if you group multiple operations together into  a single transaction.</p></li></ul><p>The results presented here come with the following caveats:</p><ul><li><p>  These tests did not attempt to measure multi-user performance or  optimization of complex queries involving multiple joins and subqueries.</p></li><li><p>  These tests are on a relatively small (approximately 14 megabyte) database.  They do not measure how well the database engines scale to larger problems.</p></li></ul><h3>Test Environment</h3><p>The platform used for these tests is a 1.6GHz Athlon with 1GB or memoryand an IDE disk drive.  The operating system is RedHat Linux 7.2 witha stock kernel.</p><p>The PostgreSQL and MySQL servers used were as delivered by default onRedHat 7.2.  (PostgreSQL version 7.1.3 and MySQL version 3.23.41.)No effort was made to tune these engines.  Note in particularthe the default MySQL configuration on RedHat 7.2 does not supporttransactions.  Not having to support transactions gives MySQL abig speed advantage, but SQLite is still able to hold its own on mosttests.</p><p>I am told that the default PostgreSQL configuration in RedHat 7.3is unnecessarily conservative (it is designed towork on a machine with 8MB of RAM) and that PostgreSQL couldbe made to run a lot faster with some knowledgeable configurationtuning.Matt Sergeant reports that he has tuned his PostgreSQL installationand rerun the tests shown below.  His results show thatPostgreSQL and MySQL run at about the same speed.  For Matt'sresults, visit</p><blockquote><a href="http://www.sergeant.org/sqlite_vs_pgsync.html">http://www.sergeant.org/sqlite_vs_pgsync.html</a></blockquote><p>SQLite was tested in the same configuration that it appearson the website.  It was compiled with -O6 optimization and withthe -DNDEBUG=1 switch which disables the many "assert()" statementsin the SQLite code.  The -DNDEBUG=1 compiler option roughly doublesthe speed of SQLite.</p><p>All tests are conducted on an otherwise quiescent machine.A simple Tcl script was used to generate and run all the tests.A copy of this Tcl script can be found in the SQLite source treein the file <b>tools/speedtest.tcl</b>.</p><p>The times reported on all tests represent wall-clock time in seconds.  Two separate time values are reported for SQLite.The first value is for SQLite in its default configuration withfull disk synchronization turned on.  With synchronization turnedon, SQLite executesan <b>fsync()</b> system call (or the equivalent) at key pointsto make certain that critical data has actually been written to the disk drive surface.  Synchronizationis necessary to guarantee the integrity of the database if theoperating system crashes or the computer powers down unexpectedlyin the middle of a database update.  The second time reported for SQLite iswhen synchronization is turned off.  With synchronization off,SQLite is sometimes much faster, but there is a risk that anoperating system crash or an unexpected power failure coulddamage the database.  Generally speaking, the synchronous SQLitetimes are for comparison against PostgreSQL (which is alsosynchronous) and the asynchronous SQLite times are for comparison against the asynchronous MySQL engine.</p><h3>Test 1: 1000 INSERTs</h3><blockquote>CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));<br>INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');<br>INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');<br><i>... 995 lines omitted</i><br>INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');<br>INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');<br>INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');<br></blockquote><table border=0 cellpadding=0 cellspacing=0><tr><td>PostgreSQL:</td><td align="right">&nbsp;&nbsp;&nbsp;4.373</td></tr><tr><td>MySQL:</td><td align="right">&nbsp;&nbsp;&nbsp;0.114</td></tr><tr><td>SQLite 2.7.6:</td><td align="right">&nbsp;&nbsp;&nbsp;13.061</td></tr><tr><td>SQLite 2.7.6 (nosync):</td><td align="right">&nbsp;&nbsp;&nbsp;0.223</td></tr></table><p>Because it does not have a central server to coordinate access,SQLite must close and reopen the database file, and thus invalidateits cache, for each transaction.  In this test, each SQL statementis a separate transaction so the database file must be opened and closedand the cache must be flushed 1000 times.  In spite of this, the asynchronousversion of SQLite is still nearly as fast as MySQL.  Notice how much slowerthe synchronous version is, however.  SQLite calls <b>fsync()</b> after each synchronous transaction to make sure that all data is safely onthe disk surface before continuing.  For most of the 13 seconds in thesynchronous test, SQLite was sitting idle waiting on disk I/O to complete.</p><h3>Test 2: 25000 INSERTs in a transaction</h3><blockquote>BEGIN;<br>CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));<br>INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two');<br><i>... 24997 lines omitted</i><br>INSERT INTO t2 VALUES(24999,89569,'eighty nine thousand five hundred sixty nine');<br>INSERT INTO t2 VALUES(25000,94666,'ninety four thousand six hundred sixty six');<br>COMMIT;<br></blockquote><table border=0 cellpadding=0 cellspacing=0><tr><td>PostgreSQL:</td><td align="right">&nbsp;&nbsp;&nbsp;4.900</td></tr><tr><td>MySQL:</td><td align="right">&nbsp;&nbsp;&nbsp;2.184</td></tr><tr><td>SQLite 2.7.6:</td><td align="right">&nbsp;&nbsp;&nbsp;0.914</td></tr><tr><td>SQLite 2.7.6 (nosync):</td><td align="right">&nbsp;&nbsp;&nbsp;0.757</td></tr></table><p>When all the INSERTs are put in a transaction, SQLite no longer has toclose and reopen the database or invalidate its cache between each statement.It also does nothave to do any fsync()s until the very end.  When unshackled inthis way, SQLite is much faster than either PostgreSQL and MySQL.</p><h3>Test 3: 25000 INSERTs into an indexed table</h3><blockquote>BEGIN;<br>CREATE TABLE t3(a INTEGER, b INTEGER, c VARCHAR(100));<br>CREATE INDEX i3 ON t3(c);<br><i>... 24998 lines omitted</i><br>INSERT INTO t3 VALUES(24999,88509,'eighty eight thousand five hundred nine');<br>INSERT INTO t3 VALUES(25000,84791,'eighty four thousand seven hundred ninety one');<br>COMMIT;<br></blockquote><table border=0 cellpadding=0 cellspacing=0><tr><td>PostgreSQL:</td><td align="right">&nbsp;&nbsp;&nbsp;8.175</td></tr><tr><td>MySQL:</td><td align="right">&nbsp;&nbsp;&nbsp;3.197</td></tr><tr><td>SQLite 2.7.6:</td><td align="right">&nbsp;&nbsp;&nbsp;1.555</td></tr><tr><td>SQLite 2.7.6 (nosync):</td><td align="right">&nbsp;&nbsp;&nbsp;1.402</td></tr></table><p>There were reports that SQLite did not perform as well on an indexed table.This test was recently added to disprove those rumors.  It is true thatSQLite is not as fast at creating new index entries as the other engines(see Test 6 below) but its overall speed is still better.</p><h3>Test 4: 100 SELECTs without an index</h3><blockquote>BEGIN;<br>SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b<1000;<br>SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b<1100;<br><i>... 96 lines omitted</i><br>SELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND b<10800;<br>SELECT count(*), avg(b) FROM t2 WHERE b>=9900 AND b<10900;<br>COMMIT;<br></blockquote><table border=0 cellpadding=0 cellspacing=0><tr><td>PostgreSQL:</td><td align="right">&nbsp;&nbsp;&nbsp;3.629</td></tr><tr><td>MySQL:</td><td align="right">&nbsp;&nbsp;&nbsp;2.760</td></tr><tr><td>SQLite 2.7.6:</td><td align="right">&nbsp;&nbsp;&nbsp;2.494</td></tr><tr><td>SQLite 2.7.6 (nosync):</td><td align="right">&nbsp;&nbsp;&nbsp;2.526</td></tr></table><p>This test does 100 queries on a 25000 entry table without an index,thus requiring a full table scan.   Prior versions of SQLite used tobe slower than PostgreSQL and MySQL on this test, but recent performanceenhancements have increased its speed so that it is now the fastestof the group.</p><h3>Test 5: 100 SELECTs on a string comparison</h3><blockquote>BEGIN;<br>SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%';<br>SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%';<br><i>... 96 lines omitted</i><br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -