问题描述
对于下面的脚本,Select语句会在2秒内给出结果,但是当我在插入脚本中使用它时,它会持续2个小时以上,并且还没有完成。
我怎样才能解决这个问题?
INSERT INTO ODEA_STG_HIST.EKRAN_DENEME_TRY (
SELECT APPLICATIONCODE,
AUTHORITYGROUPCODE,
ROLECODE,
ROLEID,
ROLENAME,
REGEXP_SUBSTR (VALUE,
'[^,]+',
1,
LEVEL)
VALUE
FROM ODEA_STG_HIST.EKRAN_DENEME
CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (VALUE, '[^,]+')) + 1);
我怎样才能解决这个问题?
INSERT INTO ODEA_STG_HIST.EKRAN_DENEME_TRY (
SELECT APPLICATIONCODE,
AUTHORITYGROUPCODE,
ROLECODE,
ROLEID,
ROLENAME,
REGEXP_SUBSTR (VALUE,
'[^,]+',
1,
LEVEL)
VALUE
FROM ODEA_STG_HIST.EKRAN_DENEME
CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (VALUE, '[^,]+')) + 1);
专家解答
我怀疑你已经采取了1行解决方案,并试图缩放到多行。SQL
适用于单个字符串 (在单个行中),但是如果要扩展到整个表,则
不起作用,因为现在您的connect-by将几乎无休止地循环遍历所有行。因此你的两个小时
解决方法是更改每个主键的链接代码,例如
但你会发现这不是特别的规模。
在此处阅读各种解决方案,包括大批量的基准
https://stewashton.wordpress.com/2016/08/02/splitting-strings-proof/
select regexp_substr (str, '[^,]+', 1, level) subs from dual connect by level <= length (regexp_replace (str, '[^,]+')) + 1
适用于单个字符串 (在单个行中),但是如果要扩展到整个表,则
select regexp_substr (str, '[^,]+', 1, level) subs from MY_TABLE connect by level <= length (regexp_replace (str, '[^,]+')) + 1
不起作用,因为现在您的connect-by将几乎无休止地循环遍历所有行。因此你的两个小时
解决方法是更改每个主键的链接代码,例如
select id, regexp_substr (str, '[^,]+', 1, level) subs from t connect by level <= length (regexp_replace (str, '[^,]+')) + 1 and pk_col = prior pk_col and prior sys_guid() is not null;
但你会发现这不是特别的规模。
在此处阅读各种解决方案,包括大批量的基准
https://stewashton.wordpress.com/2016/08/02/splitting-strings-proof/
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




