IT技術互動交流平台

SQL Server聚焦查詢計劃Stream Aggregate VS Hash Match Aggregate(二十)

作者|_暧昧的颜色:JeffckyWang  來源威海卫生365:IT165收集  發布日期-|106官方彩票官网:2016-12-16 20:35:41

前言

之前係列中在查詢計劃中一直出現Stream Aggregate_注册送彩金的彩票平台,當時也隻是做了基本了解|_深圳都市频道节目表,對於查詢計劃中出現的操作|_|我是歌手第十二期排名,我們都需要去詳細研究下__|陈世祯,隻有這樣才能對查詢計劃執行的每一步操作都了如指掌_|_布依苏脑王,所以才有了本文的出現||_永盛国际彩票刷流水,簡短的內容--支撑架图片,深入的理解|-_优秀教师的先进事迹,Always to review the basics_|辽宁彩铃。

Stream Aggregate

Stream Aggregate通過單列或者多列來對行進行分組並且對指定的查詢來計算聚合表達式|--台海战争。最常見的聚合類型如SUM||邢利斌、COUNT|_|金瓜钺斧朝天蹬、SUM_||杂音未来的歌、AVG__|众发娱乐app官网下载、MIN__-12371共产党员网、MAX-_王小麟,當我們執行這些聚合函數時在查詢計劃中就會出現Stream Aggregate__重庆力帆少东家,Stream Aggregate是非常快的-_cctv13在线直播百度影音,因為它需要在輸入時通過在GROUP BY中指定的列進行排序-|_陕西地震网。如果聚合中的數據沒有進行排序此時會通過Sort進行預排序或者使用索引查找或者索引掃描來提前預排序數據-_-女演员陈嘉男。之前我們討論過出現Stream Aggregate有三種方式分別為-_榆树徐大伟:聚合函數聚合--_亿发彩票安不安全,分組聚合_-_公办专科学校,DISTINCT聚合_|moko美空模特路遥,實際上隻有兩種|-_奥术扰动,DISTINCT內部就用到了分組--|哈雷摩托价格,這裏我們將Stream Aggregate分為兩種類型--|中博彩票投诉,一種是標量聚合|-_想爱都难主题曲,另外一種則是分組聚合-|风来照相馆。我們舉一個標量聚合的例子--铍矿,也就是返回單值聚合-|-20元提现的棋牌app。

標值聚合

USE TSQL2012
GO

SELECT COUNT(*)
FROM Sales.Orders

下麵我們再來分組聚合的例子

USE TSQL2012
GO

SELECT custid
FROM Sales.Orders
GROUP BY custid

上述就是Stream Aggregate兩種類型的例子贵遵高速车祸,關於標量聚合比較簡單直接利用聚合函數就行_-_甜甜圈歌词,下麵我們主要詳細講解這兩種類型中的分組聚合|-_杨镇一中网。

分組聚合

我們來結合SQL Server 2012基礎教程來看一個簡單的例子

USE TSQL2012
GO

SELECT custid, COUNT(shipcity) AS [shipcity_count]
FROM Sales.Orders
GROUP BY custid

上述查詢計劃比較簡單我們來解釋下||云端彩票是怎么回事,首先通過默認主鍵創建的聚集索引來讀取表中行數據|-_网游之幸运魔剑士,接著通過GROUP BY上指定的列custid來進行排序__-芭耐得,我們看到其排序操作具體信息就知道|--阜南县教育局,如下_-陕西省职业技能鉴定指导中心。接著遍曆所有custid|_-长春市艺术实验中学,所有行被讀取|_色拉拉,開始一行行讀取並計算其聚合表達式的值-destinywarfare。重複處理直到完成為止|--256手机彩票软件怎么样。

對於通過流聚合對custid進行分組的示意圖大概如下|-易彩集团10元赚钱:

上述由於未對custid創建索引導致所以會通過Sort來進行排序_|qq水浒媚李立,毫無疑問導致查詢緩慢|-青燕,這裏我們對custid創建非聚集索引再來看看情況

CREATE NONCLUSTERED INDEX idx_nc_custid ON Sales.Orders(custid)

 

此時查詢將會充分利用索引-|易旺彩票网下载,它會通過使用索引排序來進行聚合計算|-海鑫钢材信息网,所以就不會再利用Sort來排序導致性能低下||_说不得大师,通過上述我們知道___劲蛟龙,在進行Stream Aggregate之前事實上在指定的分組列上創建索引來預先排序會提高查詢性能_|_258nba竞彩,而不需要再去利用Sort進行排序而耗費不必要的時間_|_35彩票注册。上述我們已經說過在進行排序要麼在GROUP BY上指定的列通過創建索引查找或者索引排序_-张靓颖间歇性失聪,如果GROUP BY中的列沒有創建索引此時利用Sort來進行顯示排序||亿彩彩票app,如下顯示指定ORDER BY custid來排序和沒有指定的話結果依然都是使用Sort來排序||-钛锗手链,此時Stream Aggregate__盈盈彩,其實這種說法不太準確-姫川梨乃,因為在SQL Server中有兩種聚合方式--|134期四不像特肖图,一種是Stream Aggregate_-众购彩票开奖直播网,另外一種則是Hash Match Aggregate-|_优衣库bt。

USE TSQL2012
GO

SELECT custid, COUNT(shipcity) AS [shipcity_count]
FROM Sales.Orders
GROUP BY custid
ORDER BY custid

自從SQL Server 7之後就出現了Stream Aggregate和Hash Aggregate兩種聚合方式_-小腻腻博客,也就是說上述我們稍作修改查詢計劃就變成了Hash Aggregate的形式|-_自由们7 42官方下载。

USE TSQL2012
GO

DBCC RULEOFF('GbAggToStrm');
GO

SELECT custid, COUNT(shipcity) AS [shipcity_count]
FROM Sales.Orders
GROUP BY custid
OPTION(RECOMPILE)
GO

DBCC RULEON('GbAggToStrm');

上述GbAggToStrm是什麼鬼_-易彩彩民福地登录,其實如果查詢計劃中走的Stream Aggregate操作的話__黑车交易,也就說它走的是GbAggToStrm規則(GROUP BY Aggregate To Stream )_易彩压大小怎么玩,但是這裏我們關閉了查詢計劃本該走的Stream Aggregate操作即GbAggToStrm規則众博彩票进去网址,所以此時它將隻能走Hash Aggregate|-运盛彩票官网。所以到這裏說明在排序時即使指定了ORDER BY操作有可能是多餘的_-自制载人飞机,但是如果我們不指定的話-_|另类擦皮鞋歌词,要是我們希望返回的結果集是排序的|_长沙王府井影城,此時要是走的Hash Aggregate|_家在远方 许鹤缤,結果返回的結果集將是無序的_||亿客隆彩票网,導致我們得不到想要的結果集|078彩票计划,所以還是希望在排序時指定ORDER BY操作--|产品说明书范文,這樣能夠避免不必要的情況發生|_赢天下什么时候上映。

DISTINCT在Hash Match Aggregate和Stream Aggregate和DISTINCT Sort中的使用

當查詢中用到了DISTINCT關鍵字時_--369彩票平台,此時查詢計劃有可能走Stream Aggregate|-_众富彩票官网,也有可能走的是Hash Match Aggregate_-北京466耳鼻喉医院。所以在這裏我們分析下什麼時候會用Hash Match Aggregate-|118彩票安装苹果,什麼時候又會用到Stream Aggregate-_随意贴。說到底DISTINCT關鍵字時用來去重的_|-淮安草根网,在SQL Server中利用DISTINCT關鍵字來去重其查詢計劃走的方式分為兩種_--大老虎周永慷,一種是在哈希表中建立唯一值|_盈彩网三分时时彩定位,另外一種則是將行進行排序分配到組中然後隻返回組中的一個值即可_qq2011下载。所以在SQL Server中使用Hash Match Aggregate來實現哈希表-_亿发彩票下载,使用Stream Aggregate或者DISTINCT Sort來對數據進行排序去重||魔龙辅助。

使用DISTINCT關鍵字走DISTINCT Sort

當我們如下直接利用DISTINCT來查詢時就是利用的DISTINCT Sort來排序去重|||羁绊3 1d攻略。

USE TSQL2012
GO

select DISTINCT custid 
FROM Sales.Orders

雖然很明確走的Sort|注册送39元彩金的彩票,但是這是經過SQL查詢引擎優化過後才有的_||武汉苏泊尔炊具有限公司,最原始的情況是先進行Sort接著進行Stream Aggregate_-亿彩彩票正规嘛,下麵我們關閉Sort的規則看看--36选7开奖怎么算中奖。

USE TSQL2012
GO

DBCC RULEOFF('GbAggToSort')
SELECT DISTINCT custid
FROM Sales.Orders
OPTION(RECOMPILE)

DBCC RULEON('GbAggToSort')

使用DISTINCT關鍵字走Hash Match Aggregate

當未在列SomeColumn創建索引時我們進行如下查詢

USE TSQL2012
GO

SELECT DISTINCT SomeColumn
FROM dbo.BigTable

接下來我們在列上創建索引

CREATE NONCLUSTERED INDEX idx_noncls_somecolumn ON dbo.BigTable(SomeColumn)

在創建索引時此時查詢計劃走的卻是Stream Aggregate-|-陈蓉照片,也就是說當利用DISTINCT關鍵字查詢時且列已經進行了排序--31选七走势图,此時查詢計劃走Stream Aggregate_壮警的烦恼(h) txt。那什麼時候用Hash Match Aggregate呢--性价比最高笔记本电脑,上述對列未創建索引時走的是Hash Match Aggregate因為數據量比較大此時還利用了並行計算长沙友谊商店招聘,換句話說當對列未創建索引時且數據量非常大同時分組比較少時--|诛仙飞升任务流程,查詢計劃更加更傾向於走Hash Match Aggregate--|语笑今生,輸入大量的數據通過Hash Match Aggregate結合並行計算效率也非常高--|众益彩票中国彩,當然分組較少更好-_|许鹤缤 家在远方,此時不會太占用哈希表__-火瀑吧。接下來我們限製查詢結果集的條數|-_kb女烈。

USE TSQL2012
GO

SELECT DISTINCT TOP 10 SomeColumn
FROM dbo.BigTable

此時查詢計劃不再是Hash Match Aggregate代替的是Hash Match(Flow Distinct)我們看下msdn關於Flow Distinct的解釋__铠装光缆型号:Flow Distinct邏輯運算符用於通過掃描輸入來刪除重複項___双线盗毒蛾。雖然Distinct 運算符在生成任何輸入前消耗所有的輸入|__自由们7 39下载,但FlowDistinct 運算符在從輸入獲得行時返回每行(除非該行是一個重複項-_芜湖白金汉宫,若是這樣則刪除該行)

也就是說DISTINCT直接就過濾了重複行|_256cp彩票,而Flow Distict則獲得每行時並返回每一行||众彩彩票平台,這就是Flow Distinct|--衡水热线,它的出現依賴於在查詢計劃中估計唯一值的數量|众亿大厅作弊器,當我們將TOP的數量設置為接近100萬或者比100萬還少一點時此時走的是Hash Match Aggregate||东莞酒店一条龙服务。到此我們關於Hash Match Aggregate和Stream Aggregate的分析算是結束了--_诸沁微,我們下個基本結論__量子力学教程周世勋:

Hash Match Aggregate和Stream Aggregate分析結論__镭波吧:

(1)查詢中有DISTINCT關鍵字時-_当前热门话题:當在查詢列上創建索引時即列進行了排序時此時走Stream Aggregate-闽江学院教务处,當數據量非常大時且未創建索引時此時一般走的是Hash Match Aggregate並結合並行計算-|诺基亚6120软件下载,其餘情況則是走的Distinct Sort||_莱贝吉。

(2)查詢中沒有DISTINCT關鍵字時-_038彩票平台坑人吗,對於標量聚合和分組聚合走的是Stream Aggregate-|舞狮子表演价格。

總結

好了本節關於Hash Match Aggregate和Stream Aggregate的介紹就到此為止_众盈彩票的骗局揭秘,基本算是了解-|聚美优品网页打不开,太複雜的也沒去過多探討--狩猎狂狮,這是DBA的事情了-铁三角ath t50,下一節我們穿插講講關於計算列持久化係列文章-舞龙舞狮的由来,簡短的內容|_阴宅风水网,深入的理解_|_陕西省职业技能鉴定指导中心,我們下節再會|||历任北京市委书记。 

延伸閱讀-|宅男躲艳记txt下载:

Tag標簽-|-2元中国福利彩票怎么买: SQL   Server聚焦查詢計劃Stream   Aggregate   VS   Hash  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統||_上辈子的五百次回眸、資料備份|gts3370、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
江苏快三秒速牛牛全民彩票K8彩票全民彩票秒速快3

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!