KunlunDB功能之insert/update/delete...returning語句

KunlunDB發表於2022-05-10

在一些業務場景中,使用者需要插入、更新、刪除一行或者多行目標資料行,然後獲得自己剛剛插入、更新、刪除之後的行或者其部分欄位的值,包括部分欄位構成的任意合法的表示式的值。

對於MySQL使用者來說,要做到這一點,使用者通常需要在一個顯式的事務中執行update語句,然後使用相同的查詢條件把update的語句取出來。

之所以要在顯式事務中做,是為了防止其他併發的事務update了本連線剛剛update的行,那樣的話,隨後的select語句得到行就不是本連線剛剛update之後的行了,因為這些行又被其他事務更新過了。

而在Oracle和PostgreSQL資料庫中,使用者可以使用update/delete語句的returning子句,用一條語句完成上述工作。

這樣的好處是可以提升效率,省去的開銷包括髮送一條select語句以及做目標行的查詢等工作;省去的開銷還包括操作顯式事務的開銷,也就是傳送begin和commit語句的開銷。

因此,使用update…returning語句預期可以比在顯式事務中update行,然後select出來,能夠提升效能10%以上。

所以這是一個很好的功能。事實上如果你搜尋 “mysql update returning”,你還能搜到不少在MySQL中實現類似oracle/postgresql的單條update/delete語句的returning子句的文章,通過藉助觸發器和臨時表等技巧和複雜的操作。

但是這些複雜的步驟導致語句執行效率也顯著降低了,並且使用也不方便(需要對每個資料表建立觸發器)。

為了提升使用者的程式效率,降低使用者的開發難度,提升使用者使用KunlunDB的體驗,我們在KunlunDB中也實現insert/update/delete語句的returning子句。

為此,我們在kunlun-storage中實現了insert/update/delete… returning語句供計算節點使用,並且在計算節點中基於PostgreSQL原有的insert/update/delete…returning 語句的實現,加入了對遠端資料讀寫的支援。

這樣,KunlunDB就具備了insert…returning、update…returning和delete…returning語句功能,分別返回insert語句插入的行,update語句更新後的行,以及返回delete語句刪除的行,包括這些行的欄位組成的任意合法的表示式的值。使用者已經可以在KunlunDB上使用這些功能。

下圖展示了這個很cool的功能。

首先,建表並填充資料:
image.png

現在我們執行update… returning語句:
image.png

然後執行delete… returning子句:
image.png

最後,explain一下update/delete… returning子句:
image.png

-END-


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011764/viewspace-2893332/,如需轉載,請註明出處,否則將追究法律責任。

相關文章