Qt - QTreeView和SQL - 性能建议
问题描述:
我有一个应用程序,我想要在分层结构中显示SQL查询结果。我有一些基于this example的工作。Qt - QTreeView和SQL - 性能建议
其中创建树节点目前看起来像这样我的代码的主要部分:
void TreeModel::setupModelData(TreeItem *parent)
{
QList<TreeItem*> parents;
QList<int> indentations;
parents << parent;
QList<QVariant> columnData;
QVector<QString> vecFileNames = getFileNames();
QVector<QString> vecTableNames = getTableNames();
for(int i = 0; i < vecFileNames.size(); i++)
{
columnData.clear();
columnData << vecFileNames[i];
parents.last()->appendChild(new TreeItem(columnData, parents.last()));
int childCount = parents.last()->childCount() - 1;
parents << parents.last()->child(childCount); //add the current parent's last child as a parent
for(int j = 0; j < vecTableNames.size(); j++)
{
columnData.clear();
columnData << vecTableNames[j];
parents.last()->appendChild(new TreeItem(columnData, parents.last()));
QVector<QString> vecTableValues = getTableValues(&vecTableNames[j]);
int childCount = parents.last()->childCount() - 1;
parents << parents.last()->child(childCount); //add the current parent's last child as a parent
for(int k = 0; k < vecTableValues.size(); k++)
{
columnData.clear();
columnData << vecTableValues[j];
parents.last()->appendChild(new TreeItem(columnData, parents.last()));
}
}
parents.pop_back();
}
}
QVector<QString> TreeModel::getFileNames()
{
db.open();
QVector<QString> vecFileNames;
QSqlQuery query(db);
QString strQuery = "SELECT PK_fileName FROM fileproperties";
query.prepare(strQuery);
if(query.exec() == true)
{
while(query.next())
{
vecFileNames.push_back(query.value(0).toString());
}
}
db.close();
return vecFileNames;
}
然而,这是令人难以置信的慢检索查询2000价值的数据。 任何人都可以提出另一种方法来我现在正在使用的?
答
您应该实现的功能hasChildren(),并使用lazy population of model data。你应该基本阅读这篇文章和文档QAbstractItemModel class(特别是canFetchMore() function)。
答
对于MS SQL服务器我总是用QSqlQuery::setForward(true)高达10倍,以加快查询。
这种“正向”模式只是禁用行缓存,并强制SQL驱动程序请求所有结果,作为一个答复脂肪,而不是得到的查询结果为多个部件的(一个或多个行)。
我发现MS SQL Server 2005 + 2008的问题超过一千万个条目,其中我只搜索了200-400个特定日期的条目,以使用QSqlTableModel在QTableView中显示它们。
与正向模式使从超过10秒就只有200-300毫秒我的查询时间 - 一个数据库上超过10万条!
例子:
QSqlQuery query(database);
query.setForwardOnly(m_bForwardOnly);
query.exec(statement);
if (query.lastError().isValid() || database.lastError().isValid()) {
...evaluate the results...
}
答
我猜想,演出]通过单独将2000个条目,引发2000中的更新,也许2000种等遭受...你应该提供添加数据的方式你模型采用项目“批”,只有一次信号的变化...
分离从视图模型,更新它,然后它attatching到视图可以加快你的代码。 – 2011-02-02 14:37:40