【问题标题】:Oracle 11g how to estimate needed TEMP tablespace?oracle 11g如何估计需要的TEMP表空间?
【发布时间】:2013-07-22 06:15:48
【问题描述】:

我们对一些表进行初始批量加载(源和目标都是 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 |
-------------------------------------------------------------------------------------------

那么我现在该怎么读呢?

【问题讨论】:

    标签: oracle oracle11g


    【解决方案1】:

    这是个好问题。

    首先,如果创建如下主键

    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 建议为进程创建一个专用临时表空间,以免干扰任何其他操作。

    如果您找到更准确的解决方案,请发布修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2018-09-12
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2015-10-01
      相关资源
      最近更新 更多