2010-12-16 34 views
2

調試查詢SQL Server 05的應用程序無法更改查詢,但需要優化事情。TSQL不存在爲什麼這個查詢很慢?

單獨運行所有選擇很快< 1秒,例如:select * from acscard,從僱員中選擇id ...加入時需要50秒。

將不感興趣的accesscardid字段設置爲null或使用EXISTS時會「更好」嗎?

SELECT * FROM ACSCard 
    WHERE NOT EXISTS 
    (SELECT Id FROM Employee 
       WHERE Employee.AccessCardId = ACSCard.acs_card_number) 
    AND NOT EXISTS 
    (SELECT Id FROM Visit 
       WHERE Visit.AccessCardId = ACSCard.acs_card_number) 
    ORDER by acs_card_id 

回答

3

在Employee.AccessCardId,Visit.AccessCardId和ACSCard.acs_card_number上有索引嗎?

+0

這應該是對原始問題的評論...不是一個答案。 – 2010-12-16 02:31:13

+0

索引解決了這個問題 - 不敢相信他們從一開始就沒有! – Mobs 2010-12-16 05:54:28

1

SELECT子句不在EXISTS子句中計算。這個:

WHERE EXISTS(SELECT 1/0 
       FROM EMPLOYEE) 

...應該提出一個除以零的錯誤,但它不會。但是你需要在SELECT子句中加入一些東西,使它成爲一個有效的查詢 - 它是NULL還是零長度字符串無關緊要。

SQL Server, NOT EXISTS (and NOT IN) are better than the LEFT JOIN/IS NULL approach if the columns being compared are not nullable (the values on either side can not be NULL)。比較的列應該被索引,如果它們還沒有。