这篇文章主要介绍了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写一些底层代码练练手,不过那又需要重新编译等等,时间有限,留给以后去做吧,先想个简单的办法去解决它 。
解决方法如下
1select 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 FIND_IN_SET(‘demo.com.cn’,t.str) FROM `table` t;
>1//返回索引
FIND_IN_SET()返回在集合中的索引位置(竖向发展)
FIND_IN_SET(str,strlist)返回str1在strlist集合中的索引位置
- 乳清蛋白和全脂奶粉哪种好 最好的中老年蛋白质粉排名
- 有没有什么养生的小茶方中草药 平时喝什么养生饮品最好
- 为什么用食指指着一个人的额头中心 按印堂的作用及好处
- 中医如何做到两者兼顾养生调理 阴虚和阳虚同时存在吃什么药
- 吃中药会推迟吗 延时中药配方
- 中医是如何治疗传染病的 八个偏方治好尿毒症
- 血氧仪|?家中有必要自备血氧仪制氧机吗 制氧机怎么选择
- 中医心理学与西方心理学差别在哪里 华夏心理咨询培训机构怎么样
- 中秋节的来历17个字 中秋节的来历
- 中医也无法根治糖尿病吗 糖尿病如何治疗哪种好用
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
