2013-07-04 87 views
0

我不擅長SQL,所以我請你們幫忙寫一個查詢。
SQL Query - Table Joining Problems
我得到了一個答案,它的工作原理!它顯然很慢。我討厭這樣做,但我真的希望有人在那裏想推薦一些方法來優化查詢。我甚至沒有嘗試過,因爲我對SQL甚至沒有足夠的瞭解,甚至不會開始使用Google。SQL查詢 - 性能優化

回答

2

什麼可能會幫助您在要加入的列上創建索引。例如;

CREATE INDEX name_for_index ON Main (StatusID); 

它爲執行查詢的算法將使用的該列生成查找表。

編輯:如果你不允許更改數據庫,你可能會運氣不好。我已經看到了JOIN語句的緩解提高了性能的情況,那就是這樣;

... 
FROM 
    Main m, Status st, Secondary s 
WHERE 
    st.ID = m.StatusID 
    AND s.MainID = m.ID 
    AND 
    (s.MainID IS NULL AND m.WhenDate = <YourDate> 
    OR 
    s.MainID IS NOT NULL AND s.WhenDate = <YourDate>) 
    AND TypeId = <TypeFilter> 
    AND ... other filters, if you need any ... 

然後處理您的其他案例,其中INNER JOIN需要更詳細一點。

+0

我應該提到它,但它會走神的行爲讓我對數據庫作任何修改..希望有更改查詢並獲得更快的結果的方式... – Dorf

+0

你可以做除了添加索引之外,還有一些優化,但不會產生太多結果,並且會使查詢變得更加複雜。我強烈建議你讓你的DBA看看並添加正確的索引。或者給你這樣做的權利。 – GolezTrol

+0

我同意GolezTrol。 – Gijs

0

有時候這樣的一個技巧可能會工作一點,但正如你所看到的,它主要使你的查詢複雜化。但正如我在評論中所說的那樣:我真的強烈要求你的DBA添加適當的索引,甚至可以教你如何確定你需要的索引並給你添加它們的權利。

我見過WHERE子句中的OR通過使用兩個單獨的幾乎相似的選擇來解決,這些選擇由USING ALL組合。但我相信這個技巧主要用於Oracle,主要用於具有合適索引的表。值得一試,但。

SELECT 
    x.* 
FROM 
    (SELECT 
    m.ID as MainID, 
    m.WhenDate as MainWhenDate, 
    m.InfoText, 
    m.StatusID, 
    st.StatusText, 
    m.TypeID, 
    NULL AS SecondaryWhenDate, 
    m.WhenDate AS ActualWhenDate 
    FROM 
    Main m 
    INNER JOIN Status st ON st.ID = m.StatusID 
    LEFT JOIN Secondary s ON s.MainID = m.ID 
    WHERE 
    s.MainID IS NULL AND 
    m.WhenDate = <YourDate> 
    UNION ALL 
    SELECT 
    m.ID as MainID, 
    m.WhenDate as MainWhenDate, 
    m.InfoText, 
    m.StatusID, 
    st.StatusText, 
    m.TypeID, 
    s.WhenDate AS SecondaryWhenDate, 
    s.WhenDate AS ActualWhenDate 
    FROM 
    Main m 
    INNER JOIN Status st ON st.ID = m.StatusID 
    INNER JOIN Secondary s ON s.MainID = m.ID 
    WHERE 
    s.WhenDate = <YourDate>) x 
WHERE 
    x.TypeId = <TypeFilter> 
    AND ... other filters, if you need any ...