いくつかのテーブルの初期一括ロードを行います (ソースとターゲットの両方が 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 |
-------------------------------------------------------------------------------------------
では、今これをどのように読まなければならないでしょうか?