2014-10-09 5 views
0

У меня есть таблица, которая содержит 350632 записей в настоящее время. Я недавно добавил новый столбец в таблицу, которую я пытаюсь заполнить с помощью этого кода в C#:SQLite UPDATE performance

List<int> listOfInts = new List<int>(); 
     dbConnect.Open(); 
     int counter = 1; 
     string toExecute = "select * from tempwords"; 
     string insertQuery = "update tempwords set [email protected]"; 

     using (SQLiteTransaction transaction = dbConnect.BeginTransaction()) 
     { 
      using (SQLiteCommand newCommand = new SQLiteCommand(toExecute, dbConnect)) 
      { 
       using (SQLiteDataReader reader = newCommand.ExecuteReader()) 
       { 

        while (reader.Read()) 
        { 
         listOfInts.Add(counter); 
         counter++; 
        } 
       } 
      } 
      transaction.Commit(); 
      dbConnect.Dispose(); 
     } 
     Console.WriteLine(listOfInts.Count.ToString()); 
     dbConnect.Open(); 
     int iterator = 0; 
     using (SQLiteTransaction transactionx = dbConnect.BeginTransaction()) 
     { 

      using (SQLiteCommand command = new SQLiteCommand(insertQuery, dbConnect)) 
      { 
       command.Transaction = transactionx; 
       while (iterator <= listOfInts.Count - 1) 
       { 

        command.Parameters.AddWithValue("@toInsert", listOfInts[iterator]); 
        command.ExecuteNonQuery(); 
        iterator++; 
        Console.WriteLine((iterator + 1).ToString() + Environment.NewLine); 
       } 
      } 
      transactionx.Commit(); 
      dbConnect.Dispose(); 

     } 

Я думаю, что логика в порядке, и все это будет сделано правильно, но обновление настолько медленно (даже хотя у меня есть индекс в столбце rownum). Есть ли способ ускорить его до некоторого реалистического времени?

Заранее спасибо.

+0

У тебя проблемы с производительностью, вероятно, из-за завершения 350000+ заявления обновления , Если вы можете выполнить пакетную проверку своего оператора обновления, это будет намного быстрее. – Kritner

+0

Можете ли вы дать совет о том, как это сделать (я действительно пытался, но я не могу заставить его работать)? – Matsura

+0

Ваш новый столбец, какие типы ценностей он получает? это просто прибавочная стоимость? – Kritner

ответ

1

Эта команда:

update tempwords set [email protected] 

обновляет все строки 360632 (с тем же значением).

При выполнении этой команды 360632 раза вы заканчиваете обновление строк 122942799424.

Если вы хотите обновить только одну строку с каждым выполнением команды, вы должны указать базу данных, строка, которая является:

update tempwords set rownum = @toInsert where _id = @id_of_the_row 
+0

Я заметил, что позже и скорректировал его, он намного быстрее, но все же медленно (потребовалось целую ночь для обновления), любые предложения? – Matsura

+0

Я ответил на вопрос, который вы задали. Чтобы задать новый вопрос, используйте кнопку «Спросить вопрос». –