2016-08-03 42 views
0

我無法理解如何添加頂部選擇會導致查詢從48 ms變爲7000 ms。基本上,如果我只執行黃色突出顯示的查詢,則需要48 ms。當我添加頂部時,需要7000毫秒。返回的總行數只有60,所以我不明白爲什麼減速。感覺好像它正在執行我的與會者文件中的所有行,而不僅僅是在in子句中找到的60行。不明白爲什麼添加IN會導致SqlServer 2014巨大的性能影響

查詢:

Full Query Including In Clause

Plan for full query above

Plan for just part in yellow

完整的查詢,包括條款上面 計劃全面查詢黃色 原始查詢只是部分 計劃:

SELECT Attendees.Id, 
     Attendees.UserFirstName, 
     Attendees.UserLastName, 
     Attendees.Email 
FROM Attendees 
WHERE Id IN (
       SELECT DISTINCT dbo.Attendees.Id 
       FROM dbo.SessionAttendee 
        INNER JOIN dbo.Attendees ON (
        dbo.SessionAttendee.Attendees_username = dbo.Attendees.PKID 
        ) 
        INNER JOIN dbo.Sessions ON (dbo.SessionAttendee.Sessions_id = 
        dbo.Sessions.Id) 
       WHERE dbo.Sessions.CodeCampYearId = 104 AND 
        dbo.SessionAttendee.Interestlevel = 3 
    ) 
+0

說不上來。你可以改寫它作爲一個連接,可能會幫助完成。 – Will

回答

1

不知道爲什麼你需要頂級查詢,你不能只從第一個查詢中選擇一切嗎?

SELECT DISTINCT 
    Attendees.Id, 
    Attendees.UserFirstName, 
    Attendees.UserLastName, 
    Attendees.Email 
FROM dbo.SessionAttendee 
INNER JOIN dbo.Attendees ON (
       dbo.SessionAttendee.Attendees_username = dbo.Attendees.PKID 
       ) 
INNER JOIN dbo.Sessions ON (dbo.SessionAttendee.Sessions_id = 
       dbo.Sessions.Id) 
WHERE dbo.Sessions.CodeCampYearId = 104 AND 
       dbo.SessionAttendee.Interestlevel = 3 
+0

是的,如果'Attendees.Id'是主鍵,它將是唯一的,其他列不會改變DISTINCT的行爲。 –

+0

這改善了內部查詢所做的工作(當然)。我將它分開的唯一原因是因爲我有很多查詢返回一個值(attendees.Id),然後將它放入IN子句中。我使用的大部分查詢都是機器生成的,所以in子句讓生活更輕鬆。 –

0

您可以嘗試使用EXISTS。

SELECT a.Id, 
     a.UserFirstName, 
     a.UserLastName, 
     a.Email 
FROM Attendees a 
WHERE EXISTS (
    SELECT 1 
    FROM dbo.Sessions s 
      JOIN SessionAttendee sa ON sa.Sessions_id = s.Id 
    WHERE s.CodeCampYearId = 104 
      AND sa.Interestlevel = 3 
      AND sa.Attendees_username = a.PKID 
) 

IN部分可能不會這麼大影響表現爲DISTINCT部分

+0

謝謝@ JamieD77我試圖刪除獨特的,它並沒有改變性能。我仍然困惑爲什麼它慢得多。 –

相關問題