SQL Server性能优化:subquery VS joins

在数据库中创建表如下,统计每个Task对应的TaskNote有多少条?

第一种解决方案:

select t.TaskId,
       (select count(n.ID) from TaskNote n where n.TaskId = t.TaskId) 'Notes',  --exec every row
       (select count(n.Comment) from TaskNote n where n.TaskId = t.TaskId) 'Notes1' , --exec every row
       (select count(n.CreatedTime) from TaskNote n where n.TaskId = t.TaskId) 'Notes2'  --exec every row
from   Task t

 上述子查询只是作为示例,实际运用时可能需要统计各个时段的每条任务对应的评论数,这里偷个懒(ˇˍˇ) 像这对爱偷懒的猫咪~

执行计划如下:(很复杂,每个子查询都需要执行一次,可见性能也不是很好的)

 此种方式,便于理解,可读性较高,但是当子查询在数据量较大的时候,由于每行都会去执行嵌入的子查询,会导致性能很慢。

 

第二种解决方案:

--using group by and table joins
select t.TaskId,
       count(n.ID) 'Notes',
       count(n.Comment) 'Notes1',
       count(n.CreatedTime) 'Notes2'
from   Task t
left join
       TaskNote n
on     isnull(t.TaskId,'__') = isnull(n.TaskId,'__')
group by t.TaskId

执行计划如下:(相比上面而言,这个看上去简单多了,想象一下,性能也会有所提高的)

在数据量较大的时候,利用 left join的方式性能方面会有很大的提升,注意在On的时候使用isnull对null值进行转换。

两种方法当数据量性能上差别不会很大,但是当数据庞大而且子查询嵌套复杂的时候可能需要仔细斟酌一下咯。

在工作上遇到这个问题了,两者在处理大数据且又复杂的统计数据时,性能差距很大!以此日志作为记录,引以为戒!

fighting for me,my dear darling,my family, ~O(∩_∩)O~。

posted @ 2015-02-12 21:41  IT女汉纸  阅读(303)  评论(0编辑  收藏  举报