postgresSQL Extended Query執行過程和sharding-proxy的處理

来源:https://www.cnblogs.com/mushishi/archive/2023/04/10/17303031.html
-Advertisement-
Play Games

pg Extended Query PostgreSQL: Documentation: 15: 55.2. Message Flow 多個階段,可復用 Parse → DESCRIBE statement → SYNC Parse 解析, 將 sql 文本字元串,解析成 named prepare ...


pg Extended Query

PostgreSQL: Documentation: 15: 55.2. Message Flow

多個階段,可復用

  1. Parse → DESCRIBE statement → SYNC

    1. Parse 解析, 將 sql 文本字元串,解析成 named preparedStatement 語句(生命周期隨session) 占位符和參數類型
    2. Describe 獲取元數據,返回 pst 參數描述符 parameterDescription 和 結果集的行描述符 RowDescription
      由於此時 還沒執行 Bind,還未將語句傳輸到backend 執行,RowDescription中列的傳輸格式 codec format 還是0 ; 參數的類型應該也只是根據客戶端傳到 frontend 指定的類型來的?
    3. Sync 發完一串 extended messages 後需要發一個 sync 表示結束, 服務端一起處理;
      針對 sync 消息,服務端返回是否在事務中執行的狀態 ‘T’ 在事務內, ‘I’ 不在事務內
  2. BIND → DESCRIBE portal → EXECUTE → SYNC

bind step, which creates a portal given a prepared statement and values for any needed parameters; and an execute step that runs a portal's query

  • bind 綁定階段 創建好一個可執行的 portal, 包括參數元數據、返回結果集的元數據 (row 欄位的pg類型 typeOid, 類型長度、 傳輸方式 0-text, 1-binary 等) 參數值
  • DESCRIBE portal;此時是發到 backend 來獲取元數據的,入參和查詢結果的元數據 才是真實的
  • execute 階段 執行並獲取結果集, 客戶端可以根據上一步 describe portal 拿到的 rowDescription 中列的 format 來決定是用 0-text 還是 1-binary 要求服務端對參數和查詢結果集中的欄位值進行 format 後傳輸

同一個session裡邊,步驟一執行過後 如果是 named portal ,後續就可以直接執行步驟二

步驟一執行完後, frontend session 緩存好命名 pst, 下次同一個session再執行就能直接 走步驟二就可以了

sharding-proxy 執行日誌

步驟一

‘P’ Parse stmtcache_1 sql

‘D’ ‘S’ Describe preparedStatement

[DEBUG] 2023-04-07 17:16:53.166 [nioEventLoopGroup-3-3] o.a.s.db.protocol.codec.PacketCodec - Read from client a3f6d846 :
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 50 00 00 00 aa 73 74 6d 74 63 61 63 68 65 5f 31 |**P**....stmtcache_1|
|00000010| 00 53 45 4c 45 43 54 20 22 69 64 22 2c 22 73 74 |.SELECT "id","st|
|00000020| 75 64 65 6e 74 5f 6e 61 6d 65 22 20 46 52 4f 4d |udent_name" FROM|
|00000030| 20 22 74 5f 73 74 75 64 65 6e 74 5f 69 6e 66 6f | "t_student_info|
|00000040| 22 20 57 48 45 52 45 20 22 74 5f 73 74 75 64 65 |" WHERE "t_stude|
|00000050| 6e 74 5f 69 6e 66 6f 22 2e 22 69 64 22 20 3d 20 |nt_info"."id" = |
|00000060| 24 31 20 41 4e 44 20 22 74 5f 73 74 75 64 65 6e |$1 AND "t_studen|
|00000070| 74 5f 69 6e 66 6f 22 2e 22 69 64 22 20 3d 20 24 |t_info"."id" = $|
|00000080| 32 20 4f 52 44 45 52 20 42 59 20 22 74 5f 73 74 |2 ORDER BY "t_st|
|00000090| 75 64 65 6e 74 5f 69 6e 66 6f 22 2e 22 69 64 22 |udent_info"."id"|
|000000a0| 20 4c 49 4d 49 54 20 31 00 00 00 44 00 00 00 11 | LIMIT 1...**D**....|
|000000b0| 53 73 74 6d 74 63 61 63 68 65 5f 31 00 53 00 00 |**S**stmtcache_1.**S**..|
|000000c0| 00 04                                           |..              |
+--------+-------------------------------------------------+----------------+

請求報文 解析成對應的 packet 對象 xxPacket,並創建對應的執行器 xxExecutor
image

執行結果
image
此時 rowDescription, dataFormat都是0

步驟二

‘B’ Bind

‘D’ + ‘P’ Describe porta

‘E’ Execute

‘S’ Sync

[DEBUG] 2023-04-07 17:16:53.304 [nioEventLoopGroup-3-3] o.a.s.db.protocol.codec.PacketCodec - Read from client a3f6d846 :
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 42 00 00 00 37 00 73 74 6d 74 63 61 63 68 65 5f |**B**...7.stmtcache_|
|00000010| 31 00 00 02 00 01 00 01 00 02 00 00 00 08 00 00 |1...............|
|00000020| 00 00 00 00 00 16 00 00 00 08 00 00 00 00 00 00 |................|
|00000030| 00 16 00 02 00 01 00 00 44 00 00 00 06 50 00 45 |........**D**....P.**E**|
|00000040| 00 00 00 09 00 00 00 00 00 53 00 00 00 04       |.........**S**....  |

報文解析,和對應執行器構建
image

響應報文
image
RowDescription 響應結果集的行描述符,DataRowPacket 響應行數據

列 id ,值是 binary 格式 對應 columnDescription 的 dataFormat = 1 (binary)

本文來自博客園,作者:mushishi,轉載請註明原文鏈接:https://www.cnblogs.com/mushishi/p/17303031.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本系列文章導航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 0.說明 CommunityToolkit.Mvvm8.1有一個重大更新的功能:源生成器功能,它 ...
  • 本系列文章導航 https://www.cnblogs.com/aierong/category/2297596.html 0.說明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名為 Microsoft.Toolkit.Mvvm)是一個現代、快速且模塊化的 MVVM 庫。 ...
  • 哈嘍大家好,我是鹹魚。今天跟大家分享一個關於 Linux 服務(service)相關的案例 案例現象 我在 3 月 31日的時候發表了一篇《shell 腳本之一鍵部署安裝 Nginx》,介紹瞭如何通過 shell 腳本一鍵安裝 Nginx 我腳本中執行了 Nginx 開機自啟動的命令,當我使用 sy ...
  • 600 條最強 Linux 命令總結 每博一文案 你有千萬條微博想寫,可有些根本不重要,後來你才懂那是你怕別人看穿你所以才把真話埋在日常里。你有千萬句話想說,可點開那 個對話框,你根本打不出一個字。你才明白,原來你從一開始就怕別人看穿,所以寧可孤獨。所以你寧可每天嘻嘻哈哈,也不要被人看出來你真的難受 ...
  • 介紹了使用海思 CPU 的機頂盒的固件備份和燒錄。通過 USB-TTL 串口燒錄器 CH340 連接機頂盒,使用華為海思刷機工具 HiTool 創建和修改分區表文件,備份和燒寫固件,通過升級包升級系統。在海納思系統中安裝homeassistant,通過 FTP、WebDAV、Alist雲盤訪問文件,... ...
  • 鎖屏面試題百日百刷,每個工作日堅持更新面試題。請看到最後就能獲取你想要的,接下來的是今日的面試題: 1.解釋一下布隆過濾器原理 在日常生活中,包括在設計電腦軟體時,我們經常要判斷一個元素是否在一個集合中。比如在字處理軟體中,需要檢查一個英語單詞是否拼寫正確(也就是要判斷它是否在已知的字典中);在 ...
  • 函數介紹:substring() 函數用於截取字元串,可從字元串的某一位置開始,向右截取若幹個字元,返回一個特定長度的字元串 功能:返回字元、二進位、文本或圖像表達式的一部分 語法:SUBSTRING ( expression, start, length ) SQL 中的 substring 函數 ...
  • 摘要:Redis事務包含兩種模式:事務模式和Lua腳本。 本文分享自華為雲社區《一文講透 Redis 事務》,作者: 勇哥java實戰分享。 準確的講,Redis事務包含兩種模式:事務模式和Lua腳本。 先說結論: Redis的事務模式具備如下特點: 保證隔離性; 無法保證持久性; 具備了一定的原子 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...