2012-10-31 44 views
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))"); 

節目表包含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

也許是緩慢的原因是

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) 

(我沒有測試查詢,以便它可能有一些錯字)

[/編輯]

+0

不,這不是問題,因爲我想它沒有這一點,同樣的問題accouring! – user1788384

+0

增加了另一個可能的原因。 – richardtz

+0

非常感謝我這樣做,我已經節省了一半的執行時間,但仍然太慢 – user1788384

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 || '%'))); 

不能確定你真正想要的,雖然這最後的條件做...

+0

感謝您的答覆。我已經嘗試加入,但它給出了相同的結果 – user1788384

+0

,你說即使你刪除了最後一個條件(用LIKE),你仍然表現不佳? – Matthieu

+0

是的,當我在Android 4.1上試用我的代碼時,我的問題就解決了:) – user1788384

相關問題