从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做到极致了。
扫描二维码,回复“2015OTC”可以获得"2015嘉年华大会"所有的PPT资源下载。