Igor, how about simple test? Normalized database is big and slow.
$ time ./test_norm_idx.tcl
real 32m54.978s
user 32m14.885s
sys 0m39.842s
$ time ./test_idx.tcl
real 7m19.005s
user 6m55.226s
sys 0m11.717s
$ ls -lh *db
2,1G test_idx.db
7,1G test_norm_idx.db
test_idx.tcl
=============================
#!/usr/bin/tclsh8.5
package require sqlite3
sqlite3 db [string map {.tcl .db} $argv0]
db eval {PRAGMA page_size=8192}
db eval {
create table parent(dt DATETIME, user_id INTEGER);
create index parent_dt_idx on parent(dt);
create index parent_user_id_idx on parent(user_id);
create virtual table parent_fts using fts4(childs TEXT);}
db transaction {
for {set i 1} {$i<=100000} {incr i} {
set time [clock microseconds]
set childs ""
for {set j [expr {$i*1000}]} {$j<=[expr {$i*1000+1000}]} {incr j} {
lappend childs $j
}
db eval {insert into parent(dt, user_id) values ($time, 1)}
db eval {insert into parent_fts(childs) values ($childs)}
}
}
test_norm_idx.tcl
=============================
#!/usr/bin/tclsh8.5
package require sqlite3
# test normalized
sqlite3 db [string map {.tcl .db} $argv0]
db eval {PRAGMA page_size=8192}
db eval {create table link(dt DATETIME, user_id INTEGER, parent_id
INTEGER, child_id INTEGER);
create index link_child_id_idx on link(child_id);
create index link_dt_idx on link(dt);
create index link_user_id_idx on link(user_id);}
db transaction {
for {set i 1} {$i<=100000000} {incr i} {
set time [clock microseconds]
db eval {insert into link(dt, user_id, parent_id, child_id)
values ($time, 1, $i%1000, $i)}
}
}
P.S. With versioning of all records we need some additional fields and
normalized database
is very big and very slow.
--
Best regards, Alexey Pechnikov.
http://pechnikov.tel/
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users