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

Oracle 在select中使用函数调用调优查询

ASKTOM 2020-03-27
176

问题描述

我有7m行从遗留系统。

insert /*+ append */ into TGT_DATA 
(
LST_NAM,
FRST_NAM,
MDL_NAM
)
SELECT  /*+ parallel(10)*/ 
func_text_clean(LST_NAM),
func_text_clean( FRST_NAM),
func_text_clean( MDL_NAM) 
FROM P_ONST;
复制


如果从select query中删除了函数,则会在10分钟内运行,但是使用函数会花费一个多小时。

我的函数只有一个返回语句:
       replace(
              replace(
                  replace(
                      replace(
                          REGEXP_REPLACE( 
                             REGEXP_REPLACE(
                                 REGEXP_REPLACE(
                                     regexp_replace(upper( ltrim(rtrim(text_data))),
                                        '[/.]',''),
                                         '["#Â??\?;]', ' ') , 
                              '(?i)^(?:(?![×Þß÷þø])[-0-9a-zÀ-ÿ])+$', ''),
                          '(^[[:cntrl:]^\t]+)|([[:cntrl:]^\t]+$)',' ')  
                     , chr(13), ' ')
                    , chr(10), ' ')
                   , chr(9),' ')
               ,'
',' ')
复制

此外,这些更换应按顺序进行。

我尝试了以下选项,但没有帮助:
1.有功能
2.Pragma UDF

调整此查询的其他选项是什么?

专家解答

Eeesh,那是您在那里进行的复杂替换!

您是否尝试过将替换直接放在SQL语句中?

假设你有 (这没什么区别...)

您可以将单个字符替换为一个翻译:

with val as (
  select 'a' || chr(10) || 'b' || chr(13) || 'c' v
  from dual
)
  select v, translate ( v, chr(10) || chr(13), '   ' )  
  from   val;

V   TRANSLATE(V,CHR(10)||CHR(13),'')   
a
b
c    a b c  
复制


这可能会有所帮助。

但我怀疑很多性能打击来自这些正则表达式。

你能简化这些吗?

或者-假设只有 “一些” 行需要清理-你可以有一些检查只对包含 “坏” 字符的字符串这样做?
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论