【发布时间】:2018-11-29 00:31:22
【问题描述】:
我有一个用于我维护的数据库的小型管理应用程序。我关注的表中的记录永远不会超过 1000 到 1500 条,并且只有大约八列数据。我查看的表单是 QTableView 的子类,我使用 QSqlQueryModel 来填充它。多年来,我一直在MSSQL所在的服务器上运行这个应用程序,性能还可以,但是有点慢……没什么大不了的。我专门预取所有数据,因为我不介意启动时的小延迟,以便在那之后获得更好的 UI 性能。表中有大约 1300 条记录。
我不能很容易地发布代码,但它并不复杂。
我需要进行一些改进,因此出于开发目的,我在我的开发机器上运行它,SQL Server 端口通过中间服务器建立隧道。因此,我预计会稍微放慢一点,但隧道的性能很好,应该不会太戏剧化。
但是......这太可怕了,无法使用。我找不到关于 QSqlQueryModel 如何在内部工作的文档,但根据性能,即使我已经预取了所有数据,它似乎也是与数据库的实时连接。我无法滚动表单;响应滚动条的单次移动可能需要 20 或 30 秒。我发现 resizeRowsToContents 需要几分钟。与 table view 的每一次微不足道的交互似乎都会引发巨大的延迟,我只能将其归因于与服务器的大量意外来回。
我进行了很多搜索并尝试了一些实验。首先,我已经删除了所有调整大小的行和列,以使其不碍事(但我希望它回来)。我在预取上设置了一个计时器,发现我在大约 18 到 19 秒内获得了所有数据。 (在这种情况下这是可以接受的。)
我想也许我应该只查询数据并建立自己的模型,所以 我使用 QSqlQuery 创建了一个查询来获取相同的数据并遍历所有记录。它花费了 90 秒到 3 分钟。我已经使用“准备”并将 setForwardOnly 设置为 true。没有参数,所以没有绑定。
多年来,我广泛使用 Qt,但我没有太多使用它访问 SQL 数据库的经验。文档描述了函数,但似乎假设我知道幕后发生了什么,所以我只是猜测。
首先,我希望更好地了解 QSqlQueryModel 在与数据库表保持同步方面的幕后工作(如果有的话)。其次,我正在寻找一种能够以最快的方式简单地从表中获取所有数据的技术。之后我可以处理其他所有事情。
【问题讨论】:
-
我刚刚解决了独立QSqlQuery的性能问题。在准备语句之后我有 setForwardOnly 。这将性能从 90 秒更改为不到 1 秒。我可以切换使用 QSqlQueryModel 并使用这种技术,但如果我有一个不强迫我重写所有模型处理的解决方案,那肯定会很好。
-
如果你能回答你自己的问题。
-
@goug 你能告诉我你做了什么而不是 qSqlQueryModel。我面临同样的问题。请回复
-
我没有把它换成别的东西。我上面的第一条评论试图解释,但我不是很清楚。我的解决方案是在“prepare”调用之前用“true”调用“setForwardOnly”。在我使用“setForwardOnly”的地方,我想我在“准备”之后有了它,这没有任何好处。