Oracle 11g如何估算所需的TEMP表空间?

Oracle 11g如何估算所需的TEMP表空间?,第1张

概述我们对一些表进行初始批量加载(源和目标都是Oracle 11g).过程如下:1.截断,2.删除索引(PK和唯一索引),3.批量插入,4.创建索引(再次是PK和唯一索引).现在我收到以下错误: alter table TARGET_SCHEMA.MYBIGTABLEadd constraint PK_MYBIGTABLE primary key (MYBIGTABLE_PK)ORA-01652: 我们对一些表进行初始批量加载(源和目标都是Oracle 11g).过程如下:1.截断,2.删除索引(PK和唯一索引),3.批量插入,4.创建索引(再次是PK和唯一索引).现在我收到以下错误:

alter table TARGET_SCHEMA.MYBIGtableadd constraint PK_MYBIGtable primary key (MYBIGtable_PK)ORA-01652: unable to extend temp segment by 128 in tablespace TEMP

因此,显然TEMP表空间对于PK创建来说很小(FYI表有6列和大约22亿条记录).所以我这样做了:

explain plan forselect line_1,line_2,line_3,line_4,line_5,line_6,count(*) as cntfrom SOURCE_SCHEMA.MYBIGtablegroup by line_1,line_6;select * from table( dbms_xplan.display );/*-----------------------------------------------------------------------------------------------| ID  | Operation          | name             | Rows  | Bytes |TempSpc| Cost (%cpu)| Time     |-----------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT   |                  |  2274M|    63G|       |    16M  (2)| 00:05:06 ||   1 |  HASH GROUP BY     |                  |  2274M|    63G|   102G|    16M  (2)| 00:05:06 ||   2 |   table ACCESS FulL| MYBIGtable       |  2274M|    63G|       |   744K  (7)| 00:00:14 |-----------------------------------------------------------------------------------------------*/

这是如何判断PK创建需要多少TEMP表空间(在我的情况下为102 GB)?或者你会以不同的方式进行估算

附加:PK仅存在于目标系统上.但公平点,所以我在目标PK上运行你的查询:

explain plan forselect MYBIGtable_PK from TARGET_SCHEMA.MYBIGtablegroup by MYBIGtable_PK ;-------------------------------------------------------------------------------------------| ID  | Operation          | name                 | Rows  | Bytes | Cost (%cpu)| Time     |-------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT   |                      |     1 |    13 |     3  (34)| 00:00:01 ||   1 |  HASH GROUP BY     |                      |     1 |    13 |     3  (34)| 00:00:01 ||   2 |   table ACCESS FulL| MYBIGtable           |     1 |    13 |     2   (0)| 00:00:01 |-------------------------------------------------------------------------------------------

那我现在怎么读呢?

解决方法 这是一个很好的问题.

首先,如果您创建以下主键

alter table TARGET_SCHEMA.MYBIGtable      add constraint PK_MYBIGtable primary key (MYBIGtable_PK)

那你应该查询

explain plan for      select PK_MYBIGtable      from SOURCE_SCHEMA.MYBIGtable      group by PK_MYBIGtable

要估算(确保你收集统计数据exec dbms_stats.gather_table_stats(‘SOURCE_SCHEMA’,’MYBIGtable’).

其次,您可以查询V $TEMPSEG_USAGE以查看在抛出之前消耗了多少临时块,并查看v $session_longops以查看完成的整个过程的总量.

Oracle docs建议为进程创建专用的临时表空间,以免干扰任何其他 *** 作.

如果您找到更准确的解决方案,请发布编辑.

总结

以上是内存溢出为你收集整理的Oracle 11g如何估算所需的TEMP表空间?全部内容,希望文章能够帮你解决Oracle 11g如何估算所需的TEMP表空间?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1160826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存