2011-02-02 3 views
3

У меня есть приложение, в котором я хочу показать результаты 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 запросов стоит данных. Может ли кто-нибудь предложить другой подход к тому, который я использую сейчас?

+2

отделить модель от вида, обновить ее, а затем довести ее до вида, чтобы ускорить ваш код. –

ответ

0

Для серверов MS SQL я всегда использую QSqlQuery::setForward(true) для ускорения запросов до 10 раз.

Этот режим «прямой» просто отключает кеширование строк и заставляет sql-драйвер запрашивать все результаты в виде одного жирного ответа, вместо того, чтобы получать результаты запроса в виде нескольких частей (один или несколько строк).

Я обнаружил проблему с MS SQL Server 2005 + 2008 с более чем 10 миллионами записей, где я искал только 200-400 записей за особый день, чтобы отображать их внутри QTableView с помощью QSqlTableModel.

С включенным режимом прямого доступа мое время запроса прошло от 10 до 200-300 миллисекунд - в базе данных с более чем 10 миллионами записей!

Пример:

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

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

Я предположил бы, что Perfomance страдает вставив 2000 записей по отдельности, запуская 2000 просматривать обновления, может быть, 2000 видов и т.д ... Вы должны обеспечить способ добавления данных в ваш модель, которая принимает «партии» элементов и только сигналы меняются один раз ...