本文主要介绍postgresql中position函数性能的详细说明,具有很好的参考价值,希望对大家有所帮助。来和边肖一起看看。
原因:
postgresql中的position函数提供从头开始搜索,以返回与字符串匹配的第一个下标。
而且我需要从后向前返回寻找第一个匹配坐标,但是postgressql不提供相关函数,所以我写了下面的代码来提供相关函数:
创建或替换函数lastindexof(文本,字符)
以整数形式返回
$BODY$
开始
如果$1为空,则返回空;
结束if;
对于长度相反的I(1美元).一
环
Nbs唐山快排名P;if substr($1,I,1)=2美元
然后
返回I;
结束if;
结束循环;
返回空值;
结束
$BODY$
不可变严格语言
本来以为事情解决的很完美,但是性能差距让人感觉很失望,如下图
数据库原来的“位置”和自己提供的“lastindexof”产生了30倍以上的性能差距,探究原因就变得很有意思了。也是第一次尝试看数据库源码,但是中间总有一点小麻烦,但是当我发现下面的代码的时候,突然体会到的喜悦可以满足我的求知欲。
注意1054行,用指针~可见数据库底层操作,用引用传递,我自己写的函数是复制传递。
找到原因,就很容易解决问题。用C写扩展?还是?
我可以用C写一些低级代码来练手,但是需要重新编译等等。时间有限。以后交给我吧,先想个简单的办法解决。
解决方案如下
1从log_hup_ftp_30中选择长度(dir)-位置('/'在反向(dir)) 1
测试性能截图
嗯,虽然由于功能复杂度增加,性能慢了一倍多,但还是比之前的5s快很多。
tips:
最近德哥回答光标类型可以用来做参考传递!再次感谢德哥~
补充:SQL查询函数LOCATE,POSITION,INSTR,FIND_IN_SET,IN,LIKE
LOCATE()返回要查询的字符串首次出现在查询字符串中的位置
注意:在MySQL 4.0中,如果任何参数是二进制字符串,它是区分字母大小写的
LOCATE(substr,str)返回字符串中第一个出现的子字符串,但不返回0
选择定位('.',t.str)FROM `table '
t;五
LOCATE(substr,str,pos)返回子字符串在字符串中出现的位置(起始位置),但不返回0
注意:pos必须大于第一个位置才能显示第二个位置
选择定位('.',t.str,6)FROM ` table ` t;9//当它小于或等于第一个外观位置(5)时,返回第一个外观位置