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. 高并发下,php使用uniqid函数生成唯一标识符的四种方案

    PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方案是结 ...

  2. 对于phy芯片的认识

    一,关于phy芯片 以RTL8211E(G)为例 PHY是IEEE802.3中定义的一个标准模块,STA(station management entity,管理实体,一般为MAC或CPU) 通过SM ...

  3. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  4. [不屈的复习] - http://how2j.cn/

    http://how2j.cn/ 该教程网站分得比较规整!

  5. MOOC视频学习

    mooc地址 2018/2/6-2/7学习计划: 学习第一周(1.1-1.4)内容. 学习笔记 2018/2/8-2/9学习计划: 学习第二周(1.5.2.1-2.5)内容. 学习笔记 2018/2/ ...

  6. NetMagic Simple Overview

    参考: NetMagic Startup: How to develop NetMagic rapidly NetMagic Simple Overview NetMagic 是什么? NetMagi ...

  7. RN的第一个API-----注册组件Appregistry

    首先解释下AppRegistry是JS运行所有React Native应用的入口  什么是入口? 1.在我们初始化一个react native项目的时候 默认的index.ios.js/index.i ...

  8. python 本地化 local

    locale 模块提供了 C 本地化( localization )函数的接口, 如 Example 8-1 所示. 同时提供相关函数, 实现基于当前 locale 设置的数字, 字符串转换. (而 ...

  9. myEclipse 下配置多个Tomcat

    1.进入perfomance 2. 进入server  右键点击configure server connector 3. 切换到 “Arguments” 面板,这里有 一个启动参数,就是修改一下路径 ...

  10. Qt5_QString_测试

    ZC: 下面的测试效果看,可以只是用 “QString.isEmpty()” 或者 “QString == ""”来判断 QString是否为 空或者NULL . 1. 1.1. ...