【调优实践】自定义存储过程不下推

举报
门前一棵葡萄树 发表于 2023/12/22 16:05:17 2023/12/22
【摘要】 1. 问题描述XX局点某业务定义了一个FUNCTION,用于去除字符串中多余逗号,FUNCTION定义如下:CREATE OR REPLACE FUNCTION cbgisc.f_ioc_logst_dist_str(p_source_str character varying, delimiter character varying) RETURNS character varying L...

1. 问题描述

XX局点某业务定义了一个FUNCTION,用于去除字符串中多余逗号,FUNCTION定义如下:

CREATE OR REPLACE FUNCTION cbgisc.f_ioc_logst_dist_str(p_source_str character varying, delimiter character varying)
 RETURNS character varying
 LANGUAGE plpgsql
 NOT FENCED
AS $function$ 
 
DECLARE

 T VARCHAR;--临时变量
 S VARCHAR;--源字符串
 P INT;--记录分隔符位置
 
 RET_STR   VARCHAR;
 
BEGIN
    SELECT STRING_AGG(REGEXP_SPLIT_TO_TABLE,DELIMITER)::VARCHAR
      INTO RET_STR
      FROM (
    SELECT  REGEXP_SPLIT_TO_TABLE 
    FROM REGEXP_SPLIT_TO_TABLE(P_SOURCE_STR,',') 
    GROUP BY REGEXP_SPLIT_TO_TABLE
    )
    ;
    
    RETURN RET_STR;

END;
$function$

2. 优化改写

FUNCTION定义没有指定易变属性和下推属性,默认情况下是不下推的;只有显示指定下推属性SHIPPABLE才支持下推。在SQL中引用该FUNCTION,则查询不支持下推,可能引发CN瓶颈。同时自定义FUNCTION使用SQL编写,性能一般都很差。通过FUNCTION定义分析,我们可以看出,是将字符串先按照逗号分隔进行爆炸,爆炸后再使用分隔符合并成一行,目的其实是去除多余逗号,因此我们可以尝试使用正则表达式实现该功能,正则表达式如下:

regexp_replace('123,2335,,121,,,22,,,,,5','[,]+',',','g')

改写后SQL性能提升效果明显。

参考该方法可以实现各种多余字符的去重,比如空格等。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。