欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

postgresql 中position函數的性能詳解

 更新時間:2021年02月01日 12:05:49   作者:yibei8811  
這篇文章主要介紹了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”和自己提供“l(fā)astindexof”,居然產生了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()

返回要查詢的字符串在被查詢字符串里第一次出現(xiàn)的位置

注:當在 MySQL 4.0 中時,如有任一參數是一個二進制字符串,它才是字母大小寫敏感的

LOCATE(substr,str)

返回substr字符串在str里第一次出現(xiàn)的位置,沒有返回0

SELECT LOCATE('.',t.str)FROM `table` t;
>5

LOCATE(substr,str,pos)

返回substr字符串在str里pos(起始位置)出現(xiàn)的位置,沒有返回0

注:pos必須大于第一次出現(xiàn)的位置,才能顯示第二次出現(xiàn)的位置

SELECT LOCATE('.',t.str,6)FROM `table` t;
>9//當小于等于第一次出現(xiàn)的位置(5)時,返回的還是第一次出現(xiàn)的位置

POSITION()

返回要查詢的字符串在被查詢字符串里第一次出現(xiàn)的位置(和locate用法一樣,查了很多資料position是locate的別名)

POSITION(substr IN str)

返回substr字符串在str出現(xiàn)的位置,沒有返回0

SELECT POSITION('cn' IN t.str)FROM `table` t;
>10

INSTR()

返回要查詢的字符串在被查詢字符串里第一次出現(xiàn)的位置。這和LOCATE()的雙參數形式相同,只是參數的順序被顛倒。

INSTR(str,substr)

返回substr字符串在str出現(xiàn)的位置,沒有返回0

SELECT INSTR(t.str,'com')FROM `table` t;
>6

FIND_IN_SET()

返回在集合中的索引位置(豎向發(fā)展)

FIND_IN_SET(str,strlist)

返回str1在strlist集合中的索引位置

SELECT FIND_IN_SET('demo.com.cn',t.str) FROM `table` t;
>1//返回索引

IN()

返回在集合中的索引位置(同F(xiàn)IND_IN_SET)

str IN (strlist)

返回str1在strlist集合中的索引位置

SELECT 'demo.com.cn' IN(t.str) FROM `table` t;
>1//返回索引

LIKE

返回類似(模糊)字符的集合

LIKE %str%

返回以str類似的集合

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • pgsql添加自增序列、設置表某個字段自增操作

    pgsql添加自增序列、設置表某個字段自增操作

    這篇文章主要介紹了pgsql添加自增序列、設置表某個字段自增操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Postgresql鎖機制詳解(表鎖和行鎖)

    Postgresql鎖機制詳解(表鎖和行鎖)

    這篇文章主要介紹了Postgresql鎖機制詳解(表鎖和行鎖),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • postgresql的now()與Oracle的sysdate區(qū)別說明

    postgresql的now()與Oracle的sysdate區(qū)別說明

    這篇文章主要介紹了postgresql的now()與Oracle的sysdate區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Postgresql 查詢表引用或被引用的外鍵操作

    Postgresql 查詢表引用或被引用的外鍵操作

    這篇文章主要介紹了Postgresql 查詢表引用或被引用的外鍵操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL 中的postgres_fdw擴展詳解

    PostgreSQL 中的postgres_fdw擴展詳解

    這篇文章主要介紹了PostgreSQL 中的postgres_fdw擴展詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 淺談PostgreSQL中大小寫不敏感問題

    淺談PostgreSQL中大小寫不敏感問題

    這篇文章主要介紹了淺談PostgreSQL中大小寫不敏感問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 在postgresql數據庫中判斷是否是數字和日期時間格式函數操作

    在postgresql數據庫中判斷是否是數字和日期時間格式函數操作

    這篇文章主要介紹了在postgresql數據庫中判斷是否是數字和日期時間格式函數的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL教程(十):性能提升技巧

    PostgreSQL教程(十):性能提升技巧

    這篇文章主要介紹了PostgreSQL教程(十):性能提升技巧,本文講解了使用EXPLAIN、批量數據插入、關閉自動提交、使用COPY、 刪除索引、刪除外鍵約束等技巧,需要的朋友可以參考下
    2015-05-05
  • PostgreSQL copy 命令教程詳解

    PostgreSQL copy 命令教程詳解

    這篇文章主要介紹了PostgreSQL copy 命令教程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Postgresql和mysql的區(qū)別及說明

    Postgresql和mysql的區(qū)別及說明

    這篇文章主要介紹了Postgresql和mysql的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論