【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化

简介

本文使用QT树状控件QTreeView快速展示SQLite数据库中的1000万条具有层次结构的数据记录,当然每次只展示一部分记录。基本思路是在初始化时只显示顶层结构的数据记录;在树状控件的某一个节点被用户操作展开时再即时到数据库中查询相应的数据记录并作为该节点的下层节点插入到树状控件中;在某一个节点被用户操作收缩时立即删除该节点的子节点。整个树状控件中总是只加载用户关心的数据,而不是加载所有数据,使得树状控件的显示和展开及收缩操作都在几毫秒到几十毫秒就能完成,从而极大的提升了应用程序的运行性能。另外,对于千万量级的数据库,对数据进行分层管理对于降低应用程序内存占用也发挥了举足轻重的价值。

正文

QT高性能树状控件百万节点效果演示

在这里插入图片描述
QT高性能树状控件百万节点效果演示截图

本文描述之使用QT模型视图代理框架对1000万条记录数据表分层展示的运行效果参考视频如下:

视频:QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化效果

QT应用能不能快速展示千万级数据表中的数据? 看完补天云这个视频你就知道怎么回事了: QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化

QT高性能树状控件百万节点源代码:数据库层

数据库初始化

QT高性能树状控件百万节点效果演示千万条记录数据初始化代码

在这里插入图片描述
这里就是按照公司、分公司、部门、员工四个层级依次生成数据。员工记录1000万条。都是一些INSERT语句的执行,为了 节省篇幅,本文略去这些代码。

基础数据结构

本文介绍的QT高性能树状控件百万节点效果演示程序使用的一些基础数据结构定义如下所示:

QT高性能树状控件百万节点效果演示程序基础数据结构
在这里插入图片描述

QT高性能树状控件百万节点效果演示程序基础数据结构

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序基础数据结构

在这里插入图片描述

公司查询

QT高性能树状控件百万节点效果演示程序公司查询数据库的源代码。

在这里插入图片描述
QT高性能树状控件百万节点效果演示程序公司查询
为了节省篇幅,这里只写了关键代码,省去了一些错误判断的辅助代码。

分公司查询

QT高性能树状控件百万节点效果演示程序分公司查询数据库的源代码。

QT高性能树状控件百万节点效果演示程序分公司查询

在这里插入图片描述

部门查询

QT高性能树状控件百万节点效果演示程序部门查询数据库的源代码。

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序部门查询

员工查询

QT高性能树状控件百万节点效果演示程序员工查询数据库的源代码。
在这里插入图片描述

QT高性能树状控件百万节点效果演示程序员工查询

QT高性能树状控件百万节点源代码:界面层

界面初始化

窗口类的头文件如下所示。窗口中包含了树状控件。

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序界面

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序界面

树状控件初始化

QT高性能树状控件百万节点效果演示程序树状控件初始化顶层节点(根节点)的源代码。
在这里插入图片描述

QT高性能树状控件百万节点效果演示程序界面树状控件初始化

在初始时刻,只加载了顶层节点的数据,也就是公司级别的数据,而暂时没有立即加载分公司数据和部门数据以及员工数据。这样极大的降低的应用程序的内存占用量。数据库中存在1000万条员工记录,如果一次性全部加载到进程中,将占用很多的内存。

树状控件节点展开事件处理

QT高性能树状控件百万节点效果演示程序节点展开事件处理的源代码。

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
备注:

(a)根据这些ID判断是哪一个层级的节点。

公司节点展开分公司列表的情况:
在这里插入图片描述

QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
分公司节点展开部门列表的情况:
在这里插入图片描述

QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理
部门节点展开员工列表的情况:

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序树状控件节点展开事件处理

在本文介绍的实例中,按照数据记录本身的层次关系,采用数据分层管理的策略,在节点展开时即时从数据库加载该节点的下级数据,在节点收缩时删除该节点的下级节点。这种策略通常可以很好的避免应用程序的内存占用量随着数据库中的数据记录的数量规模的增加而增长的情况。显然,本文介绍的实例中,即使数据库中存在1000万条员工记录,但是由于每次只加载1000条记录,因此内存占用量和数据规模几乎没有关系。

数据库查询过程中动态创建的这些自定义数据条目(ButianyunItem)保存在department.items这个列表中,这些条目的内存什么时候释放呢? 答案是这个函数执行完之后自动释放,看一下ButianyunItem的析构函数就明白了。
在这里插入图片描述

QT高性能树状控件百万节点效果演示程序数据条目析构函数

树状控件节点收缩事件处理

下面是QT高性能树状控件百万节点效果演示程序节点收缩事件处理的源代码。
在这里插入图片描述
QT高性能树状控件百万节点效果演示程序节点收缩事件处理
备注:

(a)根据这些ID判断是哪一个层级的节点。

公司节点收缩的情况:

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序节点收缩事件处理

分公司节点收缩的情况:
在这里插入图片描述

部门节点收缩的情况:

在这里插入图片描述

QT高性能树状控件百万节点效果演示程序节点收缩事件处理

总结

在千万量级数据记录的SQLite数据库应用场景中,如何解决数据量大导致的数据加载时间长,数据展示性能差的问题呢? 鉴于这种数据记录之间的层级关系和QT树状控件展开和收缩操作的特点,本文介绍了一种在使用数据库的索引结构的基础上,按需加载数据的方法,避免了一次性加载所有数据产生的一些性能问题, 并将树状控件的展示和节点操作消耗的时间优化到了几毫秒到几十毫秒这种可接受的范围;同时内存占用量也降低到了基本与数据规模无关的程度。

QT性能优化技术博客专栏:
QT性能优化

如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。

posted @ 2023-08-08 12:10  QT界面美化性能优化  阅读(56)  评论(0编辑  收藏  举报  来源