postgresql 中position函数的性能详解

 更新时间:2021年02月01日 12:05:49   作者:yibei8811  
这篇文章主要介绍了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中的VACUUM命令用法说明

    PostgreSQL中的VACUUM命令用法说明

    这篇文章主要介绍了PostgreSQL中的VACUUM命令用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • postgresql数据合并,多条数据合并成1条的操作

    postgresql数据合并,多条数据合并成1条的操作

    这篇文章主要介绍了postgresql数据合并,多条数据合并成1条的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Windows PostgreSQL 安装图文教程

    Windows PostgreSQL 安装图文教程

    PostgreSQL是一套功能强大的对象-关系型数据库管理系统。经过十几年的发展, PostgreSQL 是世界上可以获得的最先进的开放源码的数据库系统
    2009-08-08
  • 聊聊PostgreSql table和磁盘文件的映射关系

    聊聊PostgreSql table和磁盘文件的映射关系

    这篇文章主要介绍了聊聊PostgreSql table和磁盘文件的映射关系,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql备份和增量恢复方案

    Postgresql备份和增量恢复方案

    这篇文章主要给大家介绍了关于Postgresql备份和增量恢复的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Postgresql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Postgresql开启远程访问的步骤全纪录

    Postgresql开启远程访问的步骤全纪录

    postgre一般默认为本地连接,不支持远程访问,所以如果要开启远程访问,需要更改安装文件的配置。下面这篇文章主要给大家介绍了关于Postgresql开启远程访问的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-03-03
  • Postgresql 检查数据库主从复制进度的操作

    Postgresql 检查数据库主从复制进度的操作

    这篇文章主要介绍了Postgresql 检查数据库主从复制进度的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 解决PostgreSQL服务启动后占用100% CPU卡死的问题

    解决PostgreSQL服务启动后占用100% CPU卡死的问题

    前文书说到,今天耗费了九牛二虎之力,终于驯服了NTFS权限安装好了PostgreSQL,却不曾想,服务启动后,新的状况又出现了。
    2009-08-08
  • 解决PostgreSQL数据迁移过程中的数据类型不匹配问题

    解决PostgreSQL数据迁移过程中的数据类型不匹配问题

    在数据迁移的过程中,经常会遇到源数据库和目标数据库之间的数据类型不匹配的情况,对于 PostgreSQL 数据库来说,处理这种数据类型不匹配问题需要一些特定的策略和技巧,需要的朋友可以参考下
    2024-07-07
  • PostgreSQL之分区表(partitioning)

    PostgreSQL之分区表(partitioning)

    通过合理的设计,可以将选择一定的规则,将大表切分多个不重不漏的子表,这就是传说中的partitioning。比如,我们可以按时间切分,每天一张子表,比如我们可以按照某其他字段分割,总之了就是化整为零,提高查询的效能
    2016-11-11

最新评论