C++ Qt-QTreeView和SQL-performanceadvice
我有一个应用程序,我想在其中以层次结构显示SQL查询结果。我有一些基于工作的东西 当前创建树节点的代码的主要部分如下所示:C++ Qt-QTreeView和SQL-performanceadvice,c++,sql,qt,C++,Sql,Qt,我有一个应用程序,我想在其中以层次结构显示SQL查询结果。我有一些基于工作的东西 当前创建树节点的代码的主要部分如下所示: void TreeModel::setupModelData(TreeItem *parent) { QList<TreeItem*> parents; QList<int> indentations; parents << parent; QList<QVariant> columnData;
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;
}
void TreeModel::setupModelData(TreeItem*parent)
{
QList父母;
QList缩进;
父母子女数()-1;
parents-child(childCount);//将当前父对象的最后一个子对象添加为父对象
对于(int j=0;jchildCount()-1;
parents-child(childCount);//将当前父对象的最后一个子对象添加为父对象
对于(int k=0;k
然而,检索2000个查询值的数据速度非常慢。
有人能为我现在使用的方法推荐另一种方法吗?您应该实现函数haschilds()并使用。您基本上应该阅读这篇文章和文档(尤其是)。对于MS SQL Server,我通常使用它将查询速度提高10倍 这种“转发”模式只是禁用行缓存,并强制sql驱动程序将所有结果作为一个fat回复请求,而不是将查询结果作为多个部分(一行或多行)获取 我发现了MS SQL Server 2005+2008有1000多万条条目的问题,在一个特殊的日子里,我只搜索了200-400条条目,以便使用QSqlTableModel在QTableView中显示它们 启用转发模式后,我的查询时间从10多秒增加到了200-300毫秒——在一个有1000多万条记录的数据库上 示例:
QSqlQuery query(database);
query.setForwardOnly(m_bForwardOnly);
query.exec(statement);
if ( query.lastError().isValid() || database.lastError().isValid() ) {
...evaluate the results...
}
我猜性能会受到分别插入2000个条目、触发2000个视图更新、可能2000个排序等的影响。。。您应该提供一种向模型中添加数据的方法,该方法将获取“批”项,并且只发出一次更改的信号…将模型从视图中分离、更新,然后将其附加到视图可能会加快代码的速度。