Sql server聚合函數在實際工做中應對各類需求使用的仍是很普遍的,對於聚合函數的優化天然也就成爲了一個重點,一個程序優化的好很差直接決定了這個程序的聲明週期。Sql server聚合函數對一組值執行計算並返回單一的值。聚合函數對一組值執行計算,並返回單個值。除了 COUNT 之外,聚合函數都會忽略空值。 聚合函數常常與 SELECT 語句的 GROUP BY 子句一塊兒使用。html
若是有對Sql server聚合函數不熟或者忘記了的能夠看我以前的一片博客。sql server 基礎教程。算法
本文中全部數據演示都是用Microsoft官方示例數據庫:Northwind,至於Northwind你們也能夠在網上下載。至於下載方法MSDN已經有了詳細的說明了,這裏就很少說了。sql
咱們先用Sql server的"包括實際的執行計劃"來看看一個簡單的流聚合COUNT()來看看錶裏數據全部的行數。數據庫
再經過SET SHOWPLAN_ALL ON(關於輸出中包含的列更多信息能夠在連接中查看)來看看有關語句執行狀況的詳細信息,並估計語句對資源的需求。函數
經過SET SHOWPLAN_ALL ON咱們來看看COUNT()具體作了那些事情:post
咱們經過兩個比較簡單的sql查詢來看看他們的區別性能
SELECT COUNT(DISTINCT ShipCity) FROM Orders SELECT COUNT(DISTINCT OrderID) FROM Orders
從上圖中能夠看到,其實這兩個查詢從語句上來講沒什麼太大的區別,可是爲何開銷會不同,一個是查詢城市一個是查詢訂單號。這是由於其實DISTINCT對於OrderID查詢來講,是沒有什麼意義的,由於OrderID是主鍵,是不會有重複的。而ShipCity是會有重複的,Sql server的去重機制在去重的時候,會有一個排序的過程。這個排序仍是比較消耗資源的。大數據
對於數據量比較大的表其實不是很建議對大表排序或者對大表的某個重複次數多的字段去重運算。因此咱們這裏能夠對ShipCity進行優化一下。能夠對ShipCity建立一個非彙集索引。優化
CREATE INDEX Index_ShipCity On Orders(ShipCity desc) go
從上圖中能夠看到,加了索引之後COUNT(DISTINCT ShipCity)的查詢變成了兩個流聚合,而沒有了排序,節省了開銷。url
總結:對於標量聚合從上面的例子你們能夠看到,標量聚合優缺點很明顯:
優化技巧:
哈希(Hash,通常翻譯作「散列」,也有直接音譯爲「哈希」的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,因此不可能從散列值來惟一的肯定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。)
哈希聚合的內部實現方法和哈希鏈接的實現機制同樣,須要哈希函數的內部運算,造成不一樣的哈希值,依次並行掃描數據造成聚合值。
爲了解決流聚合的不足,應對大數據的操做,因此哈希聚合就誕生了。
來看看兩個簡單的查詢。
ShipCountry和CustomerID的分組查詢看上去很相似,可是爲何執行計劃會不一樣呢?這是由於ShipCountry包含了大量的重複值,CustomerID重複值很是少,因此Sql server系統給ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是說Sql server系統會動態的根據查詢的狀況選擇合適的聚合方式。因此咱們在作SQL優化的時候不能僅根據SQL語句來優化,還得結合具體數據分佈的環境。
關於監控元素還有不少,這裏就列舉幾個。
SQL Server 聚合函數算法優化技巧差很少就介紹到這裏,若是有對sql語句優化感興趣的能夠看這篇博客。sql server之數據庫語句優化
做 者:請叫我頭頭哥
出 處:http://www.cnblogs.com/toutou/
關於做者:專一於基礎平臺的項目開發。若有問題或建議,請多多賜教!
版權聲明:本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
特此聲明:全部評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:若是您以爲文章對您有幫助,能夠點擊文章右下角【推薦】一下。您的鼓勵是做者堅持原創和持續寫做的最大動力!