2009-11-30 57 views
0

我有2個表Person_OrganizationPerson_Organization_other和嵌套查詢:加入查詢花費更多的執行時間比其相應的嵌套查詢

SELECT 
    Person_Organization_id 
FROM 
    Person_Organization_other 
WHERE 
    company_name IN (SELECT company_name 
        FROM Person_Organization_other 
        WHERE Person_Organization_id IN (SELECT Person_Organization_Id 
                FROM Person_Organization 
                WHERE person_id = 117 
                 AND delete_flag = 0) 
       ) 

鑑於上面的查詢與聯接我試過相應的查詢是: -

SELECT 
    poo.Person_Organization_id 
FROM 
    Person_Organization_other poo, Person_Organization_other poo1, Person_Organization po 
WHERE 
    poo1.Person_Organization_id = po.Person_Organization_Id 
    AND po.person_id = 117 
    AND po.delete_flag = 0 
    AND poo.company_name = poo1.company_name 
GROUP BY 
    poo.Person_Organization_id 

但是嵌套查詢發現花費更少的時間相比,其相應的查詢與連接。我使用SQL事件探查器跟蹤來比較執行的查詢的時間。對於嵌套查詢需要30 ms。對於連接查詢花了41多毫秒

我的印象是,作爲一項規則嵌套查詢不太perfomant,應該是在「夷爲平地」使用連接。

有人能解釋我做錯了嗎?

問候 尼廷

回答

0

用逗號分隔的表,你正在有效地穿越一起加入他們。我會嘗試做明確內蒙古表之間的連接,看看有沒有什麼幫助的性能。

1

您正在使用交叉連接。嘗試內部連接。

select poo.Person_Organization_id 
from Person_Organization po 
INNER JOIN Person_Organization_other poo ON 
    poo.Person_Organization_id=po.Person_Organization_Id 
INNER JOIN Person_Organization_other poo1 ON 
    poo1.Person_Organization_id=po.Person_Organization_Id AND 
    poo.company_name=poo1.company_name 
where po.person_id=117 AND po.delete_flag=0 
group by poo.Person_Organization_id 
0

:嵌套查詢是少高性能,應使用連接變平的觀點是一個神話 - 它使用子查詢是一樣好是事實,不恰當的嵌套子查詢可能會導致性能問題,但在許多情況下,使用連接。

事實上,SQL服務器通過將所有查詢減少到執行樹來優化它所執行的所有查詢 - 通常,使用JOIN的查詢最終具有與使用嵌套查詢的等效sql語句相同的執行樹。

在這種情況下,這些執行時間是非常低反正 - 的差異也很容易因爲由於高速緩存等等來解釋......不填充。

我的建議是使用任何語法更有意義,你 - 如果你有一個性能問題,然後通過各種手段回去檢查,看是否有嵌套子查詢是你的問題的原因,但是我肯定止跌」不要花費時間擔心「平淡」不會造成問題的查詢。

0

您的表格順序可能會降低您的表格順序在from子句中的性能應該是按行數遞增的順序