閱讀223 返回首頁    go 汽車大全


從Approx_Count_Distinct到M7的CPU集成

昨天和朋友交流,聯想起Oracle的兩個特性,approx_count_distinct 和 SQL in Silicon,從軟件到硬件,從典型SQL入手的優化,Oracle一步一步走向細節和性能的極致


在Oracle 12c中,有一個新的函數被引入進來 - approx_count_distinct 。這個函數的作用是,當我們進行Count Distinct計算時,給出一個近似值。

TOM說,這個函數會帶來5x ~ 50x的性能提升,精度可以達到97%以上。在不需要絕對精確的返回值時,這個函數可以發揮其顯著的功效。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

這個估算值不絕對精確,但是在很多情況下足夠,又可以極大的節省資源。在很多係統中,COUNT DISTINCT是個常見的操作,如果使用這個函數,則可能帶來很好的性能改善。


以下是我非常簡單的一個測試,可以看到基本的效果:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

在簡單的小數據量測試中,很可能看不到幾十倍的改變。approx_count_distinct在大數據量下的表現會非常好,資源使用非常低,極其穩定

以下幾張圖引自數據庫專家 Christian Antognini的測試,網頁鏈接如下:

https://antognini.ch/2014/10/the-approx_count_distinct-function-a-test-case/


以下兩圖可以看到近似計算在大數據量下的響應時間穩定,內存消耗很少,這在大數據量的計算環境下,改進是顯著的:


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

而且,這個估算值的偏差很小,如同TOM所有,通常97%的準確性,並且有信心達到95%,下圖也很好的驗證了這個偏離範圍:

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

這讓我聯想到Oracle的M7處理器,其中的Software / SQL IN Silicon,Oracle進一步將那些常見的COUNT取值SQL固化進了CPU,進一步為用戶帶來10幾倍的性能提升

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

count(*) 和 count distinct 都是非常常見的操作,也很消耗資源。從常見、常用的SQL入手,Oracle的一點點改進都會給用戶帶來幫助,在細節上的優化Oracle做到極致了。


文章轉自數據和雲公眾號,原文鏈接

最後更新:2017-07-18 12:03:23

  上一篇:go  Oracle 12c: arraysize會影響結果集麼?
  下一篇:go  不以規矩 不成方圓