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

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

        postgresql中position函数相关性能探究~_第1张图片

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

        postgresql中position函数相关性能探究~_第2张图片

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

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

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

解决方法如下

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

测试性能截图


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


tips:

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

你可能感兴趣的:(postgres)