2013-12-20 57 views
0

我們已經經歷過的工作性能問題,我能幸運找到查詢導致緩慢..SQL Server查詢性能比較調諧GROUP BY和連接子句

select name from Student a, Student_Temp b 
where a.id = b.id and 
a.name in (select name from Student 
group by name having count(*) = @sno) 
group by a.name having count(*) = @sno 
OPTION (MERGE JOIN, LOOP JOIN) 

這個特定的查詢被反覆調用多次放緩下降的表現..

Student表有800萬條記錄和Student_temp每次在迭代過程中收到5-20條記錄。 (idname) 和sno = Student_Temp中的記錄數。

我的問題如下, 1)爲什麼這個查詢顯示性能問題。 2)你們能否提供一種更有效的寫作方式?

在此先感謝!

+0

不知道你甚至需要 「和 a.name在(由具有數名(*)= @sno選擇學生 組名)」 的一部分 – athabaska

+0

我認爲你可以使用內部連接:從學生中選擇名稱INNER JOIN Student_Temp b ON a.id = b.id ... – PeterRing

+0

子查詢沒有任何意義。 – KumarHarsh

回答

1

它不必要地重複相同的邏輯。你真的只是想:

  • 學生(S)誰也存在於Student_temp
  • 什麼名稱存在@sno時代?

試試這個:

SELECT 
    name 
FROM 
    Student a JOIN 
    Student_Temp b ON a.id = b.id 
GROUP BY 
    name 
HAVING 
    count(*) = @sno 
1

查詢返回以下結果:給我在表中Student@sno時間和Student_temp只出現一次的所有名稱。

你可以重寫本查詢:

SELECT a.name 
FROM Student a 
INNER JOIN Student_temp b 
ON a.id = b.id 
GROUP BY a.name 
HAVING COUNT(*) = @sno 

應忽略查詢提示,除非你有絕對的把握,查詢優化器螺絲了。

編輯:當然還有的查詢之間的區別:如果例如@sno=2然後在Student_temp一次Student而是兩次顯示出來的名稱將包括在我的查詢,但不是在原來的。我取決於你真正想要達到的目標是否需要得到滿足。

+0

非常感謝Twinles。我有個問題。在你的答案中你給出了「所有的名字」......這是不正確的。值a.name被分配給一個變量。就像select @ nm = a.name ....你確定你的查詢會給出和我的結果完全相同的結果嗎 – Vignesh

+0

我不確定你在問什麼,但是:是的:你的查詢也可以返回多行。 – Twinkles

+0

請考慮讓你的團隊擁有數據庫經驗的人,你的系統可能會有更多的問題讓你放慢速度(例如查詢被「多次迭代調用」的部分)。 – Twinkles

0

在這裏你去

select name 
from Student a 
inner join Student_Temp b 
on a.id = b.id 
group by a.name 
HAVING COUNT(*) = @sno