今天测试SO导GL一直不顺,直接原因是:
ORA-01652: 无法通过 16 (在表空间 TEMP1 中) 扩展 temp 段
说是临时表空间不足,但是这里数据并不多,理不应该占用太多空间。
经过反复测试,发现问题出在后面查询脚本的最后二行,即:
and h."company_code" in (
SELECT company_code
from CUX_TEMP_SO_2_GL_OU_LIST) –后面是个存储公司权限范围的微型临时表
这只是一个简单的限定而已,但由于这几个表都取自SQLSERVER,Oracle优化器无法对其做出可靠的判断,所以对于上面的条件,Oracle会从bosohdr表完整抓出了很多公司的所有合同,导致 临时空间不足。
但是,当我把bosohdr与CUX_TEMP_SO_2_GL_OU_LIST表直接相连时,问题就解决了。
经验就是说:当在oracle中调用多张外部来源的表并试图做连接时,要特别注意其连接方式,尽量不要使用类如in的谓词;或者把连接关系在外部库就做好,然后通过视图引用到Oracle.
SELECT c."so_num" SO_NUM –其它字段略
from bjsodetgl@sql_pltprd21.sina.com.cn g,
bjsohdr@sql_pltprd21.sina.com.cn h,
bjso_gl_acct_cfg_new@sql_pltprd21.sina.com.cnc,
aradv@sql_pltprd21.sina.com.cn a,
CUX_TEMP_SO_2_GL_OU_LIST com
where g."so_num" = c."so_num"
--and g."book_id" = c."book_id"
and decode(g."book_id",'1001',C_LEDGER_PRC,'1002',C_LEDGER_US) =c."book_id"
--andg."account_all" = c."dr_all" --这次只取借方
and g."r12_account" = c."dr_segment6" --这次只取借方
and g."r12_sub_account" = c."dr_segment7" --这次只取借方
andg."so_num" = h."so_num"
AND h."status_flag" = 0
AND g."gene_flag" = 1
AND g."gl_flag" = 0 --未导GL
AND h."agency_code" = a."adv_code"
AND g."period" BETWEEN P_START_DATE AND P_END_DATE
and h."company_code" = com.company_code
--and h."company_code" in (
-- SELECT company_code from CUX_TEMP_SO_2_GL_OU_LIST)
)