深入了解SQL Server聚合函數(shù)算法優(yōu)化
Admin 2021-09-10 群英技術(shù)資訊 1408 次瀏覽
這篇文章主要介紹SQL Server聚合函數(shù)算法優(yōu)化的小技巧,對大家學(xué)習(xí)SQL Server有一定的幫助,感興趣的朋友可以參考下,希望大家閱讀完這篇文章能有所收獲,接下來小編帶著大家一起了解看看。
Sql server聚合函數(shù)在實(shí)際工作中應(yīng)對各種需求使用的還是很廣泛的,對于聚合函數(shù)的優(yōu)化自然也就成為了一個重點(diǎn),一個程序優(yōu)化的好不好直接決定了這個程序的聲明周期。Sql server聚合函數(shù)對一組值執(zhí)行計(jì)算并返回單一的值。聚合函數(shù)對一組值執(zhí)行計(jì)算,并返回單個值。除了 COUNT 以外,聚合函數(shù)都會忽略空值。 聚合函數(shù)經(jīng)常與 SELECT 語句的 GROUP BY 子句一起使用。
Sql server標(biāo)量聚合
1.概念:在只包含聚合函數(shù)的 SELECT 語句列列表中指定的一種聚合函數(shù)(如 MIN()、MAX()、COUNT()、SUM() 或 AVG())。當(dāng)列列表只包含聚合函數(shù)時,則結(jié)果集只具有一個行給出聚合值,該值由與 WHERE 子句謂詞相匹配的源行計(jì)算得到。
2.探索標(biāo)量聚合:
我們先用Sql server的"包括實(shí)際的執(zhí)行計(jì)劃"來看看一個簡單的流聚合COUNT()來看看表里數(shù)據(jù)所有的行數(shù)。

再通過SET SHOWPLAN_ALL ON(關(guān)于輸出中包含的列更多信息可以在鏈接中查看)來看看有關(guān)語句執(zhí)行情況的詳細(xì)信息,并估計(jì)語句對資源的需求。
通過SET SHOWPLAN_ALL ON我們來看看COUNT()具體做了那些事情:

3.標(biāo)量聚合優(yōu)化技巧:
我們通過兩個比較簡單的sql查詢來看看他們的區(qū)別
SELECT COUNT(DISTINCT ShipCity) FROM OrdersSELECT COUNT(DISTINCT OrderID) FROM Orders
從上圖中可以看到,其實(shí)這兩個查詢從語句上來說沒什么太大的區(qū)別,但是為什么開銷會不一樣,一個是查詢城市一個是查詢訂單號。這是因?yàn)槠鋵?shí)DISTINCT對于OrderID查詢來說,是沒有什么意義的,因?yàn)镺rderID是主鍵,是不會有重復(fù)的。而ShipCity是會有重復(fù)的,Sql server的去重機(jī)制在去重的時候,會有一個排序的過程。這個排序還是比較消耗資源的。
對于數(shù)據(jù)量比較大的表其實(shí)不是很建議對大表排序或者對大表的某個重復(fù)次數(shù)多的字段去重運(yùn)算。所以我們這里可以對ShipCity進(jìn)行優(yōu)化一下??梢詫hipCity創(chuàng)建一個非聚集索引。
CREATE INDEX Index_ShipCity On Orders(ShipCity desc)go
從上圖中可以看到,加了索引以后COUNT(DISTINCT ShipCity)的查詢變成了兩個流聚合,而沒有了排序,節(jié)省了開銷。
總結(jié):對于標(biāo)量聚合從上面的例子大家可以看到,標(biāo)量聚合優(yōu)缺點(diǎn)很明顯:
Sql server哈希聚合
1.概念:
哈希(Hash,一般翻譯做“散列”,也有直接音譯為“哈?!钡模褪前讶我忾L度的輸入(又叫做預(yù)映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。)
哈希聚合的內(nèi)部實(shí)現(xiàn)方法和哈希連接的實(shí)現(xiàn)機(jī)制一樣,需要哈希函數(shù)的內(nèi)部運(yùn)算,形成不同的哈希值,依次并行掃描數(shù)據(jù)形成聚合值。
2.背景:
為了解決流聚合的不足,應(yīng)對大數(shù)據(jù)的操作,所以哈希聚合就誕生了。
3.分析:
來看看兩個簡單的查詢。

ShipCountry和CustomerID的分組查詢看上去很類似,但是為什么執(zhí)行計(jì)劃會不同呢?這是因?yàn)镾hipCountry包含了大量的重復(fù)值,CustomerID重復(fù)值非常少,所以Sql server系統(tǒng)給ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是說Sql server系統(tǒng)會動態(tài)的根據(jù)查詢的情況選擇合適的聚合方式。所以我們在做SQL優(yōu)化的時候不能僅根據(jù)SQL語句來優(yōu)化,還得結(jié)合具體數(shù)據(jù)分布的環(huán)境。
運(yùn)算過程監(jiān)控指標(biāo)
1.監(jiān)控元素:
可視化查看運(yùn)行時間T-sql語句查詢時間占用內(nèi)存T-sql語句查詢IO
2.可視化查看運(yùn)行時間:
3.T-sql語句查詢時間:

4.占用內(nèi)存:

5.T-sql語句查詢IO:

關(guān)于監(jiān)控元素還有很多,這里就列舉幾個。
關(guān)于SQL Server聚合函數(shù)算法優(yōu)化的內(nèi)容就介紹到這,希望本文能幫助到大家,想要了解更多SQL Server聚合函數(shù)的內(nèi)容,大家可以關(guān)注群英網(wǎng)絡(luò)其它相關(guān)文章。
文本轉(zhuǎn)載自腳本之家
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:[email protected]進(jìn)行舉報(bào),并提供相關(guān)證據(jù),查實(shí)之后,將立刻刪除涉嫌侵權(quán)內(nèi)容。
猜你喜歡
本文通過介紹默認(rèn)使用索引、強(qiáng)制使用聚集索引、強(qiáng)制使用非聚集索引讓我們知道對于檢索所有列結(jié)果集使用主鍵的聚集索引是最佳選擇。有興趣的朋友可以看下
視圖是可視化的表。本章講解如何創(chuàng)建、更新和刪除視圖。SQL CREATE VIEW 語句,在 SQL 中,視圖是基于 SQL 語句的結(jié)果集的可視化表。視圖包含行和列,就像真正的表一樣。視圖中的字段是一個或多個數(shù)據(jù)庫中真實(shí)表中的字段。您可以添加 SQL 函數(shù),在哪里添加,并將語句連接到視圖,或者您可以呈現(xiàn)數(shù)據(jù),就像數(shù)據(jù)來自單個表一樣。
很多新手在學(xué)習(xí)SQL游標(biāo)時,對于SQL游標(biāo)的定義以及使用不是很清楚,因此文本給大家分享的關(guān)于SQL游標(biāo)的使用,具有一定的參考價值,有這方面學(xué)習(xí)需要的朋友可以看看。
這篇文章給大家分享的是有關(guān)sql server 文件操作的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家作個參考,感興趣的朋友就繼續(xù)往下看吧。
這篇文章主要介紹了SQL Server 觸發(fā)器,觸發(fā)器是一種特殊類型的存儲過程,它不同于之前的我們介紹的存儲過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)被自動調(diào)用執(zhí)行的。而存儲過程可以通過存儲過程的名稱被調(diào)用。需要的朋友可以參考一下
推薦內(nèi)容
成為群英會員,開啟智能安全云計(jì)算之旅
立即注冊關(guān)注或聯(lián)系群英網(wǎng)絡(luò)
7x24小時售前:400-678-4567
7x24小時售后:0668-2555666
24小時QQ客服
群英微信公眾號
CNNIC域名投訴舉報(bào)處理平臺
服務(wù)電話:010-58813000
服務(wù)郵箱:[email protected]
投訴與建議:0668-2555555
Copyright ? QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版權(quán)所有
增值電信經(jīng)營許可證 : B1.B2-20140078 ICP核準(zhǔn)(ICP備案)粵ICP備09006778號 域名注冊商資質(zhì) 粵 D3.1-20240008