Oracle 11g如何估计所需的临时表空间?

Oracle 11g如何估计所需的临时表空间?,oracle,oracle11g,Oracle,Oracle11g,我们对一些表进行了初始批量加载(源和目标都是Oracle11g)。其过程如下: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 tablesp

我们对一些表进行了初始批量加载(源和目标都是Oracle11g)。其过程如下: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
显然,临时表空间对于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创建需要多少临时表空间(在我的例子中是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\u stats.gather\u table\u stats('SOURCE\u SCHEMA','MYBIGTABLE')

其次,您可以查询
V$TEMPSEG_用法
以查看在抛出之前消耗了多少临时块,以及
V$session_longops
以查看您完成了多少整个过程

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

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