QT性能優化之QT6框架高性能模型視圖代理框架千萬級數據表分頁查詢優化 簡介 本文介紹了QT模型視圖代理框架中的QT表格控制項和QT資料庫模塊中的QT資料庫查詢模型結合使用的一個應用實踐案例:QT高性能表格控制項分頁展示千萬行數據。本文介紹了這個應用實踐案例的運行效果和源代碼。這個應用實踐案例實測運行表 ...
QT性能優化之QT6框架高性能模型視圖代理框架千萬級數據表分頁查詢優化
簡介
本文介紹了QT模型視圖代理框架中的QT表格控制項和QT資料庫模塊中的QT資料庫查詢模型結合使用的一個應用實踐案例:QT高性能表格控制項分頁展示千萬行數據。本文介紹了這個應用實踐案例的運行效果和源代碼。這個應用實踐案例實測運行表明,QT表格控制項具備在3毫秒之內快速從1000萬數據記錄的SQLite資料庫的一個數據表中查詢讀取10000記錄的能力。 本文還介紹了QT表格控制項和QT資料庫模塊的一些總體情況。本文最後通過QT框架的源代碼調試運行分析了QT表格控制項的性能為什麼如此之高。
文章目錄
正文
QT高性能表格控制項分頁展示百萬行數據運行效果展示
系統配置
硬體配置: SSD。
操作系統: Windows。
資料庫系統:SQLite資料庫。
QT版本: QT。
1000萬條記錄的數據表中一次讀取1萬條記錄
實測結果:1000萬條記錄的數據表中一次讀取1萬條記錄,首次查詢耗時小於3毫秒(ms=千分之一秒),後續查詢耗時小於1毫秒。採用整數主鍵查詢,主鍵在數據表中的位置對查詢性能沒有顯著影響。
QT高性能表格控制項1000萬條記錄的數據表中展示1萬條記錄
QT表格控制項+QT資料庫模塊:1000萬條記錄的數據表中一次讀取1萬條記錄
1000萬條記錄的數據表中一次讀取10萬條記錄
實測結果:1000萬條記錄的數據表中一次讀取10萬條記錄,首次查詢耗時小於3毫秒(ms=千分之一秒),後續查詢耗時小於1毫秒。
QT高性能表格控制項1000萬條記錄的數據表中展示10萬條記錄
QT表格控制項+QT資料庫模塊:1000萬條記錄的數據表中一次展示10萬條記錄
1000萬條記錄的數據表中一次讀取100萬條記錄
實測結果:1000萬條記錄的數據表中一次讀取100萬條記錄,首次查詢耗時小於3毫秒(ms=千分之一秒),後續查詢耗時小於1毫秒。
QT高性能表格控制項1000萬條記錄的數據表中展示100萬條記錄
QT表格控制項+QT資料庫模塊:1000萬條記錄的數據表中一次讀取100萬條記錄
使用QT 模型視圖代理框架實現1000完條記錄的數據表中讀取1000條記錄的運行效果的視頻參考如下:
視頻: QT性能優化之QT6框架高性能模型視圖代理框架千萬級數據表分頁查詢優化效果
QT能否撐得起千萬級數據表這樣的規模?看完補天雲這個實測視頻就有答案了! QT性能優化之QT6框架高性能模型視圖代理框架千萬級數據表分頁查詢優化
QT高性能表格控制項分頁展示百萬行數據應用程式源代碼
為了減少本文的篇幅,在此只列舉了一部分關鍵代碼。
QT初始化數據表代碼:1000萬條記錄
幾個有關的常量。
QT高性能表格控制項性能測試程式用到的常數
QT高性能表格控制項性能測試程式
資料庫初始化代碼:
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT主界面代碼
以下是主視窗也就是QT表格控制項所在視窗的構造函數。
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT高性能表格控制項性能測試程式
QT表格控制項
QT圖形視圖框架整體介紹
下圖是QT助手API DOC中介紹的QT Model-View-Delegate(模型視圖代理)框架的整體結構。
QT模型視圖代理框架整體結構
圖中Model就是模型,View是視圖,Delegate是代理。三者之間的關係看圖已經很清楚了。其中,View用於用戶界面交互,包括數據展示的總體框架等;Model用於向View提供數據支持,包括查詢數據和保存數據(修改和插入);Delegate用於具體展示數據和具體提供數據編輯功能的用戶交互界面。
QT表格控制項
QT模型視圖代理框架中提供了很多視圖類型,本文介紹的QT表格控制項QTableView就是一種視圖類型。這個類型提供了表格類型的界面常用的各種功能,包括對橫向表頭和縱向表頭以及單元格的控制和修飾。
QT表格控制項界面美化效果演示
QT表格視窗
QT還提供了另外一種視圖類型:QTableWidget類型,這個類型是QTableView類型的派生類型, 在QTableView的基礎上做了更多粗粒度的封裝的API介面,使得QTableWidget使用起來更加人性化,也就是符合大多數軟體工程師的常規思維;當然QTableWidget也屏蔽了一些QTableView的底層細節API 介面,也就是有一些QTableView的一些API在QTableWidget中被使用C++的一些基礎語法進行了屏蔽。
QT資料庫組件
QT資料庫模塊整體介紹
QT助手API DOC中介紹了QT資料庫模塊的整體情況。
QT資料庫模塊整體結構
QT資料庫模塊包含了用戶界面層(UI Layer)、SQL介面層(SQL API Layer),和驅動程式層(Driver Layer)。
在QT應用程式中使用QT資料庫模塊,必須在項目文件中做如下配置。
對於CMake編譯構建管理工具:
QT資料庫模塊CMake編譯構建管理項目配置
對於qmake編譯構建管理工具:
QT資料庫模塊qmake編譯構建管理項目配置
用戶界面層(UI Layer)
這裡的UI可以理解成是資料庫模塊的普通應用開發者的API 介面;按照QT模型視圖代理框架的概念體系,這個UI也可以理解成是這些類型可能會放在用戶界面相關的程式代碼中去用,比如在與視圖有關的代碼中去調用這些API。
比如QSqlQueryModel經常作為模型類型在模型視圖代理框架中使用,當然也可以獨立使用。
SQL介面層(SQL API Layer)
QT資料庫模塊使用QSqlDatabase類型提供通用的資料庫的連接和SQL查詢操作的API介面。
驅動程式層(Driver Layer)
QT資料庫模塊使用QSqlDriver類型定義了一些資料庫的一些抽象的底層操作。特定資料庫相關的具體實現有特定資料庫對應的派生類提供。
QT 助手API DOC中描述了QT框架對特定資料庫的支持情況如下圖所示:
QT資料庫模塊驅動程式層
QT表格控制項的性能何以如此之高?
查詢和遍歷不是同一個概念
下麵是在進行SQLite資料庫查詢之後,對10000條記錄進行逐條記錄遍歷的代碼。
QT資料庫模塊查詢遍歷實例代碼
經實測運行上述代碼,遍歷10000條記錄耗時約30毫秒。
既然僅僅遍歷10000條記錄就耗時30毫秒,那麼QT表格控制項是如何做到只花了3毫秒就完成了資料庫查詢操作呢?
推測可能原因是QSqlQueryModel中並沒有直接的完整遍歷查詢結果中的10000條記錄,而是QTableView控制項中只遍歷了少量的數據記錄。當用戶拖動滾動條時,QTableView控制項再根據實際需求請求QSqlQueryModel去遍歷更多相應的數據記錄。因此看起來就像是QT表格控制項在小於1毫秒的時間之內就查詢到了10000條記錄,甚至100萬條記錄。
對預取數據的支持
本文作者經過調試QT源代碼後發現瞭如下源代碼:
QT模型視圖代理框架對數據預取的支持
這裡定義了QAbstractItemView類型的數據記錄的預取功能。每次當表格控制項QTableView的界面發生變化時,就可能觸發數據記錄預取函數prefetch()的調用執行,這個函數每次預取255條數據記錄。也就是說儘管執行SQL語句時從SQLite資料庫中查詢到了10000條記錄,甚至100萬條記錄,但是QTableView每次只從查詢結果中取出255條記錄。這樣搞當然極大的提升了包括QTableView在內的所有基於QAbstractItemView類型的視圖控制項的性能。
還有更多數據記錄嗎?
現在已經知道了QAbstractItemView每次只遍歷255條數據記錄,而QSqlQueryModel中的查詢結果記錄集中可能有10000條數據記錄,甚至100萬條數據記錄。因此模型自己必須知道查詢結果記錄集中是否還有更多數據記錄可以提供給QAbstractItemView視圖,當然實際上是提供給這個類型的派生類QTableView之類的視圖。
模型類的祖宗類QAbstractItemModel設計了兩個跟數據預取有關的虛函數。
QT模型視圖代理框架中模型類與數據預取有關的虛函數
當然,包括QSqlQueryModel在內的各種具體模型類都實現了這兩個虛函數,以此成為一個支持數據預取(prefetch)的模型類。canFetchMore()的作用是判斷是否還能獲取到更多的數據記錄,如果是則返回TRUE否則返回FALSE。fetchMore()的作用是具體獲取到更多的數據。
在這次調試實測過程中,創建了一個QSqlQueryModel的派生類ButianyunSqlQueryModel,用於觀測何時調用這兩個數據預取函數。
ButianyunSqlQueryModel實現了數據預取虛函數
下麵是調試過程中看到的函數調用棧。
QT模型視圖代理框架中對數據預取函數的調用棧
至此對與本文主題相關的表格控制項的調試分析工作已經完成。
總結
本文先通過一個具體應用實例(QT高性能表格控制項分頁展示百萬行數據)展示了從1000萬條SQLite數據記錄中查詢10000條記錄並快速顯示在QT表格控制項的實際運行效果,同時給出了這個實例的一些源代碼。然後介紹了QT表格控制項QTableView和QT資料庫組件的一些類型。後面又通過QT源碼調試分析了為什麼QT表格控制項的性能如此之高的底層邏輯。
推薦QT性能優化技術博客專欄:
QT性能優化
如果您認為這篇文章對您有所幫助,請您一定立即點贊+喜歡+收藏,本文作者將能從您的點贊+喜歡+收藏中獲取到創作新的好文章的動力。如果您認為作者寫的文章還有一些參考價值,您也可以關註這篇文章的作者。