记一次线上SQL 优化

#### 自定义函数

```

CREATE
OR REPLACE FUNCTION getLongByIp (ip VARCHAR) RETURNS BIGINT AS $BODY$
DECLARE res BIGINT ; len INT ; arr BIGINT [];
BEGIN
    res = 0 ; arr = regexp_split_to_array(ip, '\.') ; len = array_length(arr, 1) ;
IF len != 4 THEN
    RETURN 0 ;
ELSE
    res = res + (arr [ 1 ] << 24) ; res = res + (arr [ 2 ] << 16) ; res = res + (arr [ 3 ] << 8) ; res = res + arr [ 4 ]; RETURN res ;
END
IF ;
END ; $BODY$ LANGUAGE plpgsql;

```

#### 原SQL

```

SELECT
    drf.*, ici.city
FROM
    (
        SELECT
            *
        FROM
            d_runtime_feedback
        WHERE
            feedback_type = 'key_speed_up'
    ) drf
JOIN ip_china_ip ici ON (
    getlongbyip (drf.ip) >= ici.ip_long_start
    AND getlongbyip (drf.ip) <= ici.ip_long_end

```

#### 优化后的SQL

```

SELECT
    tmp.*, ici.city
FROM
    (
        SELECT
            *, getlongbyip (ip) AS iplong
        FROM
            d_runtime_feedback
        WHERE
            feedback_type = 'key_speed_up'
    ) tmp
JOIN ip_china_ip ici ON (
    tmp.iplong >= ici.ip_long_start
    AND tmp.iplong <= ici.ip_long_end
)

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值