加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-01-12 13:11:51 所属栏目:站长百科 来源:网络整理
导读:我们对一些表进行初始批量加载(源和目标都是Oracle 11g).过程如下:1.截断,2.删除索引(PK和唯一索引),3.批量插入,4.创建索引(再次是PK和唯一索引).现在我收到以下错误: alter table TARGET_SCHEMA.MYBIGTABLEadd constraint PK_MYBIGTABLE primary key (MYB

我们对一些表进行初始批量加载(源和目标都是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创建来说很小(FYI表有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_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以查看完成的整个过程的总量.

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

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

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读