簡體   English   中英

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

[英]Oracle 11g how to estimate needed TEMP tablespace?

我們對一些表進行初始批量加載(源和目標都是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_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以查看完成的整個過程的總量。

Oracle 文檔建議為進程創建專用的臨時表空間,以免干擾任何其他操作。

如果您找到更准確的解決方案,請發布編輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM