QSqlQueryModel的用法和性能

时间:2018-11-29 00:31:22

标签: c++ mysql qt

对于维护的数据库,我有一个小型的管理应用程序。我关注的表中的记录永远不会超过1000到1500条,并且只有大约八列数据。我查看此表单的形式是QTableView的子类,并且我正在使用QSqlQueryModel进行填充。多年以来,我一直在运行MSSQL的服务器上运行此应用程序,性能还可以,但是有点迟钝...没什么大不了的。我专门预取所有数据,因为我不介意在启动后稍有延迟,以便在此之后获得更好的UI性能。该表中大约有1300条记录。

我不太容易发布代码,但是它并不复杂。

我需要进行一些改进,因此出于开发目的,我正在开发计算机上运行它,并通过中间服务器建立了SQL Server端口。因此,我预计会有所放慢,但是隧穿具有良好的性能,并且不应该太戏剧化。

但是...这太可怕了,无法使用。我找不到有关QSqlQueryModel如何在内部工作的文档,但是基于性能,即使我已经预取了所有数据,它也似乎是到数据库的实时连接。我无法浏览表格;响应滚动条的单个移动可能需要20或30秒。我发现resizeRowsToContents需要几分钟。与表视图的每次琐碎交互似乎都会触发一个巨大的延迟,我只能将其归因于服务器的许多意外来回操作。

我进行了很多搜索并尝试了一些实验。首先,我删除了所有调整大小的行和列,以消除这种情况(但我想回来)。我在预取中设置了一个计时器,发现我在大约18到19秒的时间内即可获取所有数据。 (在这种情况下可以接受。)

我认为也许我应该只查询数据并建立自己的模型,所以 我使用QSqlQuery创建了一个查询,以获取相同的数据并遍历所有记录。从90秒到3分钟不等。我已经使用“准备”和setForwardOnly为true。没有参数,所以没有绑定。

我已经广泛使用Qt多年了,但是我对使用它进行SQL数据库访问没有太多经验。该文档描述了功能,但似乎假设我知道幕后发生的事情,因此我只是在猜测。

首先,我希望就与数据库表保持最新(如果有的话)更好地理解QSqlQueryModel在幕后所做的事情。其次,我正在寻找一种技术,可以简单地以最快的方式从表中获取所有数据。在那之后我可以处理其他所有事情。

1 个答案:

答案 0 :(得分:0)

在对查询调用“prepare”之前,我通过添加对“setForwardOnly (true)”的调用解决了我的性能问题。自从我处理这个问题已经有一段时间了,但我想我在“准备”之后调用了“setForwardOnly”,这没有用。

我继续使用 QSqlQueryModel 而没有切换到任何替代解决方案,因为这个更改满足了我的需求。