Em 04/09/2015 17:09, "Domingo Alvarez Duarte" <sqlite-mail at dev.dadbiz.es> escreveu: > > Hello ! > > This is my first test with json and index expressions ! > > How to make usage of the expression index on queries ? > > Why is json_extract so slow ?
Just for information Is json_extract from https://github.com/groner/sqlite-json ? Luiz > > Cheers ! > > ________Output > > Time to insert 5000 0.032227 records by second = > 155149 > count= 4999 > json= the_value_1 > 0 0 0 SCAN TABLE json_tbl > Time to select raw 5000 0.00244 records by second = > 2.04918e+06 > Time to select json_extrat no index 5000 8.12196 records by > second = 615.615 > Time to create index 5000 0.00605 records by second = > 826446 > 0 0 0 SCAN TABLE json_tbl > Time to select json_extrat indexed 5000 7.38144 records by > second = 677.375 > > ________ > > > > ________Program > > local max_count = 5000; > local sql = "CREATE TABLE IF NOT EXISTS json_tbl(id integer primary key, json > text collate nocase);"; > > local db = SQLite3(":memory:"); > db.exec_dml(sql); > > local stmt = db.prepare("insert into json_tbl(json) values(?);"); > > local start = os.clock(); > > db.exec_dml("begin;"); > for(local i=1; i < max_count; ++i) > { > stmt.bind(1, format([==[{"id" : %d, "value" : "the_value_%d"}]==], i, > i)); > stmt.step(); > stmt.reset(); > } > stmt.finalize(); > db.exec_dml("commit;"); > > local time_spent = os.clock() -start; > print("Time to insert", max_count, time_spent, "records by second = ", > max_count/time_spent); > > > print("count=", db.exec_get_one("select count(*) from json_tbl")); > print("json=", db.exec_get_one("select json_extract(json, '$.value') AS val > from json_tbl where val = 'the_value_1';")); > > sql = "select json_extract(json, '$.value') AS val from json_tbl where > val = ?;"; > > local showPlan = function() > { > stmt = db.prepare("explain query plan " + sql); > while(stmt.next_row()) > { > local line = ""; > for(local i=0, len = stmt.col_count(); i < len; ++i) > { > line += "\t" + stmt.col(i); > } > print(line); > } > stmt.finalize(); > } > > showPlan(); > > start = os.clock(); > stmt = db.prepare("select * from json_tbl"); > while(stmt.next_row()) > { > } > stmt.finalize(); > > time_spent = os.clock() -start; > print("Time to select raw", max_count, time_spent, "records by second = ", > max_count/time_spent); > > start = os.clock(); > stmt = db.prepare(sql); > for(local i=1; i < max_count; ++i) > { > stmt.bind(1, format("the_value_%d", i)); > stmt.step(); > //print(stmt.col(0)); > stmt.reset(); > } > stmt.finalize(); > > time_spent = os.clock() -start; > print("Time to select json_extrat no index", max_count, time_spent, "records > by second = ", max_count/time_spent); > > start = os.clock(); > db.exec_dml("create index json_tbl_idx on json_tbl(json_extract(json, > '$.value'));"); > time_spent = os.clock() -start; > print("Time to create index", max_count, time_spent, "records by second = ", > max_count/time_spent); > > showPlan(); > > start = os.clock(); > stmt = db.prepare(sql); > for(local i=1; i < max_count; ++i) > { > stmt.bind(1, format("the_value_%d", i)); > stmt.step(); > //print(stmt.col(0)); > stmt.reset(); > } > stmt.finalize(); > > time_spent = os.clock() -start; > print("Time to select json_extrat indexed", max_count, time_spent, "records > by second = ", max_count/time_spent); > > db.close(); > > ________ > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users