標籤:
在資料庫中建立表如下,統計每個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 rowfrom Task t
上述子查詢只是作為樣本,實際運用時可能需要統計各個時段的每條任務對應的評論數,這裡偷個懶(ˇ?ˇ) 像這對愛偷懶的貓咪~
執行計畫如下:(很複雜,每個子查詢都需要執行一次,可見度能也不是很好的)
此種方式,便於理解,可讀性較高,但是當子查詢在資料量較大的時候,由於每行都會去執行嵌入的子查詢,會導致效能很慢。
第二種解決方案:
--using group by and table joinsselect t.TaskId, count(n.ID) ‘Notes‘, count(n.Comment) ‘Notes1‘, count(n.CreatedTime) ‘Notes2‘from Task tleft join TaskNote non 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~。
SQL Server效能最佳化:subquery VS joins