久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

183次閱讀
沒有評論

共計 2272 個字符,預計需要花費 6 分鐘才能閱讀完成。

今天就跟大家聊聊有關 SQL Server 聚合函數算法優化技巧是什么,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

Sql server 聚合函數在實際工作中應對各種需求使用的還是很廣泛的,對于聚合函數的優化自然也就成為了一個重點,一個程序優化的好不好直接決定了這個程序的聲明周期。Sql server 聚合函數對一組值執行計算并返回單一的值。聚合函數對一組值執行計算,并返回單個值。除了 COUNT 以外,聚合函數都會忽略空值。聚合函數經常與 SELECT 語句的 GROUP BY 子句一起使用。

一. 寫在前面

所有數據演示都是用 Microsoft 官方示例數據庫:Northwind,至于 Northwind 大家也可以在網上下載。

二.Sql server 標量聚合

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

2.2. 探索標量聚合:

我們先用 Sql server 的 包括實際的執行計劃 來看看一個簡單的流聚合 COUNT()來看看表里數據所有的行數。

再通過 SET SHOWPLAN_ALL ON(關于輸出中包含的列更多信息可以在鏈接中查看)來看看有關語句執行情況的詳細信息,并估計語句對資源的需求。

通過 SET SHOWPLAN_ALL ON 我們來看看 COUNT()具體做了那些事情:

索引掃描:掃描當前表的行數   流計算:計算行數的數量   計算標量:將流計算出來的結果轉化為適當的類型。(因為索引掃描出來的結果是根據表中數據的大小決定的,如果表中數據很多的話,COUNT 是 int 類型就會有問題,所以在最終返回的時候需要將默認類型 (數值一般默認類型是 Big) 轉成 int 類型。)   小結:通過 SET SHOWPLAN_ALL ON 我們可以查看 Sql server 聚合函數在給我們呈現最終效果的時候,為這個效果做了些什么事情。

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 標量聚合優點:算法比較簡單直觀,適合非重復值的聚合操作。Sql server 標量聚合缺點:性能較差 (需要排序),不適合重復值的聚合操作。  優化技巧: 盡量避免排序產生,將分組字(GROUP BY) 段鎖定在索引覆蓋范圍內

三.Sql server 哈希聚合

3.1. 概念:

哈希(Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射,pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。)

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

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 聚合函數算法優化技巧是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-18發表,共計2272字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 伊宁县| 朔州市| 东明县| 阳朔县| 藁城市| 广灵县| 梨树县| 弥渡县| 岳池县| 清苑县| 富蕴县| 岳西县| 盐津县| 泸定县| 海安县| 安康市| 呼伦贝尔市| 佛学| 兴安县| 库车县| 确山县| 同心县| 斗六市| 屯留县| 西贡区| 方山县| 哈密市| 北川| 荣昌县| 儋州市| 临颍县| 博爱县| 德清县| 龙南县| 盖州市| 桑日县| 漳州市| 留坝县| 宁阳县| 晋宁县| 靖江市|