加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle 11g说明表上的并发统计信息网络

发布时间:2021-05-22 20:10:08 所属栏目:站长百科 来源:网络整理
导读:我在Oracle 11g上开拓DWH.我们有一些大桌子(2.5亿行),按代价分别.每个分区被分派给差异的馈送源,每个分区独立于其他分区,因此可以同时加载和处理赏罚. 数据漫衍很是不平衡,我们稀有百万行的分区,而且分区不高出一百行,可是我没有选择分区方案,并且我不能改变它.

我在Oracle 11g上开拓DWH.我们有一些大桌子(2.5亿行),按代价分别.每个分区被分派给差异的馈送源,每个分区独立于其他分区,因此可以同时加载和处理赏罚.

数据漫衍很是不平衡,我们稀有百万行的分区,而且分区不高出一百行,可是我没有选择分区方案,并且我不能改变它.

思量到数据量,我们必需确保每个分区始终保持最新的统计信息,由于假如随后的具体声名没有对数据的最佳会见权限,那么它们将永久一连下去.

以是对付每个并发ETL线程,我们

>截断分区
>从分段地区加载数据

SELECT / * APPEND * / INTO big_table PARTITION(part1)FROM temp_table WHERE partition_colum = PART1

(这样我们有直接的路径,我们不锁定整个表)

>我们网络修改分区的统计信息.

在项目标第一阶段,我们行使了APPROX_GLOBAL_AND_PARTITION计策,像一个魅力

dbms_stats.gather_table_stats(ownname=>myschema,tabname=>big_table,partname=>part1,estimate_percent=>1,granularity=>'APPROX_GLOBAL_AND_PARTITION',CASCADE=>dbms_stats.auto_cascade,degree=>dbms_stats.auto_degree)

可是,我们有一个弱点,当我们加载一个小分区时,APPROX_GLOBAL部门占主导职位(如故比GLOBAL快得多),而对付一个小分区,我们有譬喻10秒的加载和20分钟的统计信息.

因此,我们提议您切换到11g的INCREMENTAL STATS成果,这意味着您不要指定已修改的分区,您将全部参数都保存在auto中,并且Oracle具有魔力,自动相识哪个分区被打动.它现实上是有用的,我们真的加速了小分区.打开成果后,呼唤成为

dbms_stats.gather_table_stats(ownname=>myschema,estimate_percent=>dbms_stats.auto_sample_size,granularity=>'AUTO',degree=>dbms_stats.auto_degree)

请留意,您不再转达分区,而且不指定样本百分比.

可是,大概比早年更糟糕,这与我们拥有的高程度的并行性相干.

假设我们有两个大的分区同时启动,险些同时完成加载阶段.

>第一个线程竣事insert语句,提交并启动统计信息.统计措施留意到修改了2个分区(这是正确的,一个是完备的,第二个被截断,一个事宜正在举办中),正确地更新两个分区的统计信息.
>最终第二个分区竣事,网络统计信息,看到全部的分区已经被更新,而且什么都不做(这是不正确的,由于第二个线程同时提交了数据).

功效是:

PARTITION NAME | LAST ANALYZED        | NUM ROWS | BLOCKS | SAMPLE SIZE
-----------------------------------------------------------------------
PART1          | 04-MAR-2015 15:40:42 | 805731   | 20314  | 805731
PART2          | 04-MAR-2015 15:41:48 | 0        | 16234  | (null)

功效是我无意会呈现不是最佳的打算(这意味着杀死会话,手动革新统计信息,再次手动启动历程).

我乃至实行在会议上安排专属锁,以是只有一个线程可以同时在统一张桌子上网络统计信息,但没有改变.

IMHO这是一个稀疏的举动,由于统计进程,第二次被挪用,应该搜查第二个分区上的最后一个提交,并应该看到它比最后的统计信息的时刻更新.但好像没有产生.

我做错了吗?这是一个Oracle bug吗?怎样担保全部的统计信息始终是最新的增量统计成果开启,以及高程度的并发性?

我想法通过这个成果告竣一个公道的妥协.
PROCEDURE gather_tb_partiz(
    p_tblname IN VARCHAR2,p_partname IN VARCHAR2)
IS
  v_stale all_tab_statistics.stale_stats%TYPE;
BEGIN
  BEGIN
    SELECT stale_stats
    INTO v_stale
    FROM user_tab_statistics
    WHERE table_name = p_tblname
    AND object_type = 'TABLE';
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    v_stale := 'YES';
  END;
  IF v_stale = 'YES' THEN
    dbms_stats.gather_table_stats(ownname=>myschema,tabname=> p_tblname,partname=>p_partname,degree=>dbms_stats.auto_degree,granularity=>'APPROX_GLOBAL AND PARTITION') ;
  ELSE
    dbms_stats.gather_table_stats(ownname=>myschema,tabname=>p_tblname,granularity=>'PARTITION') ;
  END IF;
END gather_tb_partiz;

在每个ETL的末端,假如添加/删除/修改的行的数目足够低,不能将表标志为过期(默以为10%,可以行使STALE_PERCENT参数举办调解),我仅网络分区统计信息;不然我网络全局和分区统计信息.

这样可以快速维护小型分区的ETL,由于不必全局分区,并且大分区也是安详的,由于随后的任何查询都将具有新的统计信息,而且也许会行使最优的打算.

无论怎样启用增量统计信息,以是无论何时必需从头计较全局值,它都很是快,由于聚合了分区级统计信息,而且不执行全面扫描.

我不知道假如增量启用,“APPROX_GLOBAL AND PARTITION”和“GLOBAL AND PARTITION”与“GLOBAL AND PARTITION”的区别在于,由于增量和约莫都基内情同:聚合统计数据和直方图,而不举办全面扫描.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读