使用group by和join子句调优SQL Server查询性能

时间:2013-12-20 10:00:16

标签: sql sql-server sql-server-2008 tsql

我们一直在遇到关于工作的性能问题,幸运的是我发现这个查询导致了这个问题。

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表有8百万条记录,Student_temp每次在迭代过程中接收5-20条记录。 Student表上有复合主键(idname) 和sno = Student_Temp中的记录数。

我的问题如下, 1)为什么此查询显示性能问题。 2)你们能不能更有效地写这篇文章?

提前致谢!

3 个答案:

答案 0 :(得分:1)

它不必要地重复相同的逻辑。你真的只想要:

  • 同样存在于Student_temp
  • 中的学生
  • @sno时代存在什么名字?

试试这个:

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

答案 1 :(得分:1)

您的查询会返回以下结果:在@sno表格中为Student提供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,那么在Student_temp中显示一次但在{{1}中显示两次的名称}将包含在我的查询中但不包含在原始查询中。无论是否需要加以解决,我都依赖于你真正想要实现的目标。

答案 2 :(得分:0)

在这里

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