您的位置:首页 > 数据库

postgresql中position函数相关性能探究~

2015-01-14 15:17 197 查看
起因:

          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:

         最近得到德哥的回答,引用传递可以使用游标类型!再次谢谢德哥~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  性能优化