一種提升SQL改寫效率的方法

来源:https://www.cnblogs.com/developer-tianyiyun/archive/2023/09/28/17735938.html
-Advertisement-
Play Games

SQL改寫是資料庫產品中使用比較頻繁的一個技術,在大多數產品中的調用頻率也非常高,通常對性能的需求需要接近對應資料庫產品的上限。例如在天翼雲關係型資料庫中的Mysql語法相容組件,其性能測試標準需要達到接近30萬TPS,也意味著SQL改寫環節的性能標準需要支持至少每秒30萬次以上,否則會成為系統的性... ...


本文分享自天翼雲開發者社區《一種提升SQL改寫效率的方法》,作者:唐****律

一、背景

SQL改寫是資料庫產品中使用比較頻繁的一個技術,在大多數產品中的調用頻率也非常高,通常對性能的需求需要接近對應資料庫產品的上限。例如在天翼雲關係型資料庫中的Mysql語法相容組件,其性能測試標準需要達到接近30萬TPS,也意味著SQL改寫環節的性能標準需要支持至少每秒30萬次以上,否則會成為系統的性能瓶頸。

SQL改寫的基礎是抽象語法樹,而抽象語法樹則是由SQL字元串經過詞法分析和語法分析之後得到的。詞法分析器和語法分析器在市面上有非常多的種類可供挑選,例如Lexer、YACC、Antlr、Druid等,一般資料庫產品都只在其基礎上進行SQL改寫,例如基於C語言開發的PG的分散式資料庫插件Citus。對於一些Java語言開發的資料庫產品,SQL解析的性能則會有所下降,有的資料庫會在此基礎上再進行優化,例如分散式資料庫Mycat,則是在Druid的基礎上再加入了一個SQL緩存,用以減輕SQL解析和改寫的代價。但是這對於一些對於SQL改寫需求特別大或者請求語句特別複雜的資料庫產品來說還是不夠的,例如在天翼雲關係型資料庫中的Mysql語法相容組件中,SQL改寫過程中需要進行元數據收集、類型推斷、通配符分析、子查詢和嵌套查詢處理、別名分析和修正、類型適配、隱式類型轉換、系統參數計算、以及近50條語法相容規則,這樣一來,每次進行SQL改寫就是一個非常大的開銷,因此需要對SQL改寫環節進行性能優化。

對於此類問題,業界也有一些的解決方案,例如分散式資料庫Mycat,它使用緩存對SQL改寫進行性能優化,以SQL為key對抽象語法樹進行緩存,減輕了部分SQL解析的負擔,特點是緩存命中率低,性能提升有限,消耗記憶體大。

二、方案

本方案以提高解析能力為目標,從緩存方向出發,考慮如何提高緩存命中率,以減少不必要的性能消耗。結合應用在使用SQL的過程中的主體結構不輕易改變的特性,使用參數化SQL作為緩存key,處理過程中預先對SQL進行詞法分析,分解為參數化SQL和參數列表,並以參數化SQL為key對抽象語法樹進行緩存。如果緩存未命中,則對參數化SQL依次進行詞法分析、語法分析、改寫處理,最後在改寫完畢之後,再結合先前記錄的參數生成目標SQL,即完成完整的SQL改寫過程。

這個方案減少了大部分的性能消耗,緩存命中率高,記憶體消耗小,大幅提升了性能,其核心邏輯是以額外的性能消耗極小的詞法分析和參數化環節為代價,大幅縮短了性能消耗極高的抽象語法樹改寫過程。

需要註意的是,該方案的應用對改寫環節提出了更高的要求,開發者需要預見參數在整個改寫過程中的作用併進行正確的處理。舉例來說,在分散式資料庫中有一些SQL改寫,需要依據過濾條件的值的hash值,來決定將哪些SQL分發到哪些數據節點,這個時候由於過濾條件的值已被參數化,所以SQL改寫過程中就不能直接決定其需要分發的節點了,而是要改為在最後結合參數生成目標SQL的時候計算分發的節點。

三、優點

本方案提出一種提升SQL改寫效率的方法,通過預先對SQL進行詞法分析,分解為參數化SQL和參數列表,並以參數化SQL為key對抽象語法樹進行緩存,然後進行抽象語法樹改寫,最後再結合參數列表生成目標SQL,大幅提升了緩存命中率和SQL改寫效率。

經過相同環境下的測試對比,可知本方案在提高SQL改寫效率方面產生了巨大的提升,並且由於測試樣本較少,緩存命中率更高的方案顯然會在實際應用場景中獲得更大的優勢。表1為3種方案對於SQL改寫的性能對比:從天翼云云電腦生產環境中隨機摘取100萬條數據對其進行Mysql語法到PostgreSQL語法的改寫,在Intel Core i7-6700 CPU 和24GB記憶體的測試環境下,各使用10個線程分別按上述3個方案進行測試。


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

-Advertisement-
Play Games
更多相關文章
  • Word中的圖表功能將數據可視化地呈現在文檔中。這為展示數據和進行數據分析提供了一種方便且易於使用的工具,使作者能夠以直觀的方式傳達信息。要通過C#代碼來實現在Word中繪製圖表,可以藉助 Spire.Doc for .NET 控制項,具體操作參考下文。 C# 在Word中插入柱狀圖 C# 在Word ...
  • https://www.codenong.com/cs106719464/ WinForm中的UI假死其實是個老生常談的問題了,但最近還是很多人問我該如何解決,所以今天就來說明一下如何解決UI假死的問題。實驗程式界面如下圖所示: 方法一:async + await + Task 首先看下麵一段代碼: ...
  • C# BeginInvoke實現非同步編程-CSDN博客 https://blog.csdn.net/Nire_Yeyu/article/details/133203267 C# BeginInvoke實現非同步編程BeginInvoke實現非同步編程的三種模式: 1.等待模式在發起了非同步方法以及做了一些 ...
  • 模擬.NET實際應用場景,綜合應用三個主要知識點:一是使用dnSpy反編譯第三庫及調試,二是使用Lib.Harmony庫實現第三庫攔截、偽造,三是實現同一個庫支持多版本同時引用。 ...
  • 問題現象: 使用伺服器管理器打開本地安全策略,或使用win+R快捷鍵,輸入gpedit.msc打開系統組策略時,出現報錯:無法打開此電腦上的組策略對象。你可能沒有相應的許可權。 解決方法: 1、使用win+E快捷鍵打開資源管理器,點擊”查看“,勾選”隱藏的項目“,因為C:\Windows\Syste ...
  • 一、介紹說明 Linux系統是一個多用戶多任務的操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個賬號,然後以這個賬號的身份進入系統。 用戶的賬號一方面可以幫助系統管理員對使用系統的用戶進行跟蹤,並控制他們對系統資源的訪問;另一方面也可以幫助用戶組織文件,併為用戶提供安全性保護。 ...
  • PostgreSQL 在開源資料庫世界中一直是一個標誌性的存在。經過35年的嚴格開發,它以其可靠性、強大的功能和性能而自豪。DB-engines 的突出顯示,其市場份額的增長證明瞭其適應性強的數據模型和滿足各種用例需求的多樣化擴展 考慮到PG突出的地位,甲骨文將推出基於 PostgreSQL 14. ...
  • 在資料庫代理層中,寫節點的資料庫連接是一種很重要和稀缺的資源,提升其利用率是一個提升資料庫整體性能的重要手段。資料庫連接占用過高會大幅增加資料庫的資源負擔,降低資料庫的處理能力。通過延遲啟動的事務,可以減少不必要的連接占用時長,提升資料庫連接利用率。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...