• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    postgresql 中position函数的性能详解

    起因:

    postgresql中position函数提供从头查找返回第一个匹配到字符串的下标。

    而我需要返回从后向前查找第一个匹配到的坐标,但是postgressql并未提供相关函数,所以自己写了如下代码提供相关功能:

    CREATE OR REPLACE FUNCTION lastindexof(text, character)
     RETURNS integer AS
    $BODY$
    begin
     if $1 is null then return NULL;
     end if;
     for i in reverse length($1) .. 1
     loop
      if substr($1,i,1) = $2 
      then
       return i;
      end if;
     end loop;
     return NULL;
    end
    $BODY$
    LANGUAGE plpgsql IMMUTABLE STRICT

    本来以为事情完美解决,但是性能的差距却让人感觉很失望,如下图

    数据库原生的“position”和自己提供“lastindexof”,居然产生了30倍以上的性能差距,那么探究缘由就变成一个有意思的事情。也算第一次尝试翻阅数据库源码,中间总是有点小麻烦,不过当我找到如下代码的时候,那种恍然大悟的欣喜也算满足了自己求知欲。

    注意看1054行,运用了指针~ 可见数据库底层运算,用了引用传递,而我自己写的函数是一个拷贝传递。

    原因找到了,解决问题也就手到擒来,拿C写一个扩展?或者?

    本可以拿C写一些底层代码练练手,不过那又需要重新编译等等,时间有限,留给以后去做吧,先想个简单的办法去解决它。

    解决方法如下

    select length(dir) -position('/' in reverse(dir)) +1 from log_hup_ftp_30

    测试性能截图

    好吧,虽然由于函数的复杂性增加,性能还是慢了一倍多,但是比起之前5s之久还是快了不少。

    tips:

    最近得到德哥的回答,引用传递可以使用游标类型!再次谢谢德哥~

    补充: SQL之查询函数LOCATE、POSITION、INSTR、FIND_IN_SET、IN、LIKE

    LOCATE()

    返回要查询的字符串在被查询字符串里第一次出现的位置

    注:当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的

    LOCATE(substr,str)

    返回substr字符串在str里第一次出现的位置,没有返回0

    SELECT LOCATE('.',t.str)FROM `table` t;
    >5

    LOCATE(substr,str,pos)

    返回substr字符串在str里pos(起始位置)出现的位置,没有返回0

    注:pos必须大于第一次出现的位置,才能显示第二次出现的位置

    SELECT LOCATE('.',t.str,6)FROM `table` t;
    >9//当小于等于第一次出现的位置(5)时,返回的还是第一次出现的位置
    

    POSITION()

    返回要查询的字符串在被查询字符串里第一次出现的位置(和locate用法一样,查了很多资料position是locate的别名)

    POSITION(substr IN str)

    返回substr字符串在str出现的位置,没有返回0

    SELECT POSITION('cn' IN t.str)FROM `table` t;
    >10

    INSTR()

    返回要查询的字符串在被查询字符串里第一次出现的位置。这和LOCATE()的双参数形式相同,只是参数的顺序被颠倒。

    INSTR(str,substr)

    返回substr字符串在str出现的位置,没有返回0

    SELECT INSTR(t.str,'com')FROM `table` t;
    >6

    FIND_IN_SET()

    返回在集合中的索引位置(竖向发展)

    FIND_IN_SET(str,strlist)

    返回str1在strlist集合中的索引位置

    SELECT FIND_IN_SET('demo.com.cn',t.str) FROM `table` t;
    >1//返回索引

    IN()

    返回在集合中的索引位置(同FIND_IN_SET)

    str IN (strlist)

    返回str1在strlist集合中的索引位置

    SELECT 'demo.com.cn' IN(t.str) FROM `table` t;
    >1//返回索引

    LIKE

    返回类似(模糊)字符的集合

    LIKE %str%

    返回以str类似的集合

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • postgresql 中的to_char()常用操作
    • PostgreSQL 字符串处理与日期处理操作
    • PostgreSQL字符切割:substring函数的用法说明
    • Postgresql 截取字符串的案例
    • postgresql 实现字符串分割字段转列表查询
    • postgresql 查询集合结果用逗号分隔返回字符串处理的操作
    上一篇:postgresql 中的to_char()常用操作
    下一篇:PostGreSql 判断字符串中是否有中文的案例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    postgresql 中position函数的性能详解 postgresql,中,position,函数,