Qt-QTreeViewおよびSQL-パフォーマンスに関するアドバイス

c++ qt sql
Qt-QTreeViewおよびSQL-パフォーマンスに関するアドバイス

SQLクエリの結果を階層構造で表示するアプリがあります。 http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html [この例]に基づいた作業があります。

現在、ツリーノードが作成されるコードの主要部分は次のようになります。

void TreeModel::setupModelData(TreeItem *parent)
{
  QList parents;
  QList indentations;
  parents << parent;
  QList columnData;

  QVector vecFileNames = getFileNames();
  QVector 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 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 TreeModel::getFileNames()
{
  db.open();

  QVector 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件のクエリに相当するデータの取得は非常に遅くなります。 誰かが私が現在使用しているアプローチに別のアプローチを提案できますか?

  3  1


ベストアンサー

関数hasChildren()を実装し、http://doc.qt.io/qt-5/model-view-programming.html#lazy-population-of-model-data [モデルデータの遅延母集団]を使用する必要があります。 基本的にこの記事とhttp://doc.qt.io/qt-5/qabstractitemmodel.html[QAbstractItemModelクラス]のドキュメント(特にhttp://doc.qt.io/qt-5/model-view- programming.html#performance-optimization-for-large-amounts-of-data [canFetchMore()function])。

1


MS SQL Serverの場合、常にhttp://doc.qt.io/archives/qt-4.7/qsqlquery.html#setForwardOnly[QSqlQuery::setForward(true)]を使用して、クエリを最大10倍高速化します。

この「フォワード」モードは、クエリ結果を複数の部分(1つ以上の行)として取得するのではなく、行キャッシュを無効にし、すべての結果を1つの太い応答としてSQLドライバーに要求します。

QSQLTableModelを使用してQTableView内に表示する特別な日に200〜400エントリのみを検索した、1000万を超えるエントリを持つMS SQL Server 2005 + 2008で問題を発見しました。

転送モードを有効にすると、クエリ時間が10秒を超えて200〜300ミリ秒になりました-エントリ数が1,000万を超えるデータベースでは!

例:

QSqlQuery query(database);
query.setForwardOnly(m_bForwardOnly);

query.exec(statement);
if ( query.lastError().isValid() || database.lastError().isValid() ) {
   ...evaluate the results...
}

0


2000個のエントリを個別に挿入し、2000個のビューの更新、おそらく2000個の並べ替えなどをトリガーすると、パフォーマンスが低下すると思います。 モデルにデータを追加する方法を提供する必要があります。この方法では、アイテムの「バッチ」を取得し、変更を1回だけ通知します。

0


タイトルとURLをコピーしました