Oracle11g中,为了改善DBMS_STATS包收集统计信息时的唯一值计数功能,增加了 APPROX_COUNT_DISTINCT函数,但文档中未记载。Oracle12c文档中包括了该函数,因此,我们现在可以在应用中随意使用它。

1.    基本用法

先前的数据库版本中,如果我们想进行唯一值计数,我们可能会这么做。

SELECT COUNT(DISTINCT c_name) AS nm_cnt

FROM   test;

NM_CNT

----------

58172

1 row selected.

SQL>

该查询会基于Oracle的读一致模型得出精确的唯一值结果。即,我们会看到已提交的数据,及当前会话做的未提交修改。

相反,新函数APPROX_COUNT_DISTINCT不会给出精确结果,但会和精确结果有所偏差。

SELECT APPROX_COUNT_DISTINCT(c_name) AS nm_cnt

FROM   test;

NM_CNT

----------

56789

1 row selected.

SQL>

该函数能用于分组查询中。

SELECT tablespace_name,APPROX_COUNT_DISTINCT(table_name) AS tab_count

FROM   user_tables

GROUP BY tablespace_name

ORDER BY tablespace_name;

TABLESPACE_NAME                 TAB_COUNT

------------------------------ ----------

SYSAUX                                 78

SYSTEM                                 22

USERS                                   7

48

4 rows selected.

SQL>

2.    性能

下例中,我们会看到两种方法性能的差别,但似乎不是特别大。

SET TIMING ON

SELECT COUNT(DISTINCT c_name) AS nm_cnt

FROM   test;

NM_CNT

----------

58172

1 row selected.

Elapsed: 00:00:02.39

SQL>

SELECT APPROX_COUNT_DISTINCT(c_name) AS nm_cnt

FROM   test;

NM_CNT

----------

56789

1 row selected.

Elapsed: 00:00:02.00

SQL>

事实上,APPROX_COUNT_DISTINCT函数被用来处理大得多的负载,下面,我们创建一个大得多的表。

DROP TABLE test PURGE;

CREATE TABLE test AS

SELECT level AS  data

FROM  dual

CONNECT BY level <= 10000;

INSERT /*+ APPEND */ INTO test

SELECT a.data FROM test a

CROSS JOIN test b;

COMMIT;

EXEC DBMS_STATS.gather_table_stats(‘Test’,'Test');

现在表中有100多万数据,1万个唯一值。我们会看到两种方法的性能差别比较大。

SET TIMING ON

SELECT COUNT(DISTINCT data) AS data_count

FROM  test;

DATA_COUNT

----------

10000

1 row selected.

Elapsed: 00:00:19.66

SQL>

SELECT APPROX_COUNT_DISTINCT(data) ASdata_count

FROM  test;

DATA_COUNT

----------

10030

1 row selected.

Elapsed: 00:00:10.46

SQL>

通过测试会发现,之前的方法,当数据量越来越大时,消耗的时间和资源也会越来越大,而新函数APPROX_COUNT_DISTINCT在数据量越来越大时,消耗的时间和资源基本不变。

Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数的更多相关文章

  1. Oracle 12cR1中性能优化新特性之全数据库缓冲模式

    通常情况下,Oracle会决定哪些数据会留在缓冲区中.当没足够的空间时,数据会被写出内存.此外,为了避免大量读取将有用的信息挤出缓冲区,Oracle对有些操作也许会才去绕过缓冲区的措施.Oracle1 ...

  2. Oracle12c中性能优化&amp;功能增强新特性之重大突破——内存列存储新特性

    内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数据存在内存中的好处显而易见,而列 ...

  3. Oracle12c中性能优化增强新特性之数据库智能闪存

    智能闪存功能最初在XD中引入.从Oracle11.2.0.2开始,除了用于XD存储,还可用于任何闪盘.Oracle12c中,不需卷管理器就可以使用闪盘. 1.  简介 智能闪存在solaris和lin ...

  4. Oracle12c中性能优化&amp;功能增强新特性之临时undo

    临时表最有意思的特点之一是undo段也存储在常规undo表空间中,而它们的undo反过来被redo保护,这会导致一些问题. 1)  写undo表空间需要数据库以读写模式打开,因此,只读数据库和物理备库 ...

  5. Oracle12c中性能优化&amp;功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

    Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1.   设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- ...

  6. Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)

    Oracle11g中,真实应用测试选项(the Real Application Testing Option)提供了一个有用的特点,叫SQL性能分析器(SQL Performance Analyze ...

  7. Oracle12c中数据泵新特性之功能增强(expdp, impdp)

    Oracle的数据泵功能在10g中被引进.本文对数据泵在12c中的增强做一个概览. 1.   禁用日志选项(DISABLE_ARCHIVE_LOGGING) Impdp的TRANSFORM参数已经扩展 ...

  8. 浅析Oracle 12c中Data Guard新特性

    浅析Oracle 12c中Data Guard新特性   写在前面 无论是做Oracle运维的小伙伴还是老伙伴,想必对Oracle数据库的数据级灾备核心技术—Data Guard是再熟悉不过了!这项从 ...

  9. Jdk5.0中出现的新特性

    掌握jdk5.0中出现的新特性1.泛型(Generics)2.增强的"for"循环(Enhanced For loop)3.自动装箱/自动拆箱(Autoboxing/unboxin ...

随机推荐

  1. linux查看是否能访问外网及拥有的公网IP

    linux查看是否能访问外网及拥有的公网IP linux查看是否能访问外网及拥有的公网IP: 1,测访问外网能力:curl -l http://www.baidu.com 2,测访问外网能力:wget ...

  2. Github使用教程(一)------ 初识Github

    上一节我们解决了Github网站响应慢,加载不完全的情况,接下来我们就要正式开始使用Github了. :好,那我先安装Git,稍后就上传项目. :......你Github网站都看懂了? :还需要看懂 ...

  3. Metasploit应用举例

    本篇文章包含以下几方面内容: 1.Metasploit端口扫描: 2.用其他模块 3.metasploit smb获取系统信息 4.Metsploit服务识别 5.ftp识别: 6.metasploi ...

  4. Python3基础 while 斐波那契数列

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. Farey Sequence (素筛欧拉函数/水)题解

    The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/ ...

  6. 读jQuery源码有感2

    那么就来读读jQuery源码的Callbacks部分. 一上来看原版源码 jQuery.Callbacks = function( options ) { // Convert options fro ...

  7. Z-score(Z值)的意义--转载

    http://blog.sina.com.cn/s/blog_72208a6a0101cdt1.html http://www.docin.com/p-350677620.html http://we ...

  8. React Native基础概念和基础认识

    学习地址:https://github.com/vczero/react-native-lesson 当我们初始化一个RN项目的时候主要的是index.ios.js文件和index.android.j ...

  9. python input输入元素相加

    sum= number= while True: : break number=int(input('数字0为结束程序,请输入数字: ')) sum+=number print('目前累加的结果为: ...

  10. 《剑指offer》第二十二题(链表中倒数第k个结点)

    // 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...