甚至与索引连接也很慢

时间:2012-10-31 11:41:18

标签: android sqlite

我创建了3个表,如:

db.execSQL("CREATE TABLE IF NOT EXISTS programs (id_program INTEGER PRIMARY KEY    AUTOINCREMENT , id_channel TEXT  , nom_prgrm TEXT  , debut TEXT , fin TEXT , FOREIGN KEY(id_channel) REFERENCES channels(id_channel)) ");
db.execSQL("CREATE INDEX __program_index ON programs(nom_prgrm)"); 
db.execSQL("CREATE TABLE IF NOT EXISTS categories (id_categorie INTEGER PRIMARY KEY  AUTOINCREMENT, nom_categorie TEXT)");
db.execSQL("CREATE UNIQUE INDEX __categorie_index ON   categories(nom_categorie,id_categorie)"); 
db.execSQL("CREATE TABLE IF NOT EXISTS categories_programs (id_categorie INTEGER REFERENCES categories(id_categorie) ,id_program INTEGER REFERENCES programs(id_program), PRIMARY KEY(id_categorie,id_program))");

程序表包含alomost 2500条记录和类别150,因此链接表有3400 rec

当我执行此查询时,需要很长时间才能向我显示结果我不知道如何优化这个!!

SELECT  id_channel , nom_categorie , debut , fin , nom_prgrm FROM programs, categories_programs, categories WHERE ( (categories_programs.id_program = programs.id_program) AND (categories_programs.id_categorie = categories.id_categorie) AND  ('"+sentence+"' LIKE ('%' || nom_categorie || '%')))

可能这是导致这个问题的联接?

感谢您的帮助

我的问题解决了我在Android 4.1上尝试了相同的代码并且它工作得非常快但是使用S2(android 2.3)它很慢!

2 个答案:

答案 0 :(得分:2)

可能导致缓慢的原因是

LIKE ('%' || nom...

在开头使用通配符将使数据库解析该列上的所有内容。

此外,如果您准备语句然后绑定参数(尽管它不重要),它会有所改进。

<强> [编辑]

如果这不是问题,你必须考虑你正在评估LIKE条款3400次(并且你只有150个类别)。

尝试使用以下内容预先过滤类别表:

SELECT  id_channel , nom_categorie , debut , fin , nom_prgrm 
FROM 
    programs, 
    categories_programs, 
    (select id_categorie,nom_categorie from categories where ('"+sentence+"' LIKE ('%' || nom_categorie || '%'))))
    categories 
WHERE (categories_programs.id_program = programs.id_program) AND (categories_programs.id_categorie = categories.id_categorie)

(我没有测试过查询,所以可能会有一些拼写错误)

<强> [/ EDIT]

答案 1 :(得分:0)

用JOIN替换查询怎么样?

SELECT  id_channel , nom_categorie , debut , fin , nom_prgrm FROM programs
JOIN categories_programs ON categories_programs.id_program = programs.id_program
JOIN categories ON categories_programs.id_categorie = categories.id_categorie
WHERE  '"+sentence+"' LIKE ('%' || nom_categorie || '%')));

虽然不确定你在最后一个条件下真正想要做什么......