承诺减少临时表空间的使用

Posted

技术标签:

【中文标题】承诺减少临时表空间的使用【英文标题】:Commit to reduce temp tablespace usage 【发布时间】:2020-01-21 20:00:11 【问题描述】:

我有一个大表格插入作为报告工作的一部分。为了便于开发,我使用单个选择进行了单个插入,而不是将其拆分为多个提交。

    insert /*+ parallel(AUTO) */ into sc_session_activity_stage1(fiscal_year
                                        ,fiscal_quarter_id
                                        ,date_stamp
                                        ,time_stamp
                                        ,session_key
                                        ,activity_call_type_key
                                        ,user_key
                                        ,device_key
                                        ,url_key
                                        ,ref_url_key
                                        ,event_key
                                        ,page_type_key
                                        ,link_url_key
                                        ,component_key
                                        ,content_trace_key
                                        ,key) (
        select  /*+ parallel(AUTO) */ 
                schfql.fiscal_year fiscal_year
                ,schfql.fiscal_quarter_id fiscal_quarter_id
                ,pkg_sc_portfolio_load.sc_datestamp_from_epoch(swa.time_stamp)
                ,swa.time_stamp time_stamp
                ,schuse.session_key session_key
                ,schact.activity_call_type_key  activity_call_type_key
                ,schu.user_key user_key
                ,schde.device_key device_key
                ,schurl_url.url_key url_key
                ,schurl_ref.url_key ref_url_key
                ,schev.event_key event_key
                ,schapt.page_type_key page_type_key
                ,schurl_link_url.url_key link_url_key
                ,schwac.component_id component_id
                ,schti_content_unique_id.trace_id_key content_unique_id_trace_id_key
                ,schti_unique_id.trace_id_key unique_id_trace_id_key 
    from web_activity swa
        inner join sc_fiscal_quarter_list schfql
        on pkg_sc_portfolio_load.sc_datestamp_from_epoch(swa.time_stamp) between schfql.start_date and schfql.end_date
        inner join sc_user_sessions schuse
    on schuse.session_id = swa.session_id
        inner join sc_activity_call_types schact
        on schact.activity_call_type_name =  swa.calltype
        inner join sc_users schu
        on schu.user_email = sc_normalize_email(swa.userid)
        inner join sc_devices schde
        on swa.device=schde.device and 
           swa.ip=schde.source_ip and
           swa.operation_system = schde.operating_system and
           swa.browser = schde.browser
        left join sc_urls schurl_url 
        on schurl_url.full_url = trim(swa.url)
        inner join sc_events schev
        on schev.event=trim(swa.event)
        inner join sc_activity_page_types schapt
        on schapt.page_type_name=swa.pagetype
        left join sc_urls schurl_link_url 
        on schurl_link_url.full_url = trim(swa.linkurl)
        left join sc_urls schurl_ref
        on schurl_ref.full_url = trim(swa.ref)
        inner join sc_web_activity_components schwac
        on schwac.component_name=trim(swa.component)
        left join sc_trace_ids schti_content_unique_id
        on schti_content_unique_id.alfresco_trace_id = swa.CONTENT_UNIQUE_ID
        left join sc_trace_ids schti_unique_id
    on schti_unique_id.alfresco_trace_id=swa.UNIQUE_ID
    );
    commit;

在生产中,这会触发 TEMP 表空间的警报。如果我将上述内容拆分为多个提交,是否会在任何一个时间点减少 TEMP 的使用?这对某些人来说可能很明显,但我不确定 Oracle 是如何工作的。我没有看到任何 ORA 类型错误,而是触发了某个阈值,并且 DBA 团队的某个人发送了一封电子邮件。

感谢樵夫。

【问题讨论】:

您可以要求您的 dba 为临时表空间添加更多空间。或者你在 x 行之后进行提交 我不确定你的意思是将其拆分为多个提交。您的意思是添加一些where 子句,以便一次只插入一些行并在每行之后提交?它可能会减少临时使用,也可能不会。也许连接占用了所有资源,过滤处理的行可能会减少这种情况,具体取决于执行计划。或者计划可能有问题,例如hourim.wordpress.com/2015/02/24/… @hotfix 是的,每说 100 行,做一次提交。 也许你应该从optimizing the query which drives the insert开始。你确定并行查询让事情变得更好而不是更糟吗? 【参考方案1】:

TEMP 表空间井喷很常见,可以通过增加 TEMP 表空间和/或调整 SQL 以使用更少的 TEMP 来解决。对于调优:我通常从 SQL Tuning Advisor 建议开始(需要诊断和调优包)。顺便说一句:TEMP 的使用随着并行查询的增加而增加,并且主要针对 SELECT 部分。您还可以通过在内存中执行更多操作(即增加 PGA)来减少 TEMP 表空间的使用。

【讨论】:

以上是关于承诺减少临时表空间的使用的主要内容,如果未能解决你的问题,请参考以下文章

怎么把表空间文件缩小

Oracle 12C 新特性之临时undo控制

临时表空间操作总结

如何查询临时表空间被啥占用了

临时表空间过大解决方法

ORA-25153临时表空间为空