问题描述
嗨,汤姆,
早上好。
由于组合的增加,我们的动态视图正在日益增长。
因此,我们决定从视图中创建一个表,为此我们创建了一个运行良好的过程,但是从视图到表插入所有记录需要3小时40分钟的时间。
这是我用于插入records的代码。
对于我在1 .. vn_loopctr循环
vn_cnt := vn_cnt 1;
V_SQL := '插入' | | COMB_TABLE_NAME | | '选择/* 并行 (c,15) */ c.* 来自' | | VS_COPY_TABLE | | 'c,其中c.comb_id介于' | | VN_LAST | | '和' | CHUNK_SIZE * VN_CNT;
立即执行V_SQL;
提交;
v_sql := '分析表' | | COMB_TABLE_NAME | | '计算统计';
立即执行V_SQL;
vn_last := (块 _ 大小 * vn_cnt) 1;
v_sql := 'INSERT INTO ' || TARGET_TABLE || ' SELECT /*+ parallel (pd,15) */ pd.* FROM ' || BIEO_TABLE || ' pd';
立即执行v_sql;
提交;
v_sql:= '截断表' | | COMB_TABLE_NAME;
立即执行v_sql;
提交;
结束循环;
只有插入部分似乎需要很长时间。对于每个卡盘,它需要4分钟。我们必须处理144块。
请建议我们是否做一些事情以比这更快地运行它。
问候,
女孩
早上好。
由于组合的增加,我们的动态视图正在日益增长。
因此,我们决定从视图中创建一个表,为此我们创建了一个运行良好的过程,但是从视图到表插入所有记录需要3小时40分钟的时间。
这是我用于插入records的代码。
对于我在1 .. vn_loopctr循环
vn_cnt := vn_cnt 1;
V_SQL := '插入' | | COMB_TABLE_NAME | | '选择/* 并行 (c,15) */ c.* 来自' | | VS_COPY_TABLE | | 'c,其中c.comb_id介于' | | VN_LAST | | '和' | CHUNK_SIZE * VN_CNT;
立即执行V_SQL;
提交;
v_sql := '分析表' | | COMB_TABLE_NAME | | '计算统计';
立即执行V_SQL;
vn_last := (块 _ 大小 * vn_cnt) 1;
v_sql := 'INSERT INTO ' || TARGET_TABLE || ' SELECT /*+ parallel (pd,15) */ pd.* FROM ' || BIEO_TABLE || ' pd';
立即执行v_sql;
提交;
v_sql:= '截断表' | | COMB_TABLE_NAME;
立即执行v_sql;
提交;
结束循环;
只有插入部分似乎需要很长时间。对于每个卡盘,它需要4分钟。我们必须处理144块。
请建议我们是否做一些事情以比这更快地运行它。
问候,
女孩
专家解答
1-获得一些真正的计时
============================
例如
所以你可以得到每个组件的经过时间。看看记录器是否有更严格的东西
https://github.com/OraOpenSource/Logger
2-获取一些好的跟踪数据
============================
当您找到运行缓慢的部分时,请添加以下内容:
dbms_monitor.session_trace_enable (等待 =>true,绑定 =>true);
[那么你的慢代码]
dbms_monitor.session_trace_disable;
3-检查tkprof格式的跟踪文件
============================
从这里,您将获得执行计划,sql经过时间等,并且您将有能力进行一些调整
这将为您提供最好的数据。一些看起来像潜在选择的东西
a) 并行dml (您的查询是并行的,但插入不是)
b) 使用追加提示直接加载
c) 不要使用 “分析”,它已经过时了
d) 使用dbms_stat.set_table_stats使用累积sql % rowcounts来避免完整的dbms_stats运行
============================
例如
FOR i IN 1..vn_loopctr LOOP dbms_output.put_line(systimestamp); vn_cnt := vn_cnt + 1; V_SQL := 'INSERT INTO ' || COMB_TABLE_NAME || ' SELECT /*+ parallel (c,15) */ c.* FROM ' || VS_COPY_TABLE|| ' c WHERE c.comb_id between ' || VN_LAST || ' and ' || CHUNK_SIZE * VN_CNT ; EXECUTE IMMEDIATE V_SQL; COMMIT; dbms_output.put_line(systimestamp); v_sql := 'analyze table '||COMB_TABLE_NAME||' compute statistics'; EXECUTE IMMEDIATE V_SQL;
所以你可以得到每个组件的经过时间。看看记录器是否有更严格的东西
https://github.com/OraOpenSource/Logger
2-获取一些好的跟踪数据
============================
当您找到运行缓慢的部分时,请添加以下内容:
dbms_monitor.session_trace_enable (等待 =>true,绑定 =>true);
[那么你的慢代码]
dbms_monitor.session_trace_disable;
3-检查tkprof格式的跟踪文件
============================
从这里,您将获得执行计划,sql经过时间等,并且您将有能力进行一些调整
这将为您提供最好的数据。一些看起来像潜在选择的东西
a) 并行dml (您的查询是并行的,但插入不是)
b) 使用追加提示直接加载
c) 不要使用 “分析”,它已经过时了
d) 使用dbms_stat.set_table_stats使用累积sql % rowcounts来避免完整的dbms_stats运行
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




