223
汽車大全
從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%以上。在不需要絕對精確的返回值時,這個函數可以發揮其顯著的功效。
這個估算值不絕對精確,但是在很多情況下足夠,又可以極大的節省資源。在很多係統中,COUNT DISTINCT是個常見的操作,如果使用這個函數,則可能帶來很好的性能改善。
以下是我非常簡單的一個測試,可以看到基本的效果:
在簡單的小數據量測試中,很可能看不到幾十倍的改變。approx_count_distinct在大數據量下的表現會非常好,資源使用非常低,極其穩定。
以下幾張圖引自數據庫專家 Christian Antognini的測試,網頁鏈接如下:
https://antognini.ch/2014/10/the-approx_count_distinct-function-a-test-case/
以下兩圖可以看到近似計算在大數據量下的響應時間穩定,內存消耗很少,這在大數據量的計算環境下,改進是顯著的:
而且,這個估算值的偏差很小,如同TOM所有,通常97%的準確性,並且有信心達到95%,下圖也很好的驗證了這個偏離範圍:
這讓我聯想到Oracle的M7處理器,其中的Software / SQL IN Silicon,Oracle進一步將那些常見的COUNT取值SQL固化進了CPU,進一步為用戶帶來10幾倍的性能提升。
count(*) 和 count distinct 都是非常常見的操作,也很消耗資源。從常見、常用的SQL入手,Oracle的一點點改進都會給用戶帶來幫助,在細節上的優化Oracle做到極致了。
文章轉自數據和雲公眾號,原文鏈接
最後更新:2017-07-18 12:03:23