Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved] how to speed up. QSQLite INSERT query?
Forum Updated to NodeBB v4.3 + New Features

[Solved] how to speed up. QSQLite INSERT query?

Scheduled Pinned Locked Moved General and Desktop
15 Posts 4 Posters 11.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    js_dev
    wrote on last edited by
    #2

    Do you use a QTableModel or a QSqlQuery?

    Don't be afraid of perfection, you will never reach it.
    (Salvator Dali)

    1 Reply Last reply
    0
    • S Offline
      S Offline
      shint
      wrote on last edited by
      #3

      O_O~~ hello. js_dev.
      we use. QSqlQuery.

      //code
      @
      QSqlQuery query(db);
      query.prepare("DROP TABLE ");
      query.exec()
      query.prepare("CREATE TABLE ");
      query.exec()
      query.prepare("INSERT INTO ");
      query.exec()
      @

      1 Reply Last reply
      0
      • J Offline
        J Offline
        js_dev
        wrote on last edited by
        #4

        In my experience QSqlQuery is much faster than QTableModel. So that should be fine.
        But I gues without some code it is hard to say what the reason is.

        Have you started a transaction before inserting data?

        Don't be afraid of perfection, you will never reach it.
        (Salvator Dali)

        1 Reply Last reply
        0
        • S Offline
          S Offline
          shint
          wrote on last edited by
          #5

          i was test. two codes.
          but. same speed.;;;;;

          //not use prepare. addBindValue.
          @
          QString tmp, str;
          for(int row = 0; row < nRowCount; row++)
          {
          QString qsQuery = qsInsertTable;
          int nValueCount = 0;
          for(int col = 0; col < nColumnCount; col++)
          {
          qApp->processEvents();
          QModelIndex modelIndex = pModel->index(row, col);
          QVariant v = pModel->data(modelIndex);
          if(!v.isNull())
          {
          qsQuery += "'" + v.toString() + "',";
          nValueCount++;

                  //
                  tmp.sprintf("%d %d ", row, col);
                  str += tmp + v.toString() + "/ ";
              }
              else
              {
                  qsQuery += "'',";
              }
          }
          
          if(nValueCount == 0)
          {
              str += "\n";
              continue;
          }
          
          qsQuery.chop(1);
          qsQuery += ")";
          if (!query.exec&#40;qsQuery&#41;)
          {
              qCritical() << query.lastError();
          }
          str += "\n";
          

          }
          qDebug() << str;
          @

          //use prepare. addBindValue.
          @
          QString tmp, str;
          for(int row = 0; row < nRowCount; row++)
          {
          query.prepare(qsInsertTable);
          int nValueCount = 0;
          for(int col = 0; col < nColumnCount; col++)
          {
          qApp->processEvents();
          QModelIndex modelIndex = pModel->index(row, col);
          QVariant v = pModel->data(modelIndex);
          if(!v.isNull())
          {
          query.addBindValue(v.toString());
          nValueCount++;

                  //
                  tmp.sprintf("%d %d ", row, col);
                  str += tmp + v.toString() + "/ ";
              }
              else
              {
                  query.addBindValue(QString(""));
              }
          }
          
          if(nValueCount == 0)
          {
              str += "\n";
              continue;
          }
          
          if (!query.exec&#40;&#41;)
          {
              qCritical() << query.lastError();
          }
          str += "\n";
          

          }
          @

          1 Reply Last reply
          0
          • M Offline
            M Offline
            mabrand
            wrote on last edited by
            #6

            You should probably check this "faq":http://www.sqlite.org/faq.html#q19.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              shint
              wrote on last edited by
              #7

              thank you. mabrand.
              i will see.

              1 Reply Last reply
              0
              • J Offline
                J Offline
                js_dev
                wrote on last edited by
                #8

                I do it like described "here":http://doc.qt.nokia.com/4.7/qsqlquery.html#prepare.

                This works fine and is fast enough for my software.

                Don't forget the @db.transaction()@ and @db.commit()@ before and after your query.

                Don't be afraid of perfection, you will never reach it.
                (Salvator Dali)

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  shint
                  wrote on last edited by
                  #9

                  O_T js_dev.
                  thank you for being so caring.

                  i just do it!

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    shint
                    wrote on last edited by
                    #10

                    thank you. very much. js_dev.
                    and. with mabrand.

                    i success.
                    i applyed transaction() and commit().
                    and very fast write!.

                    have a nice day~~ O_O~~;;;;

                    1 Reply Last reply
                    0
                    • J Offline
                      J Offline
                      js_dev
                      wrote on last edited by
                      #11

                      Great :-)

                      Don't be afraid of perfection, you will never reach it.
                      (Salvator Dali)

                      1 Reply Last reply
                      0
                      • S Offline
                        S Offline
                        shint
                        wrote on last edited by
                        #12

                        O_O~~

                        1 Reply Last reply
                        0
                        • G Offline
                          G Offline
                          goetz
                          wrote on last edited by
                          #13

                          [quote author="shint" date="1296545085"]
                          //use prepare. addBindValue.
                          @
                          QString tmp, str;
                          for(int row = 0; row < nRowCount; row++)
                          {
                          query.prepare(qsInsertTable);
                          int nValueCount = 0;
                          for(int col = 0; col < nColumnCount; col++)
                          {
                          @[/quote]

                          You should prepare your statement once (outside the for row statement) and use it multiple times. You actually do it the other way round: You create a single new prepared statement for each row you insert. This does not save you time, but cost you.

                          http://www.catb.org/~esr/faqs/smart-questions.html

                          1 Reply Last reply
                          0
                          • J Offline
                            J Offline
                            js_dev
                            wrote on last edited by
                            #14

                            [quote author="Volker" date="1296556882"]
                            [quote author="shint" date="1296545085"]
                            //use prepare. addBindValue.
                            @
                            QString tmp, str;
                            for(int row = 0; row < nRowCount; row++)
                            {
                            query.prepare(qsInsertTable);
                            int nValueCount = 0;
                            for(int col = 0; col < nColumnCount; col++)
                            {
                            @[/quote]

                            You should prepare your statement once (outside the for row statement) and use it multiple times. You actually do it the other way round: You create a single new prepared statement for each row you insert. This does not save you time, but cost you.[/quote]

                            Good point! I haven't seen this.

                            Don't be afraid of perfection, you will never reach it.
                            (Salvator Dali)

                            1 Reply Last reply
                            0
                            • S Offline
                              S Offline
                              shint
                              wrote on last edited by
                              #15

                              O_O'''' oh! i understand.
                              Volker. good man. thank you.

                              to prepare() for a worry I will try to use.

                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved