Can someone give any insight here ? For me the main problem is the wall size that becomes stable at 387MB (+- 8% of the database, but around 70% the size of the tables it's manipulating).
And I'm stopping the active reader and calling "PRAGMA wal_checkpoint(FULL);" manually every 1000 users. It seems to me that something is not working as advertised. I'm testing sqlite3 with wall enabled and while running a program that exclusively open a database I get this on disk while doing it's work: ls -l -rw-r--r-- 1 xxxx xxxx 6185697280 Mar 23 21:34 hacker-news-items.db // 5.7GB -rw-r--r-- 1 xxxx xxxx???? 786432 Mar 23 21:34 hacker-news-items.db-shm // 786KB -rw-r--r-- 1 xxxx xxxx? 397299872 Mar 23 21:34 hacker-news-items.db-wal //387MB stable at this size To be able to compare I dumped all users and users_submitted on a separated database to measure it's total size -rw-r--r-- 1 xxxx xxxx? 562626560 Mar 23 22:26 hacker-news-items-diff.db //550MB db with all users and users_submitted ? > Wed Mar 23 2016 11:10:56 PM CET from "Domingo Alvarez Duarte" ><sqlite-mail at dev.dadbiz.es> Subject: [sqlite] SQLite with wall enabled >what's wrong > > Hello ! > > Can someone give any insight here ? > > For me the main problem is the wall size that becomes stable at 387MB (+- >8% > of the database, but around 15 times the size of the tables it's > manipulating). > > It seems to me that something is not working as advertised. > > I'm testing sqlite3 with wall enabled and while running a program that > exclusively open a database I get this on disk while doing it's work: > > ls -l > -rw-r--r-- 1 xxxx xxxx 6185697280 Mar 23 21:34 hacker-news-items.db // >5.7GB > -rw-r--r-- 1 xxxx xxxx???? 786432 Mar 23 21:34 hacker-news-items.db-shm > // 786KB > -rw-r--r-- 1 xxxx xxxx? 397299872 Mar 23 21:34 hacker-news-items.db-wal // > 387MB stable at this size > > To be able to compare I dumped all users and users_submitted on a separated > database to measure it's total size > -rw-r--r-- 1 xxxx xxxx?? 25014272 Mar 23 22:06 hacker-news-items-diff.db > //24MB db with all users and users_submitted > > The schema: > > CREATE TABLE 'users' ( > ??? 'id' INTEGER PRIMARY KEY NOT NULL, > ??? 'name' TEXT UNIQUE NOT NULL, > ??? 'delay' INTEGER DEFAULT 0, > ??? 'created' INTEGER DEFAULT 0, > ??? 'karma' INTEGER DEFAULT 0, > ??? 'about' TEXT DEFAULT '' > ); > > CREATE TABLE users_submitted(user_id integer not null, item_id integer not > null, unique(user_id, item_id)); > > Some stats about the data: > > select count(*) from users -> 389514 > > select count(*) from users_submitted -> 9381845 > > select max(length(about)) from users -> 83197 > > select count(*) from users where length(about) > 256 -> 4704 > > select count(*) from users where length(about) > 1024 -> 347 > > select count(*) from users where length(about) > 2048 -> 92 > > select count(*) from users where length(about) > 4096 -> 22 > > select count(*) from ( > select count(*) as submissions > from users_submitted > group by user_id > ) > where submissions > 10 -> 64639 > > ? > > The program (with not important parts stripped): > > > local db = SQLite3("hacker-news-items.db"); > db.exec_dml("PRAGMA synchronous =OFF;"); > db.exec_dml("PRAGMA journal_mode = WAL"); > db.exec_dml("CREATE TABLE IF NOT EXISTS sync_all_users(id integer primary > key, name varchar, sync_date timestamp default current_timestamp);"); > db.exec_dml("insert or ignore into sync_all_users(id, name) values(1, >'');"); > //only store one record all the time > > local users_update_null = SQLite3Stmt(db, "update users set name=? where > name=?"); > local users_update_stmt = SQLite3Stmt(db, "update users set delay=?, >karma=?, > about=? where name=?"); > local users_submitted_insert_stmt = SQLite3Stmt(db, "insert into > users_submitted(user_id , item_id) values(?,?)"); > local users_exist_stmt = SQLite3Stmt(db, "select id from users where > name=?"); > local sync_all_users_stmt = SQLite3Stmt(db, "update sync_all_users set > name=?, sync_date=CURRENT_TIMESTAMP where id=1;"); > > > function getUserDataAndUpdate(user_id) > { > ??? local user = getUserFromSomeWhere(user_id); > ??? if(user == "null") > ??? { > ??? ??? users_update_null.bind(1, "_null_" + user_id); > ??? ??? users_update_null.bind(2, user_id); > ??? ??? users_update_null.step(); > ??? ??? users_update_null.reset(); > ??? ??? return; > ??? } > > ??? local record = json2var(user); > ??? local rec_id = type(record) == "table" ? table_rawget(record, "id", > false) : false; > ??? if(rec_id) > ??? { > ??? ??? users_update_stmt.bind(1, table_rawget(record, "delay", 0)); > ??? ??? users_update_stmt.bind(2, table_rawget(record, "karma", 0)); > ??? ??? users_update_stmt.bind(3, table_rawget(record, "about", >null)); > ??? ??? users_update_stmt.bind(4, rec_id); > ??? ??? users_update_stmtstep(); > ??? ??? users_update_stmt.reset(); > ??? ??? > ??? ??? local user_id = db.last_row_id(); > ??? ??? > ??? ??? local submitted = table_rawget(record, "submitted", false); > ??? ??? if(submitted) > ??? ??? { > ??? ??? ??? for(local i = 0, len = submitted.len(); i < len; ++i) > ??? ??? ??? { > ??? ??? ??? ??? //print("submitted", submitted[i]); > ??? ??? ??? ??? users_submitted_insert_stmt.bind(1, user_id); > ??? ??? ??? ??? users_submitted_insert_stmt.bind(2, > submitted[i]); > ??? ??? ??? ??? users_submitted_insert_stmt.step(); > ??? ??? ??? ??? users_submitted_insert_stmt.reset(); > ??? ??? ??? } > ??? ??? } > ??? } > } > > function updateAllUsers() > { > ??? local stmt_all = db.prepare("select? name from users where name >= >? > and name not like '|_null|_%' escape '|';"); > ??? local name = db.exec_get_one("select name from sync_all_users where > id=1"); > ??? stmt_all.bind(1, name); > ??? local count = 0; > ??? //db.exec_dml("begin;"); > ??? while(stmt_all.next_row()) > ??? { > ??? ??? name = stmt_all.col(0); > ??? ??? print("Now updating user", name, count); > ??? ??? getUserDataAndUpdate(name); > ??? ??? > ??? ??? if( (++count % 1000) == 0 ) > ??? ??? { > ??? ??? ??? stmt_all.reset(); //stop the unique active reader to >do > a checkpoint > ??? ??? ??? print("Now processing", name, count); > ??? ??? ??? db.exec_dml("PRAGMA wal_checkpoint(FULL);"); > ??? ??? ??? //db.exec_dml("commit;"); > ??? ??? ??? //db.exec_dml("begin;"); > ??? ??? ??? sync_all_users_stmt.bind(1, name); > ??? ??? ??? sync_all_users_stmt.step(); > ??? ??? ??? sync_all_users_stmt.reset(); > ??? ??? ??? stmt_all.bind(1, name); > ??? ??? } > ??? } > ??? //db.exec_dml("commit;"); > ??? stmt_all.finalize(); > } > > updateAllUsers(); > > ? > > ? > > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > > ?