本篇文章小编给大家分享一下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
测试性能截图
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔