2011-02-02 5 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 Server의 경우 항상 최대 12 배의 쿼리 속도를 내기 위해 QSqlQuery::setForward(true)을 사용합니다.

이 "전달"모드는 행 캐시를 비활성화하고 쿼리 결과를 여러 부분 (하나 이상의 행)으로 가져 오는 대신 sql 드라이버가 모든 결과를 하나의 큰 응답으로 요청하도록합니다.

100000 개가 넘는 항목이있는 MS SQL Server 2005 + 2008의 문제점을 발견했습니다. QSqlTableModel을 사용하여 QTableView 내부에 표시 할 특별한 날에 대해 200-400 개의 항목 만 검색했습니다.

전달 모드를 사용하면 쿼리 시간이 10 초에서 200-300 밀리 초까지 줄어 듭니다. 1000 만 개가 넘는 항목이있는 데이터베이스에서!

예 :

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

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

나는 perfomance가 개별적으로 2,000 항목을 삽입하는 등 2000보기 업데이트, 어쩌면 2000 종류의 트리거에 의해 고통 추측 것입니다 ... 당신에 데이터를 추가하는 방법을 제공해야 당신의 항목의 "일괄 처리"를 수행하고 신호 만 변경되는 모델 ...