- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深⼊理解 Oracle 动态采样
动态采样介绍
Oracle 动态采样(Dynamic Sampling,12c 称为 Dynamic statistics) ,是对统计信息的⼀个重要补充,当数
据动态变化,⽆法⽤典型的统计信息描述时,动态采样可以给在解析时对表中数据进⾏采样,为优化器提供
准确的估算值(cardinality)。动态采样的主要有以下⼏个应⽤场景:
⼀个经典的场景就是业务场景中的临时表,⽐如 ETL 数据清洗转换过程中的临时表,⽐如 BI 系统中存
放计算报表结果的临时表。这些临时表可能是 Oracle 中的 global temporary table ,也可能是正常的堆
表。因为临时表中的数据时动态变化的,不同时间点,临时表中的数据量变化很⼤,没有⼀种合适的统
计信息使优化器产⽣合适的执⾏计划。这种场景适合采⽤动态采样技术,通常会删除临时表上的统计信
息,并且锁定统计信息,不让搜集统计信息的 Job 更新临时表上的统计信息,查询临时表时,优化器会
对临时表进⾏动态采样,以确定临时表的 cardinality 。
另⼀个场景是在单表上使⽤组合过滤条件,并且组合过滤条件并不是简单的相等操作,或者在过滤列上
使⽤转换函数,⽆法使⽤ column group 扩展统计信息,简单使⽤多个列上的统计信息也⽆法产⽣合适
的统计信息。
12c 之前,动态采样只能预估单表 cardinality ,12c 版本,Oracle 对动态采样做了很⼤的增强,可以估
算 group by 的聚合结果集和连接结果集的 cardinality 。
使⽤动态采样,优化器往往可以获得⾼质量的估算值,从⽽产⽣更优化的执⾏计划。本⽂将介绍三种个动态
采样的适⽤场景。
临时表和动态采样
优化器动态采样解析
实际案例
⾦融⾏业客户 CRM 系统的分析语句执⾏时间经常需要5分钟以上,通过分析 Top SQL的执⾏计划,发现执⾏
计划的估算值偏差离谱,⽐如下图SQL Monitor 报告中,对于表 P_CUST_STAT ,优化器估算值为1,实际
值为⼀千四百万⾏。导致后续连接⽅式为 nested loop ,被驱动表被访问了⼀千四百万次。
通过表的统计信息,可以发现10⽉9号搜集统计信息时,表 P_CUST_STAT 中没有数据, Num_Rows 为0
⾏,所以优化器估算为1⾏。虽然 P_CUST_STAT 是正常对表,但是在应⽤中被⽤于临时表,数据是动态⽣
成和删除的。
另⼀个例⼦,下图 SQL Monitor 报告中,表 B_S_CUST_STAT 的过滤条件
为 Data_date = to_dateyyyymmdd) , 估算值同样为⼀⾏,实际值为⼀千四百万⾏,
导致后续连接⽅式为 nested loop outer ,被驱动视图表访问了⼀千四百万次,
通过表 B_S_CUST_STAT 的统计信息,统计信息收集时间为10⽉9号早上8点, Num_Rows 为⼀千三百七
⼗万⾏记录,看起来表上的统计信息是正确的。
继续查看 B_S_CUST_STAT 列上的统计信息,Data_date 列上只有⼀个唯⼀值,为10⽉7号。
表 B_S_CUST_STAT 只存放⼀天的数据,当统计信息搜集时,表中的数据为10⽉7号的数据。之后,数据被
替换为10⽉8号的数据,统计信息并没有及时更新,导致当天之后对表 P_CUST_STAT 的使⽤
Data_date = to_dateyyyymmdd) 的查询的估算值都为1.
create or replace function raw_to_date(i_raw raw)
return date
as
m_n date;
begin
dbms_stats.convert_raw_value(i_raw,m_n);
return m_n;
end;
/
select raw_to_date(78740 stats_value from dual;
STATS_VALUE
2016-10-07 00:00:00
解决⽅案
删除表 B_S_CUST_STAT 和 P_CUST_STAT 的统计信息并且进⾏锁定,保证后续对临时表的查询会使⽤
动态采样,得到准确的估算值。
Exec dbms_stats.delete_table_stats(‘CRM’,’B_S_CUST’);
Exec dbms_stats.lock_table
您可能关注的文档
最近下载
- 180°剥离力测试规范.doc VIP
- 行政执法人员资格认证通用法律知识考试单选题.docx VIP
- PP料 MSDS 物质安全表.pdf VIP
- 2025下半年高级软件水平考试(系统规划与管理师)案例分析真题及解析.pdf VIP
- 2025至2030全屋定制家具行业市场深度研究与战略咨询分析报告.docx VIP
- 福建省工会系统经审业务技能竞赛知识题库及答案(1692题).docx VIP
- 变电站脚手架专项施工方案.pdf VIP
- 道闸维修合同协议.docx VIP
- 16MR607 城市道路─节能环保型聚氯乙烯市政护栏.docx VIP
- 第一单元 100以内数加与减(二)教案-2025-2026学年北师大版二年级数学上册.pdf VIP
文档评论(0)