暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用connect-by时插入脚本性能

ASKTOM 2020-08-18
406

问题描述

对于下面的脚本,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);

专家解答

我怀疑你已经采取了1行解决方案,并试图缩放到多行。SQL

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论