我们一直在遇到关于工作的性能问题,幸运的是我发现这个查询导致了这个问题。
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
表上有复合主键(id
和name
)
和sno
= Student_Temp
中的记录数。
我的问题如下, 1)为什么此查询显示性能问题。 2)你们能不能更有效地写这篇文章?
提前致谢!
答案 0 :(得分:1)
它不必要地重复相同的逻辑。你真的只想要:
试试这个:
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