我有一个用于维护数据库的小型管理应用程序。我关注的表中的记录永远不会超过1000到1500条,而且只有大约8列数据。我查看它的表单是从qtableview子类化的,我使用qsqlquerymodel来填充它。多年来,我一直在mssql所在的服务器上运行这个应用程序,性能还不错,但有点迟钝……没什么大不了的。我是专门预取所有数据的,因为我不介意启动时的小延迟,以便在那之后有更好的ui性能。表中大约有1300条记录。
我不能很容易地发布代码,但它并不复杂。
我需要做一些改进,因此出于开发目的,我在我的开发机器上运行它,通过中间服务器传输sqlserver端口。我希望有一点慢,因为这一点,但隧道有很好的表现,它不应该是戏剧性的。
但是…这太可怕了以至于无法使用。我找不到关于qsqlquerymodel如何在内部工作的文档,但是基于性能,它似乎是到数据库的实时连接,尽管我已经预取了所有数据。我无法滚动浏览表单;对滚动条的单个移动作出响应可能需要20或30秒。我发现resizerowstocontents需要几分钟。与表视图的每一次琐碎交互似乎都会引发巨大的延迟,我只能将此归因于与服务器之间的大量意外来回。
我找了很多,做了一些实验。首先,我已经删除了所有调整大小的行和列,以消除这种情况(但我希望它回来)。我在预取上放了一个计时器,发现我在大约18到19秒内得到了所有的数据(在这种情况下这是可以接受的。)
我想也许我应该直接查询数据并构建自己的模型,所以我使用qsqlquery创建了一个查询,以获得相同的数据并遍历所有记录。从90秒到3分钟不等。我用了“准备”和setforwardonly。没有参数,所以没有绑定。
我已经广泛使用qt很多年了,但是我没有太多的使用qt进行sql数据库访问的经验。文档描述了函数,但似乎假设我知道幕后发生了什么,所以我只是猜测。
首先,我希望更好地了解qsqlquerymodel在幕后如何保持数据库表的最新状态(如果有的话)。第二,我正在寻找一种技术,可以用最快的方式从表中获取所有数据。在那之后我可以处理其他的事情。
暂无答案!
目前还没有任何答案,快来回答吧!