国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

這篇具有很好參考價值的文章主要介紹了[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

再次聲明:

并不是所有場景都需要(或者適合)用rust來寫的,絕大部分操作數(shù)據(jù)庫的功能和計算,用SQL就已經(jīng)足夠了!

本系列中,所有的案例,僅用于說明pgrx的能力,而并非是說這樣做比用SQL更合適。反之:對于操作數(shù)據(jù)庫本身的部分,大部分能用SQL來實現(xiàn)的東西,都比做一個擴展開發(fā)要更加合適。

——如果哪位大神寫Rust走火入魔,說啥數(shù)據(jù)庫功能都要用Rust來擴展實現(xiàn)的,不報我的名字,你們打成半死就行,報我的名字,請打成八成死。

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

單值輸入與輸出函數(shù)

這里的單值,是針對序列這種多值類型而言的。

SQL做為第四代語言,與第三代語言最大的區(qū)別,就是盡量舍棄了所謂的計算機思維,即for和if。

例如我們在高級語言里面對一批數(shù)據(jù)要進行查詢或者篩選,必須是按照計算機的思維方式來進行:

例如老板說,我們準備找出大于35歲的同學,以向社會進行輸送,那么程序員要實現(xiàn)這個想法,就得這樣思考和實現(xiàn)問題: 對整個數(shù)據(jù)集進行一個個的迭代,然后一個個的比較,如果滿足條件,就進行社會輸出……

for row in dataset:
    if row['age'] > 35:
        row["結(jié)果"] = "輸送社會"
    else:
        row["結(jié)果"] = "在用幾年"

但是SQL里面,要實現(xiàn)這個功能,則不會有for和if這類語句:

select * from dataset where age > 35

有正如高級語言要執(zhí)行,先要被編譯器編譯成匯編,然后再編譯成機器語言再進行執(zhí)行意義,SQL要執(zhí)行,實際上也要別數(shù)據(jù)庫引擎編譯成匯編指令和機器語言,那么依然可以是可以解讀為for和if的。

例如,我們寫了這樣一個數(shù)據(jù)庫擴展:

#[pg_extern]
fn age_add(age:i32) -> i32 {
    age +1
}

來看看效果,非常直觀:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

那么在實際使用中,比如要作用于數(shù)據(jù)庫表格上的話,是什么樣子呢?

先有這樣一張表:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

如果我們把自定義的函數(shù)作用在這張表上的時候,就是這樣的:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

可以看見,相當于對于表emps進行逐行的迭代計算,然后得到了結(jié)果。

當然,這種功能肯定沒必要用擴展這種牛刀殺雞的做法,直接用SQL就可以了:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

下面我們來做一個稍微復雜點的場景:

有如下這樣一張表:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

這是一個員工信息表有五個字段,分別id,名稱、加入公司的時間、生日和工資,一共是20萬條記錄:我用Python的faker庫生成的,當然沒來得及去關注入職時間和生日之間的相關關系,里面肯定有沒滿18歲就參加工作的問題……就不要在意這些細節(jié)了。

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

現(xiàn)在我們要計算一下年終獎金的系數(shù),規(guī)則如下:

基數(shù)為2,也就是兩個月工資,如果在公司超過10年,每年加1.5個點,如果不滿10年,則每年1個點,不滿一年的按基準算,最后用系數(shù)乘以工資,得到最后的獎金。

這個場景在業(yè)務編碼里面經(jīng)常見到,雖然很簡單,但是包含了多條件判斷、時間計算和數(shù)學計算等多種計算模型,當然……用SQL本身就很容實現(xiàn),如下所示:

WITH a AS (
SELECT *,
    CASE
    WHEN date_part('year',age(now(),indate)) >= 10 
        THEN 2 + date_part('year',age(now(),indate))* 0.015

    WHEN date_part('year',age(now(),indate)) <= 1 
        THEN 2

    ELSE 2 + date_part('year',age(now(),indate))* 0.01
    END as xs
FROM tab_emps )
SELECT * ,pay*xs FROM a
LIMIT 10; 

結(jié)果如下:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

那么我們在擴展函數(shù)里面寫怎么做呢? (再次強調(diào),僅為說明能力,絕對不是建議大家這種功能小功能也動用擴展函數(shù)來牛刀殺雞)

代碼如下:

#[pg_extern]
fn cal_bonus(indate:pgrx::Date,pay:i64) -> f32{
    let now: DateTime<Local> = Local::now();
    let now_epoch = now.timestamp()/60/60/24;
    
    let x = (now_epoch as i32 - indate.to_unix_epoch_days()) / 365 ;
    
    let mut xs:f32=0.0;
    if x >=10{
        xs = 2.0 + x as f32 * 0.015;
    }
    else if x <=1 {
        xs = 2.0;
    }
    else{
        xs = 2.0 + x as f32 * 0.01;
    }
    xs * pay as f32
}

結(jié)果如下:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

可以看見二者的結(jié)果是完全一樣的。

性能對比

我們來具體對比一下,使用SQL原生方式和與擴展函數(shù)兩種方式,在PG上面的執(zhí)行效率,我們采用EXPLAIN ANALYZE的方式來測試效率:

  1. 對于加1方法的測試:

為了復用建立出來的20萬條記錄的表格,所以我們需要修改一下方法: 把輸入?yún)?shù)從i32改成i64——rust是一種強類型的語言,所以數(shù)據(jù)庫中的integer和bigint是無法通用。

當然,我們也可以用泛型來做,不過既然本教程針對的是初學者,這里我就不用了,以免增加學習負擔。

#[pg_extern] fn age_add(age:i64) -> i64 { age +1 }

結(jié)果如下:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

我們發(fā)現(xiàn),對于20萬條數(shù)據(jù),用SQL執(zhí)行加1操作,僅用了23ms,而采用擴展函數(shù),則需要用37ms。

接下去,我們分別測試更新和插入,用兩種方法,生成一張新的表格,然后在做一次更新,分別來看看性能:

CREATE AS SELECT的性能:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

依然是原生SQL性能更好

然后看看UPDATE的性能:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

三個測試的結(jié)果如下:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

然后我們再來測試一下稍微復雜點的系數(shù)與獎金計算:

查詢

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

創(chuàng)建:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

更新 (原生SQL的子查詢模式更新,實在太慢了,20萬條沒有執(zhí)行成功,所以我把數(shù)量縮減到了1000條,也有可能是我SQL語句沒寫對……因為以前沒有搞過子查詢模式的更新這種東西,如果哪位大神寫過,可以聯(lián)系我……)

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

而讓我感到震驚的是,使用擴展函數(shù)編寫的更新,對于20萬條數(shù)據(jù),整體執(zhí)行的時間如下:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

對比如下:

[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比

結(jié)論

  1. 簡單計算和查詢,SQL語言比擴展模式性能更好。
  2. 復雜計算和查詢,隨著數(shù)據(jù)量的變大,Rust擴展模式越發(fā)顯示出優(yōu)勢,可能是因為在SQL里面也需要調(diào)用底層語言編寫的函數(shù),而導致轉(zhuǎn)換間的性能損失吧。
  3. 如果有復雜計算且更新的需求,擴展函數(shù)的性能比原生SQL要好太多太多……可能并非是性能,而是運行機制的問題,此結(jié)論因為蝦神SQL能力不行,所以不可靠。
  4. 不管是原生SQL模式還是擴展函數(shù)模式,一定都比DBC(Database Connectivity)模式要強很多很多……

待續(xù)未完。文章來源地址http://www.zghlxwxcb.cn/news/detail-428778.html

到了這里,關于[pgrx開發(fā)postgresql數(shù)據(jù)庫擴展]4.基本計算函數(shù)的編寫與性能對比的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Django Web開發(fā)(day4)——數(shù)據(jù)模型使用與填充網(wǎng)站數(shù)據(jù)(對數(shù)據(jù)庫的基本操作)

    Django Web開發(fā)(day4)——數(shù)據(jù)模型使用與填充網(wǎng)站數(shù)據(jù)(對數(shù)據(jù)庫的基本操作)

    本博客將會涉及:? Django 數(shù)據(jù)模型的使用 視頻數(shù)據(jù)的導入 admin 后臺的使用? 1、Django 數(shù)據(jù)模型的使用? 在上一篇中完成了網(wǎng)站的數(shù)據(jù)模型的創(chuàng)建,在數(shù)據(jù)模型創(chuàng)建之后, Django 會為我們的數(shù)據(jù)模型創(chuàng)建一套數(shù)據(jù)庫抽象的 API 接口,以供我們進行檢索數(shù)據(jù)、創(chuàng)建數(shù)據(jù)、更新和修

    2024年01月18日
    瀏覽(36)
  • 微信小程序云開發(fā)—01(云數(shù)據(jù)庫、云函數(shù)的創(chuàng)建與基本使用)

    微信小程序云開發(fā)—01(云數(shù)據(jù)庫、云函數(shù)的創(chuàng)建與基本使用)

    1. 小程序云開發(fā),讓前端程序員擁有后端的能力 2. 云函數(shù) (nodejs) 3. 云數(shù)據(jù)庫 (mogodb) 4. 云存儲 5. 前端寫好云函數(shù) - 上傳到云服務器 -實現(xiàn)自定云部署 6. 前端去調(diào)用云函數(shù)=間接通過云函數(shù)對數(shù)據(jù)庫的操作 7. 前端=》全棧 1. 在app.js 2. 云函數(shù)index.js 定義id 3. 云id來自 云開發(fā)

    2024年02月15日
    瀏覽(49)
  • postgresql|數(shù)據(jù)庫|MySQL數(shù)據(jù)庫向postgresql數(shù)據(jù)庫遷移的工具pgloader的部署和初步使用

    postgresql|數(shù)據(jù)庫|MySQL數(shù)據(jù)庫向postgresql數(shù)據(jù)庫遷移的工具pgloader的部署和初步使用

    MySQL數(shù)據(jù)庫和postgresql數(shù)據(jù)庫之間的差異并不多,這里的差異指的是對SQL語言的支持兩者并不大,但底層的東西差異是非常多的,例如,MySQL的innodb引擎概念,數(shù)據(jù)庫用戶管理,這些和postgresql相比是完全不同的(MySQL用戶就是用戶,沒有角色,postgresql有用戶,有角色,但差異不

    2024年02月14日
    瀏覽(36)
  • 【數(shù)據(jù)庫】什么是 PostgreSQL?開源數(shù)據(jù)庫系統(tǒng)

    【數(shù)據(jù)庫】什么是 PostgreSQL?開源數(shù)據(jù)庫系統(tǒng)

    PostgreSQL 是一個開源的對象關系數(shù)據(jù)庫系統(tǒng),本文,我們將討論 PostgreSQL、它的用途和好處。 PostgreSQL 是由 PostgreSQL Global Development Group 開發(fā)的高級 開源關系數(shù)據(jù)庫管理系統(tǒng)(RDBMS) 。它作為 POSTGRES 項目的一部分于 1986 年在加州大學伯克利分校啟動,它最初于 1996 年 7 月 8 日發(fā)布

    2023年04月08日
    瀏覽(32)
  • postgresql數(shù)據(jù)庫定時備份到遠程數(shù)據(jù)庫

    postgresql數(shù)據(jù)庫定時備份到遠程數(shù)據(jù)庫

    1.老規(guī)矩,服務器目錄結(jié)構: conf目錄無內(nèi)容 profile: 其中: 最后一行 export PGPASSWORD=‘root’ 是需要備份的數(shù)據(jù)庫的密碼,因為直接用 pg_dump 命令備份需要輸入密碼交互,而我們需要達到自動備份,所以借助這種方式不需要輸入密碼 docker-compose.yml: 啟動容器: 然后再data目錄下面

    2024年02月09日
    瀏覽(22)
  • PostgreSQL Linux操作PostgreSQL數(shù)據(jù)庫

    PostgreSQL教程 菜鳥教程:https://www.runoob.com/postgresql/postgresql-tutorial.html 登錄PG數(shù)據(jù)庫:psql -U 用戶名(U需要大寫) 登錄PG數(shù)據(jù)庫(指定主機、端口,并進入指定數(shù)據(jù)庫): psql -U 用戶名 -h 127.0.0.1 -p 5432 -d 數(shù)據(jù)庫名 -U 登錄的用戶名 -h 連接的主機(默認127.0.0.1,可替換成遠程主機

    2024年02月11日
    瀏覽(28)
  • 數(shù)據(jù)庫新聞速遞 -- POSTGRESQL 正在蠶食數(shù)據(jù)庫市場  (翻譯)

    數(shù)據(jù)庫新聞速遞 -- POSTGRESQL 正在蠶食數(shù)據(jù)庫市場 (翻譯)

    開頭還是介紹一下群,如果感興趣polardb ,mongodb ,mysql ,postgresql ,redis 等有問題,有需求都可以加群群內(nèi)有各大數(shù)據(jù)庫行業(yè)大咖,CTO,可以解決你的問題。加群請加 liuaustin3微信號 ,在新加的朋友會分到3群(共1140人左右 1 + 2 + 3) 盡管NoSQL數(shù)據(jù)庫繼續(xù)蓬勃發(fā)展,但關系型數(shù)據(jù)庫仍

    2024年02月13日
    瀏覽(30)
  • [運維|數(shù)據(jù)庫] docker postgresql數(shù)據(jù)庫環(huán)境變量配置

    要配置Docker中的PostgreSQL數(shù)據(jù)庫的環(huán)境變量,可以使用以下方法: 使用Docker命令行: 將 用戶名 , 密碼 , 數(shù)據(jù)庫名 替換為你想要設置的實際值。這將創(chuàng)建一個名為 mypostgres 的容器,并將 PostgreSQL 的用戶名、密碼和數(shù)據(jù)庫名設置為指定的值。 -p 5432:5432 指定了容器內(nèi)部和主機之間

    2024年02月09日
    瀏覽(34)
  • Postgresql數(shù)據(jù)庫死鎖

    Postgresql數(shù)據(jù)庫死鎖

    ERROR: deadlock detected DETAIL: Process 95 waits for ShareLock on transaction 3553457; blocked by process 187. Process 187 waits for ShareLock on transaction 3553458; blocked by process 95. HINT: See server log for query details. CONTEXT: while updating tuple (0,6) in relation “deadlock_example” 其中 Process 95 在等待共享鎖(ShareLock)的事務

    2024年01月20日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包