2013-02-20 92 views
0

我被困解決這個問題,它應該是不錯的聽覺新新鮮的想法:)SQL - 避免額外GROUP BY(和提高查詢性能)

我有一個表的記錄數十億這樣

TAB_IX (int) (PK) 
TAB_ID (int) (PK) 
PR_ID (int) (PK) 
SP_ID (int) (PK)(IX) 
.... 

這樣

SELECT TAB_ID, COUNT (SP_ID) as HITS FROM table t 
INNER JOIN table_sp s on t.SP_ID = s.ID 
WHERE TAB_IX = @tab_inx 
AND PR_ID IN (SELECT PR_ID FROM @pr_id) 
AND s.NAME IN (SELECT DISTINCT NAME FROM @sp_names) 
GROUP BY TAB_ID 

table_sp以前我是檢索數據與記錄10K(ID(INT)(PK),NAME(VARCHAR)(IX))略表

@pr_id和@sp_names是具有一列的表變量

查詢非常快(約2-3秒);現在我不希望像

TAB_IX - TAB_ID - PR_ID - SP_ID 
1  - 700 - 1  - 100 
1  - 700 - 2  - 100 

應被視爲一個區分記錄不同PR_ID和同TAB_IX,TAB_ID,SP_ID

因此,例如記錄。

的唯一方法似乎在做一個額外的GROUP BY

像這樣

SELECT TAB_ID, COUNT(SP_ID) as HITS FROM (
SELECT TAB_ID, SP_ID, COUNT (PR_ID) FROM table 
WHERE TAB_IX = @tab_inx 
AND PR_ID in (select PR_ID from @pr_id) 
AND s.NAME IN (SELECT DISTINCT NAME FROM @sp_names) 
GROUP BY TAB_ID, SP_ID) AS DUMMY 
GROUP BY TAB_ID 

問題是性能,因爲添加這種額外的GROUP BY操作看起來非常痛苦。

您對改進查詢有什麼想法嗎?

感謝提前:)

回答

1

我想,在指定要算DISTINCT SP_ID會做的伎倆

SELECT TAB_ID, COUNT (DISTINCT SP_ID) as HITS FROM table t 
INNER JOIN table_sp s on t.SP_ID = s.ID 
WHERE TAB_IX = @tab_inx 
AND PR_ID IN (SELECT PR_ID FROM @pr_id) 
AND s.NAME IN (SELECT DISTINCT NAME FROM @sp_names) 
GROUP BY TAB_ID 
+0

謝謝YBO原來的查詢,我din't想想這個解決方案: )但是表現仍然非常相似;這個DISTINCT在很多記錄上也很重。我擔心我無法提高查詢的速度...... – JoinZ 2013-02-20 10:52:12