2013-02-20 95 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