Atitit 数据存储的分组聚合 groupby的实现attilax总结
?
?
?
Atitit ?數(shù)據(jù)存儲(chǔ)的分組聚合 groupby的實(shí)現(xiàn)attilax總結(jié)
?
1. 聚合操作1
1.1. a、標(biāo)量聚合?流聚合1
1.2. b、哈希聚合2
1.3. 所有的最優(yōu)計(jì)劃的選擇都是基于現(xiàn)有統(tǒng)計(jì)信息來(lái)評(píng)估3
1.4. 參考資料3
?
1.?聚合操作
聚合也是我們?cè)趯?/span>T-SQL語(yǔ)句的時(shí)候經(jīng)常遇到的,我們來(lái)分析一下一些常用的聚合操作運(yùn)算符的特性和可優(yōu)化項(xiàng)。
1.1.?a、標(biāo)量聚合?流聚合
標(biāo)量聚合是一種常用的數(shù)據(jù)聚合方式,比如我們寫的語(yǔ)句中利用的以下聚合函數(shù):MAX()、MIN()、AVG()、COUNT()、SUM()
以上的這些數(shù)據(jù)結(jié)果項(xiàng)的輸出基本都是通過(guò)流聚合的方式產(chǎn)生,并且這個(gè)運(yùn)算符也被稱為:標(biāo)量聚合
?
其實(shí),流聚合這種算法最常用的方式是分組(GROUP BY)計(jì)算,上面的標(biāo)量計(jì)算也是利用這個(gè)特性,只不過(guò)把整體形成了一個(gè)大組進(jìn)行聚合。
?
?
我么通過(guò)如下代碼理解
?
clear the current aggredate results
clear the current group by columnsfor?each input row
begin
????if?the input row does not match the current group by columns
????begin
???????output the current aggreagate results(if?any)
???????clear the current aggreagate results
???????set?the current group by columns to the input row
????end
???update the aggregate results with the input row
end
?
流聚合運(yùn)算符其實(shí)過(guò)程很簡(jiǎn)單,維護(hù)一個(gè)聚合組和聚合值,依次掃描表中的數(shù)據(jù),如果能不匹配聚合組則忽略,如果匹配,則加入到聚合組中并且更新聚合值結(jié)果項(xiàng)。
舉個(gè)例子
SELECT ShipAddress,ShipCity,COUNT(*)
FROM Orders
GROUP BY ShipAddress,ShipCity
所以這里我們已經(jīng)總結(jié)出對(duì)于流聚合的一種優(yōu)化方式:盡量避免排序產(chǎn)生,而要避免排序就需要將分組(Group by)字段在索引覆蓋范圍內(nèi)。
?
?
1.2.?b、哈希聚合
上述的流聚合的方式需要提前排序,我們知道排序是一個(gè)非常大的消耗過(guò)程,所以不適合大表的分組聚合操作,為了解決這個(gè)問(wèn)題,又引入了另外一種聚合運(yùn)算:哈希聚合
所謂的哈希聚合內(nèi)部的方法和本篇前面提到的哈希連接機(jī)制一樣。
哈希聚合不需要排序和過(guò)大的內(nèi)存消耗,并且很容易并行執(zhí)行計(jì)劃,利用多CPU同步進(jìn)行,但是有一個(gè)缺點(diǎn)就是:這一過(guò)程是阻塞的,也就說(shuō)哈希聚合不會(huì)產(chǎn)生任何結(jié)果直到完整的輸入。
所以在大數(shù)據(jù)表中采用哈希聚合是一個(gè)很好的應(yīng)用場(chǎng)景。
?
?
我們知道排序是很耗資源的一件事情,但是利用哈希匹配只需要將不同的列值進(jìn)行提取就可以,所以相比性能而言,無(wú)疑哈希匹配算法在這里是略勝一籌的算法。
?
?
1.3.?所有的最優(yōu)計(jì)劃的選擇都是基于現(xiàn)有統(tǒng)計(jì)信息來(lái)評(píng)估
而上面關(guān)于這兩列內(nèi)容分布類型SQL Server是怎樣知道的?這就是SQL Server的強(qiáng)大的統(tǒng)計(jì)信息在支撐了。
在SQL Server中并不是固定的語(yǔ)句就會(huì)形成特定的計(jì)劃,并且生成的特定計(jì)劃也不是總是最優(yōu)的,這和數(shù)據(jù)庫(kù)現(xiàn)有數(shù)據(jù)表中的內(nèi)容分布、數(shù)據(jù)量、數(shù)據(jù)類型等諸多因素有關(guān),而記錄這些詳細(xì)信息的就是統(tǒng)計(jì)信息。
所有的最優(yōu)計(jì)劃的選擇都是基于現(xiàn)有統(tǒng)計(jì)信息來(lái)評(píng)估,如果我們的統(tǒng)計(jì)信息未及時(shí)更新,那么所評(píng)估出來(lái)最優(yōu)的執(zhí)行計(jì)劃將不是最好的,有時(shí)候反而是最爛的。?
?
?
1.4.?參考資料
?
SQL Server調(diào)優(yōu)系列基礎(chǔ)篇(常用運(yùn)算符總結(jié)——三種物理連接方式剖析) - 指尖流淌 - 博客園.html
?
作者::?綽號(hào):老哇的爪子claw?of Eagle?偶像破壞者Iconoclast?image-smasher
捕鳥王"Bird?Catcher?王中之王King of Kings 虔誠(chéng)者Pious?宗教信仰捍衛(wèi)者?Defender?of?the?Faith.?卡拉卡拉紅斗篷?Caracalla?red cloak
簡(jiǎn)稱::?Emir Attilax?Akbar?埃米爾?阿提拉克斯?阿克巴
全名::Emir Attilax?Akbar?bin Mahmud?bin ?attila bin Solomon?Al?Rapanui?
埃米爾 阿提拉克斯?阿克巴?本 馬哈茂德?本?阿提拉 本 所羅門??阿爾?拉帕努伊???
常用名:艾提拉(艾龍),???EMAIL:1466519819@qq.com
轉(zhuǎn)載請(qǐng)注明來(lái)源:attilax的專欄 ??http://www.cnblogs.com/attilax/
--Atiend
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/attilax/p/6142980.html
總結(jié)
以上是生活随笔為你收集整理的Atitit 数据存储的分组聚合 groupby的实现attilax总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到喂鸡喂鸭是什么意思
- 下一篇: 图测试题部分总结.ing