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 に答える