Oracle加入两个巨大的表

时间:2017-12-19 10:23:00

标签: sql oracle query-optimization temp

我有Oracle程序,它包含一些EXECUTE IMMEDIATE块。其中之一 - 加入两个大表(约100-200,000,000条记录):

 v_sql:='create table idb.cm_contact_add_char_exp_tmp as  
select ch.* from idb.cm_contact_add_char_exp ch  join
idb.communication_contact_exp_tmp cont on  cont.customer_rk=ch.customer_rk and ch.RESPONSE_TRACK_CD=cont.RESPONSE_TRACK_CD'

execute immediate v_sql;

第一个表(CH)的索引在(CUSTOMER_RK,RESPONSE_TRACK_CD)和日期分区。

SQL_PLAN: enter image description here

Oracle出现以下错误:

  

SQL错误:ORA-01652:无法将临时段扩展64英寸   表空间TEMP

2 个答案:

答案 0 :(得分:0)

一个选项是扩大临时表空间(但是,无论如何可能还不够),或者首先创建表并部分插入数据,特别是当你说那里有分区时。

顺便问一下,为什么要这样创建表?这很不寻常;一般来说,你应该在SQL中创建表,而不是PL / SQL。

答案 1 :(得分:0)

另一种可能性是首先使用

动态创建表格 - 如果这正是您所需要的
CREATE TABLE idb.cm_contact_add_char_exp_tmp AS
SELECT ch.*
  FROM idb.cm_contact_add_char_exp ch  
 WHERE 1=0

然后使用批量FORALL操作从源表中插入记录。

我会问为什么你需要看起来像一个包含大约200万行的临时表。听起来有点怀疑。