gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:19:13 26 4
gpt4 key购买 nike

我们对一些表进行初始批量加载(源和目标都是 Oracle 11g)。过程如下:1.截断,2.删除索引(PK和唯一索引),3.批量插入,4.创建索引(又是PK和唯一索引)。现在我收到以下错误:

alter table TARGET_SCHEMA.MYBIGTABLE
add constraint PK_MYBIGTABLE primary key (MYBIGTABLE_PK)
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP

所以显然 TEMP 表空间对于 PK 创建来说太小了(仅供引用,该表有 6 列和大约 22 亿条记录)。所以我这样做了:
explain plan for
select line_1,line_2,line_3,line_4,line_5,line_6,count(*) as cnt
from SOURCE_SCHEMA.MYBIGTABLE
group by line_1,line_2,line_3,line_4,line_5,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 for
select MYBIGTABLE_PK
from TARGET_SCHEMA.MYBIGTABLE
group 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看看你完成了多少总过程。

甲骨文 docs建议为进程创建一个专用的临时表空间,以免干扰任何其他操作。

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

关于Oracle 11g 如何估算所需的TEMP 表空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com