2011-02-02 31 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

分離從視圖模型,更新它,然後它attatching到視圖可以加快你的代碼。 – 2011-02-02 14:37:40

回答

0

對於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... 
} 
0

我猜想,演出]通過單獨將2000個條目,引發2000中的更新,也許2000種等遭受...你應該提供添加數據的方式你模型採用項目「批」,只有一次信號的變化...