Ah! I found my fault in the test code. The delete performance was measured incorrectly, so I re-examed the performance. It still shows outstanding performance compared to insert performance, but it is a reasonable gap.
[Cache: 1MB ] Delete 1000recs/3000recs : 2.6 secs . Insert 2000recs : 17secs . [Cache: 100KB] Delete 1000recs/3000recs : 10.8 secs . Insert 2000recs : 28secs . On 6/22/06, Insun Kang <[EMAIL PROTECTED]> wrote:
Hi guys. Thank all of you for reply. I think I need to inform more details about my test-bed to you. The machine is iPAQ h5550 (CPU speed is about 400MHz). Cache size = 500 pages * 2KB = 1MB Cache size = 50 pages * 2KB = 100KB Cache size = 25 pages * 2KB = 50KB The test code is written in c code and the flow is like this. - The data table has 11 columns and 5 single-column indices and 5 multi-column indices. - insert 3000 recs within a single transaction. (begin / insert 3000 recs / commit) INSERT INTO MDS VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11) * I use sqlite3_prepare() and sqlite3_bind_xxx() functions. The data bind time can be ignored because all data to be binded are already loaded in memory before the transaction begins. - delete 1000 recs among 3000 recs within a single transaction (begin / delete 1000 recs / commit ) DELETE FROM T WHERE eleven LIKE :1 * I do not think sqlite3 uses drop & rebuild scheme for this SQL statement. One possible scheme that I guess is sqlite3 removes recs only from data table not from all indices. (lazy update for indices) But I am not certain. Any ideas? Thank you in advance. ------------------------------------------- <create table & index> create table T ( one text NOT NULL, two text, tree int, four text, five int, six int NOT NULL, seven int, eight int, nine int, ten int UNIQUE, eleven text ) create index i1 ~ i5 (single column indices) create index mi1 ~ mi5 (multi column indices : consists of 2 or 3 columns) On 6/22/06, Dennis Cote <[EMAIL PROTECTED]> wrote: > Insun Kang wrote: > > Hi. > > > > I tested big deletes performance and big insert performance on a > > Windows CE > > device in various cache size configurations. > > ( 1MB, 100KB, 50KB ) > > > > Insert 3000 records performs within 23sec, 43sec and 61sec, with > > respect to > > each cache size configuration. > > However, delete 1000 records among 3000 records performs within about > > 0.4secs for all cache size configurations. > > > > Why does delete operation outperform insert operation? and how come the > > delete operation is independent of cache size? > > I think the updating indices costs are almost same in both insert and > > delete > > operations. > > Can anybody explain the reason? > > > Insun, > > I think that you must be doing your inserts as 3000 separate > transactions. Try wrapping the inserts with a pair of "begin > transaction"/"commit transaction" commands. > > I just wrote a test script to try doing something similar to what you > described using the sqlite3 shell. I get times of 8 seconds for 64K + > 128K inserts with one preexisting index, and 4 seconds to delete the > first 64K records from that table. The script is: > > create table t1(a integer, b text); > create table t2(a integer, b text); > create table t3(a integer, b text); > create table times( > id integer primary key, > t timestamp default current_time > ); > > -- create 64K records in t1 > begin; > insert into t1 values( random(), 'test'); > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > insert into t1 select random(), b from t1; > > -- create 128K records in t2 > insert into t2 select random(), b from t1; > insert into t2 select random(), b from t1; > commit; > > -- index the random numbers > create index t3_a on t3(a); > > -- insert all records into t3 with an index in one transaction > insert into times(id) values(1); > insert into t3 > select * from t1 > union > select * from t2; > insert into times(id) values(2); > > -- delete one third of records from t1 > insert into times(id) values(3); > delete from t3 where a in (select a from t1); > insert into times(id) values(4); > > -- display times > select 'inserts: ' || > round(86400 * > (julianday((select t from times where id = 2)) > - julianday((select t from times where id = 1)) > ), 0) || ' seconds'; > select 'deletes: ' || > round(86400 * > (julianday((select t from times where id = 4)) > - julianday((select t from times where id = 3)) > ), 0) || ' seconds'; > > This script produces the following results. > > C:\Documents and Settings\DennisC>sqlite3 test.db3 <test.sql > inserts: 8.0 seconds > deletes: 4.0 seconds > > Note that my inserts into t3 all happen in one transaction. These rows > all contain a random integer value and are indexed on that value. > > I'm inserting around 24K records per second, and deleting around 16K > records per second. This is compared to you rates of about 49 inserts > per second (with a 50KB cache size), and 2.5K deletes per second. I > suspect that with a transaction around your inserts you will also see an > insert rate around 3K records per second. > > HTH > Dennis Cote > > > -- Insun Kang
-- Insun Kang