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在数据量越来越大时,消耗的时间和资源基本不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Oracle Database 12c性能优化攻略是一本介绍如何优化Oracle 12c数据库性能的实用指南。这本PDF提供了一些宝贵的技巧和技术,帮助用户最大限度地提升数据库的性能。 首先,该PDF介绍了Oracle 12c的一些新特性,如In-Memory Option和Multi-Tenancy,这些特性可以显著提升数据库的性能。它还提供了一些实际案例,帮助读者了解如何使用这些新特性来优化数据库。 其次,该PDF强调了优化查询语句的重要性。它详细说明了如何编写高效的查询,如何使用索引和减少IO操作等。此外,它还介绍了一些高级查询优化技术,如使用连接和子查询等。 此外,该PDF还涵盖了数据库存储和文件组织的优化。它介绍了如何优化表空间的设置、数据文件的组织以及如何使用表空间和数据文件的常见问题和解决方案。 最后,该PDF还介绍了一些性能监控和调优的工具和技术。它提供了一些重要的SQL脚本和查询,帮助读者了解如何监控数据库性能,并快速定位和解决性能问题。 总之,Oracle Database 12c性能优化攻略PDF是一本很有用的工具,能帮助用户最大化利用Oracle 12c的性能优势。无论是初学者还是有经验的DBA,都可以从学到很多优化数据库性能的技巧和知识。 ### 回答2: 《Oracle Database 12c性能优化攻略》PDF是一本关于如何优化使用Oracle数据库12c的指南。本书详细介绍了一系列技术和策略,帮助用户提高数据库的性能和效率。 这本书首先介绍了Oracle数据库12c的基本知识,包括数据库架构、内存结构、关键配置等。它还讲解了性能优化的整体方法论,包括性能评估、问题定位和解决方案。读者可以通过学习这些基础知识,建立起对数据库性能优化的整体认识。 然后,书详细描述了常见的性能问题和解决办法。它覆盖了查询优化、索引优化、SQL调优、存储优化等多个方面。读者可以学习如何合理设计和使用索引,如何编写高效的SQL查询语句,如何利用数据库特性和工具进行存储和内存管理等。这些技巧和策略可以帮助读者最大化地提升数据库性能。 此外,本书还介绍了一些高级技术和工具,如分区表、并行处理、SQL监视器等。这些技术可以帮助读者进一步提升数据库的运行效率,并解决一些特定的性能问题。 总之,《Oracle Database 12c性能优化攻略》PDF提供了丰富的知识和实用的技巧,可以帮助读者充分利用Oracle数据库12c的性能潜力。无论是数据库管理员还是开发者,都可以从这本书获得有关性能优化的宝贵经验。 ### 回答3: Oracle Database 12c性能优化攻略PDF是一本介绍如何优化Oracle数据库12c性能的电子书。该书通过详细的实例和案例,提供了从开发、配置到监控和调优的全方位指南。 首先,该书介绍了Oracle Database 12c的新特性,如多租户架构、数据库资源管理和自动化存储管理等。这些特性可以帮助开发人员更好地使用数据库资源,提高应用程序的性能。同时,该书还提供了关于如何正确配置Oracle数据库的建议,以确保数据库的最佳性能。 其次,该书对数据库的监控和调优进行了深入讲解。它介绍了如何使用Oracle Enterprise Manager和AWR报告来监控数据库的性能,并提供了一些常见性能问题的解决方案。同时,该书还介绍了一些专业的性能调优工具和技巧,如使用SQL调优顾问和自动诊断工具等。 此外,该书还讨论了一些常见的性能优化场景,如查询优化、并发控制、索引设计和表分区等。它提供了一些实用的技巧和方法,帮助读者优化他们的SQL查询和数据库设计,以提高系统的响应时间和吞吐量。 总的来说,Oracle Database 12c性能优化攻略PDF是一本全面而实用的Oracle数据库性能优化指南。无论是Oracle数据库管理员还是开发人员,都可以从学习到许多有关如何最大化数据库性能的技巧和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhdz_bj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值