1

我创建了 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))");

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

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

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)它很慢!

4

2 回答 2

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)

(我还没有测试查询,所以它可能有一些错字)

[/编辑]

于 2012-10-31T11:46:18.010 回答
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 || '%')));

虽然不太确定你在最后一种情况下真正想要做什么......

于 2012-10-31T12:20:36.513 回答