起因:
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:
最近得到德哥的回答,引用传递可以使用游标类型!再次谢谢德哥~
补充: 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 INSTR(t.str,'com')FROM `table` t; >6
FIND_IN_SET()
返回在集合中的索引位置(竖向发展)
FIND_IN_SET(str,strlist)
返回str1在strlist集合中的索引位置
SELECT FIND_IN_SET('demo.com.cn',t.str) FROM `table` t; >1//返回索引
IN()
返回在集合中的索引位置(同FIND_IN_SET)
str IN (strlist)
返回str1在strlist集合中的索引位置
SELECT 'demo.com.cn' IN(t.str) FROM `table` t; >1//返回索引
LIKE
返回类似(模糊)字符的集合
LIKE %str%
返回以str类似的集合
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]