设为首页 加入收藏

TOP

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化(二)
2023-08-26 21:10:34 】 浏览:134
Tags:能优化 QT6 高性能 千万 查询优
0条记录耗时约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性能优化

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

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c++ 存储区 下一篇4.2 C++ Boost 内存池管理库

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目