SQL Server 聚合函數算法優化技巧

Sql server聚合函數在實際工做中應對各類需求使用的仍是很普遍的,對於聚合函數的優化天然也就成爲了一個重點,一個程序優化的好很差直接決定了這個程序的聲明週期。Sql server聚合函數對一組值執行計算並返回單一的值。聚合函數對一組值執行計算,並返回單個值。除了 COUNT 之外,聚合函數都會忽略空值。 聚合函數常常與 SELECT 語句的 GROUP BY 子句一塊兒使用。html

 

v1.寫在前面

若是有對Sql server聚合函數不熟或者忘記了的能夠看我以前的一片博客。sql server 基礎教程算法

本文中全部數據演示都是用Microsoft官方示例數據庫:Northwind,至於Northwind你們也能夠在網上下載。至於下載方法MSDN已經有了詳細的說明了,這裏就很少說了。sql

v2.Sql server標量聚合

2.1.概念: 

在只包含聚合函數的 SELECT 語句列列表中指定的一種聚合函數(如 MIN()、MAX()、COUNT()、SUM() 或 AVG())。當列列表只包含聚合函數時,則結果集只具備一個行給出聚合值,該值由與 WHERE 子句謂詞相匹配的源行計算獲得。

2.2.探索標量聚合: 

咱們先用Sql server的"包括實際的執行計劃"來看看一個簡單的流聚合COUNT()來看看錶裏數據全部的行數。數據庫

SQL Server 聚合函數算法優化技巧

再經過SET SHOWPLAN_ALL ON(關於輸出中包含的列更多信息能夠在連接中查看)來看看有關語句執行狀況的詳細信息,並估計語句對資源的需求。函數

經過SET SHOWPLAN_ALL ON咱們來看看COUNT()具體作了那些事情:post

  • 索引掃描:掃描當前表的行數
  • 流計算:計算行數的數量
  • 計算標量:將流計算出來的結果轉化爲適當的類型。(由於索引掃描出來的結果是根據表中數據的大小決定的,若是表中數據不少的話,COUNT是int類型就會有問題,因此在最終返回的時候須要將默認類型(數值通常默認類型是Big)轉成int類型。)
  • 小結:經過SET SHOWPLAN_ALL ON咱們能夠查看Sql server聚合函數在給咱們呈現最終效果的時候,爲這個效果作了些什麼事情。
SQL Server 聚合函數算法優化技巧

2.3.標量聚合優化技巧: 

咱們經過兩個比較簡單的sql查詢來看看他們的區別性能

SELECT COUNT(DISTINCT ShipCity) FROM Orders
SELECT COUNT(DISTINCT OrderID) FROM Orders

SQL Server 聚合函數算法優化技巧

從上圖中能夠看到,其實這兩個查詢從語句上來講沒什麼太大的區別,可是爲何開銷會不同,一個是查詢城市一個是查詢訂單號。這是由於其實DISTINCT對於OrderID查詢來講,是沒有什麼意義的,由於OrderID是主鍵,是不會有重複的。而ShipCity是會有重複的,Sql server的去重機制在去重的時候,會有一個排序的過程。這個排序仍是比較消耗資源的。大數據

對於數據量比較大的表其實不是很建議對大表排序或者對大表的某個重複次數多的字段去重運算。因此咱們這裏能夠對ShipCity進行優化一下。能夠對ShipCity建立一個非彙集索引優化

CREATE INDEX Index_ShipCity On Orders(ShipCity desc)
go

SQL Server 聚合函數算法優化技巧

從上圖中能夠看到,加了索引之後COUNT(DISTINCT ShipCity)的查詢變成了兩個流聚合,而沒有了排序,節省了開銷。url

總結:對於標量聚合從上面的例子你們能夠看到,標量聚合優缺點很明顯:

  • Sql server標量聚合優勢:算法比較簡單直觀,適合非重複值的聚合操做。
  • Sql server標量聚合缺點:性能較差(須要排序),不適合重複值的聚合操做。

優化技巧:

  • 儘可能避免排序產生
  • 將分組字(GROUP BY)段鎖定在索引覆蓋範圍內

v3.Sql server哈希聚合

3.1.概念: 

哈希(Hash,通常翻譯作「散列」,也有直接音譯爲「哈希」的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,因此不可能從散列值來惟一的肯定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。)

哈希聚合的內部實現方法和哈希鏈接的實現機制同樣,須要哈希函數的內部運算,造成不一樣的哈希值,依次並行掃描數據造成聚合值。

3.2.背景: 

爲了解決流聚合的不足,應對大數據的操做,因此哈希聚合就誕生了。

3.3.分析: 

來看看兩個簡單的查詢。

SQL Server 聚合函數算法優化技巧

ShipCountry和CustomerID的分組查詢看上去很相似,可是爲何執行計劃會不一樣呢?這是由於ShipCountry包含了大量的重複值,CustomerID重複值很是少,因此Sql server系統給ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是說Sql server系統會動態的根據查詢的狀況選擇合適的聚合方式。因此咱們在作SQL優化的時候不能僅根據SQL語句來優化,還得結合具體數據分佈的環境。

v4.運算過程監控指標

4.1.監控元素: 

  • 可視化查看運行時間
  • T-sql語句查詢時間
  • 佔用內存
  • T-sql語句查詢IO

4.2.可視化查看運行時間: 

SQL Server 聚合函數算法優化技巧

4.3.T-sql語句查詢時間: 

SQL Server 聚合函數算法優化技巧

4.4.佔用內存: 

SQL Server 聚合函數算法優化技巧

4.5.T-sql語句查詢IO: 

SQL Server 聚合函數算法優化技巧

關於監控元素還有不少,這裏就列舉幾個。

v博客總結

SQL Server 聚合函數算法優化技巧差很少就介紹到這裏,若是有對sql語句優化感興趣的能夠看這篇博客。sql server之數據庫語句優化

 


做  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於做者:專一於基礎平臺的項目開發。若有問題或建議,請多多賜教!
版權聲明:本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
特此聲明:全部評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:若是您以爲文章對您有幫助,能夠點擊文章右下角推薦一下。您的鼓勵是做者堅持原創和持續寫做的最大動力!

相關文章
相關標籤/搜索