Oracle 11g说明表上的并发统计信息网络
我在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”的区别在于,由于增量和约莫都基内情同:聚合统计数据和直方图,而不举办全面扫描. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |