sql server聚合函式在實際工作中應對各種需求使用的還是很廣泛的,對於聚合函式的優化自然也就成為了乙個重點,乙個程式優化的好不好直接決定了這個程式的宣告週期。sql server聚合函式對一組值執行計算並返回單一的值。聚合函式對一組值執行計算,並返回單個值。除了 count 以外,聚合函式都會忽略空值。 聚合函式經常與 select 語句的 group by 子句一起使用。
一.寫在前面
如果有對sql server聚合函式不熟或者忘記了的可以看我之前的一片部落格。
本文中所有資料演示都是用microsoft官方示例資料庫:northplyxugwind,至於northwind大家也可以在網上**。
二.sql server標量聚合
2.1.概念:在只包含聚合函式的 select 語句列列表中指定的一種聚合函式(如 min()、max()、count()、sum() 或 **g())。當列列表只包含聚合函式時,則結果集只具有乙個行給出聚合值,該值由與 where 子句謂詞相匹配的源行計算得到。
2.2.探索標量聚合:
我們先用sql server的"包括實際的執行計畫"來看看乙個簡單的流聚合count()來看看表裡資料所有的行數。
再通www.cppcns.com過set showplan_all on(關於輸出中包含的列更多資訊可以在鏈結中檢視)來看看有關語句執**況的詳細資訊,並估計語句對資源的需www.cppcns.com求。
通過set showplan_all on我們來看看count()具體做了那些事情:
2.3.標量聚合優化技巧:
我們通過兩個比較簡單的sql查詢來看看他們的區別
複製** **如下:
select count(distinct shipcity) from ordersselect 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)的查詢變成了兩個流聚合,而沒有了排序,節省了開銷。
總結:對於標量聚合從上面的例子大家可以看到,標量聚合優缺點很明顯:
三.sql server雜湊聚合
3.1.概念:
雜湊(hash,一般翻譯做「雜湊」,也有直接音譯為「雜湊」的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成www.cppcns.com固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。)
雜湊聚合的內部實現方法和雜湊連線的實現機制一樣,需要雜湊函式的內部運算,形成plyxug不同的雜湊值,依次並行掃瞄資料形成聚合值。
3.2.背景:
為了解決流聚合的不足,應對大資料的操作,所以雜湊聚合就誕生了。
3.3.分析:
來看看兩個簡單的查詢。
shipcountry和customerid的分組查詢看上去很類似,但是為什麼執行計畫會不同呢?這是因為shipcountry包含了大量的重複值,customerid重複值非常少,所以sql server系統給shipcountry推送的雜湊聚合,而customerid推送的是流聚合。也就是說sql server系統會動態的根據查詢的情況選擇合適的聚合方式。所以我們在做sql優化的時候不能僅根據sql語句來優化,還得結合具體資料分布的環境。
四.運算過程監控指標
4.1.監控元素:
視覺化檢視執行時間t-sql語句查詢時間占用記憶體t-sql語句查詢io
4.2.視覺化檢視執行時間:
4.3.t-sql語句查詢時間:
4.4.占用記憶體:
4.5.t-sql語句查詢io:
關於監控元素還有很多,這裡就列舉幾個。
sql server 聚合函式演算法優化技巧差不多就介紹到這裡,希望對大家優化聚合函式演算法有所幫助。
本文標題: 深入學習sql server聚合函式演算法優化技巧
本文位址:
UIApplication深入學習
新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...
深入學習CSS
什麼是css?在之前的這篇文章中已經介紹了初步的介紹,詳細請看 div加css進一步講解了css中的內容,先總結如下圖 其實在實際開發中,我們通常採用是外部樣式的匯入,這樣做的好處是對於很對有同樣設計樣式的頁面可以實現樣式的共享,這樣我們不僅僅可以節省了大量的時間,並且也方便我們可以靈活的呼叫的樣式...
block深入學習
block的宣告和使用看上一節就行了。本章主要講block內部的實現過程及原理。block的定義和函式指標非常相似 對比一下 block定義 void someblock 函式指標定義 void functionpionter void functionname 當然區別還是有的,block的返回型...