SQL Server效能最佳化:subquery VS joins

來源:互聯網
上載者:User

標籤:

在資料庫中建立表如下,統計每個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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.