暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 关于近似查询处理

原创 Asher.HU 2021-02-04
1884


近似查询处理是一组优化技术,可以通过在可接受的误差范围内计算结果来加快分析查询的速度。

商业智能(BI)查询很大程度上依赖于涉及聚合函数,例如排序COUNT DISTINCTSUMRANK,和MEDIAN例如,一个应用程序生成的报告显示已登录多少不同客户,或者上周最受欢迎的产品。BI应用程序具有以下要求并不少见:

  • 查询必须能够处理比传统数据仓库大几个数量级的数据集。

    例如,一个流行网站的每日Web日志量每天可以达到数十或数百TB。

  • 查询必须提供接近实时的响应。

    例如,一家公司要求快速检测并应对信用卡欺诈。

  • 大数据集的探索性查询必须快速。

    例如,用户可能希望找出其销售额已大致达到特定阈值的部门列表。用户将在这些部门上形成有针对性的查询,以查找更详细的信息,例如确切的销售编号,这些部门的位置等等。

对于大型数据集,精确的聚合查询会占用大量内存,通常会溢出到临时空间,而且速度可能会令人无法接受。应用程序通常对通用模式比对精确结果更感兴趣,因此客户愿意为速度牺牲精确性。例如,如果目标是显示描述最受欢迎产品的条形图,那么从统计上讲,售出的产品是100万个单位还是99.000万个单位就无关紧要。

Oracle数据库通过近似查询处理来实现其解决方案。通常,近似聚合的准确性超过97%(置信度为95%),但是处理时间要快几个数量级。数据库使用较少的CPU,并避免了写入临时文件的I / O成本。

也可以看看:

 NDV算法:自适应采样和HyperLogLog 

 

4.5.1近似查询初始化参数

您可以通过使用初始化参数来实现近似查询处理,而无需更改现有代码 APPROX_FOR_*

数据库会话级别设置这些参数。下表描述了与近似技术有关的初始化参数和SQL函数。

表4-2近似查询初始化参数

初始化参数默认描述也可以看看

APPROX_FOR_AGGREGATION

FALSE

启用(TRUE)或禁用(FALSE)近似查询处理。此参数充当用于启用返回近似结果的函数的伞形参数。

Oracle数据库参考

APPROX_FOR_COUNT_DISTINCT

FALSE

转换COUNT(DISTINCT)APPROX_COUNT_DISTINCT

Oracle数据库参考

APPROX_FOR_PERCENTILE

none

将符合条件的精确百分位数函数转换为其APPROX_PERCENTILE_*对应的百分位数函数

Oracle数据库参考

也可以看看:


4.5.2近似查询SQL函数

近似查询处理使用SQL函数提供对近似可接受的探索性查询的实时响应。

下表描述了返回近似结果的SQL函数。

表4-3近似查询用户界面

SQL函数描述也可以看看

APPROX_COUNT

函数一起使用时,计算最常见的n个近似值APPROX_RANK

返回表达式的近似计数。如果您提供MAX_ERROR作为第二个参数,则该函数返回实际计数与近似计数之间的最大误差。

您必须将此功能与子句中的相应APPROX_RANK功能一起使用HAVING如果查询使用APPROX_COUNTAPPROX_SUMAPPROX_RANK,则查询不得使用任何其他非近似聚合函数。

以下查询返回每个部门中最常见的10个工作:

SELECT department_id, job_id, 
       APPROX_COUNT(*) 
FROM   employees
GROUP BY department_id, job_id
HAVING 
  APPROX_RANK ( 
  PARTITION BY department_id 
  ORDER BY APPROX_COUNT(*) 
  DESC ) <= 10;

Oracle数据库SQL语言参考

APPROX_COUNT_DISTINCT

返回包含表达式的不同值的大约行数。

Oracle数据库SQL语言参考

APPROX_COUNT_DISTINCT_AGG

将预先计算的近似计数不同的概要聚合到更高的级别。

Oracle数据库SQL语言参考

APPROX_COUNT_DISTINCT_DETAIL

返回的摘要 APPROX_COUNT_DISTINCT以BLOB形式函数

数据库可以将返回的结果持久保存到磁盘以进行进一步聚合。

Oracle数据库SQL语言参考

APPROX_MEDIAN

接受数字或日期时间值,并返回近似中间值或近似插值值,当对这些值进行排序时,该中间值或中间值将为中间值。

此功能提供了该功能的替代MEDIAN方法。

Oracle数据库SQL语言参考

APPROX_PERCENTILE

接受一个百分位数值和一个排序规范,并返回一个相对于该排序规范落入该百分位数值的近似插值。

此功能提供了该功能的替代PERCENTILE_CONT方法。

Oracle数据库SQL语言参考

APPROX_RANK

返回一组值中的近似值。

此函数带有一个可选PARTITION BY子句,后跟一个强制ORDER BY ... DESC子句。PARTITION BY密钥必须的一个子集GROUP BY密钥。ORDER BY子句必须包含APPROX_COUNTAPPROX_SUM

Oracle数据库SQL语言参考

APPROX_SUM

函数一起使用时,计算大约前n个累加值APPROX_RANK

如果提供MAX_ERROR作为第二个参数,则该函数将返回实际和近似值之间的最大误差。

您必须将此功能与子句中的相应APPROX_RANK功能一起使用HAVING如果查询使用APPROX_COUNTAPPROX_SUMAPPROX_RANK,则查询不得使用任何其他非近似聚合函数。

以下查询返回每个部门中薪资总额最高的10种工作类型:

SELECT department_id, job_id, 
       APPROX_SUM(salary) 
FROM   employees
GROUP BY department_id, job_id
HAVING 
  APPROX_RANK ( 
  PARTITION BY department_id 
  ORDER BY APPROX_SUM(salary) 
  DESC ) <= 10;

请注意,APPROX_SUM如果输入为负数,则返回错误。

Oracle数据库SQL语言参考

也可以看看:

《 Oracle数据库数据仓库指南》以了解有关近似查询处理的更多信息

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论