Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数
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 快速唯一值计数函数的更多相关文章
- Oracle 12cR1中性能优化新特性之全数据库缓冲模式
通常情况下,Oracle会决定哪些数据会留在缓冲区中.当没足够的空间时,数据会被写出内存.此外,为了避免大量读取将有用的信息挤出缓冲区,Oracle对有些操作也许会才去绕过缓冲区的措施.Oracle1 ...
- Oracle12c中性能优化&功能增强新特性之重大突破——内存列存储新特性
内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数据存在内存中的好处显而易见,而列 ...
- Oracle12c中性能优化增强新特性之数据库智能闪存
智能闪存功能最初在XD中引入.从Oracle11.2.0.2开始,除了用于XD存储,还可用于任何闪盘.Oracle12c中,不需卷管理器就可以使用闪盘. 1. 简介 智能闪存在solaris和lin ...
- Oracle12c中性能优化&功能增强新特性之临时undo
临时表最有意思的特点之一是undo段也存储在常规undo表空间中,而它们的undo反过来被redo保护,这会导致一些问题. 1) 写undo表空间需要数据库以读写模式打开,因此,只读数据库和物理备库 ...
- Oracle12c中性能优化&功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护
Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1. 设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- ...
- Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)
Oracle11g中,真实应用测试选项(the Real Application Testing Option)提供了一个有用的特点,叫SQL性能分析器(SQL Performance Analyze ...
- Oracle12c中数据泵新特性之功能增强(expdp, impdp)
Oracle的数据泵功能在10g中被引进.本文对数据泵在12c中的增强做一个概览. 1. 禁用日志选项(DISABLE_ARCHIVE_LOGGING) Impdp的TRANSFORM参数已经扩展 ...
- 浅析Oracle 12c中Data Guard新特性
浅析Oracle 12c中Data Guard新特性 写在前面 无论是做Oracle运维的小伙伴还是老伙伴,想必对Oracle数据库的数据级灾备核心技术—Data Guard是再熟悉不过了!这项从 ...
- Jdk5.0中出现的新特性
掌握jdk5.0中出现的新特性1.泛型(Generics)2.增强的"for"循环(Enhanced For loop)3.自动装箱/自动拆箱(Autoboxing/unboxin ...
随机推荐
- 高并发下,php使用uniqid函数生成唯一标识符的四种方案
PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方案是结 ...
- 对于phy芯片的认识
一,关于phy芯片 以RTL8211E(G)为例 PHY是IEEE802.3中定义的一个标准模块,STA(station management entity,管理实体,一般为MAC或CPU) 通过SM ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- [不屈的复习] - http://how2j.cn/
http://how2j.cn/ 该教程网站分得比较规整!
- MOOC视频学习
mooc地址 2018/2/6-2/7学习计划: 学习第一周(1.1-1.4)内容. 学习笔记 2018/2/8-2/9学习计划: 学习第二周(1.5.2.1-2.5)内容. 学习笔记 2018/2/ ...
- NetMagic Simple Overview
参考: NetMagic Startup: How to develop NetMagic rapidly NetMagic Simple Overview NetMagic 是什么? NetMagi ...
- RN的第一个API-----注册组件Appregistry
首先解释下AppRegistry是JS运行所有React Native应用的入口 什么是入口? 1.在我们初始化一个react native项目的时候 默认的index.ios.js/index.i ...
- python 本地化 local
locale 模块提供了 C 本地化( localization )函数的接口, 如 Example 8-1 所示. 同时提供相关函数, 实现基于当前 locale 设置的数字, 字符串转换. (而 ...
- myEclipse 下配置多个Tomcat
1.进入perfomance 2. 进入server 右键点击configure server connector 3. 切换到 “Arguments” 面板,这里有 一个启动参数,就是修改一下路径 ...
- Qt5_QString_测试
ZC: 下面的测试效果看,可以只是用 “QString.isEmpty()” 或者 “QString == ""”来判断 QString是否为 空或者NULL . 1. 1.1. ...