查看原文
其他

从Approx_Count_Distinct到M7的CPU集成

2015-12-17 盖国强 Oracle

昨天和朋友交流,联想起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资源下载。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存