我有一個簡單的查詢(PostgreSQL的,如果該事項),其檢索some_user所有項目排除在她的心願她有那些:左外慢速查詢加入,爲空條件
select i.*
from core_item i
left outer join core_item_in_basket b on (i.id=b.item_id and b.user_id=__some_user__)
where b.on_wishlist is null;
上面的查詢運行在〜50000ms(是的,數字是正確的)。 如果我刪除「b.on_wishlist爲null」條件或使其「b.on_wishlist不爲空」,查詢運行大約50ms(相當多的變化)。
該查詢有更多的連接和條件,但這是無關緊要的,因爲只有這個會降低速度。
數據庫的大小一些信息:
- core_items有〜10.000記錄
- core_user了〜5.000記錄
- core_item_in_basket了〜2.000
- 記錄(其中約50%有 on_wishlist = true,其餘爲空)
我沒有任何索引(id除外和外鍵)在這兩個表上。
現在的問題是:我應該怎麼做才能讓這個運行速度更快?今天晚上我有幾個想法可以看看,但是如果可能的話,我希望你們幫忙。
謝謝!
也許你可以看看執行計劃,看看是什麼問題。理論上,如果餘額爲50/50,則請求'爲空'或'非空'必須具有相同的執行計劃。表的空stastistics必須是錯誤的! – 2009-07-01 15:18:19
@ Scorpi0不完全。請記住,這是一個外連接。 core_item_in_basket的空統計確實是50/50,但查詢試圖將來自core_item的每條記錄與來自core_item_in_basket的記錄進行匹配,從而在連接的右側產生大量額外的空值。 – michuk 2009-07-01 15:54:35
兩種行匹配條件「where b.on_wishlist爲null」1. core_item中的行沒有匹配的core_item_in_basket; 2. core_item中的行與core_item_in_basket中的匹配,但其中一些匹配的匹配on_wishlist爲空 您是否希望這兩組行? – 2009-07-04 18:31:30