c# и SQLite
От: Аноним  
Дата: 02.02.09 19:37
Оценка:
Здравствуйте!

Нужно в таблицу добавить 1000 строк.
Если выполнять в цикле от 1 до 1000

sql_cmd.CommandText = "insert into tablename (column1, column2) values ('значение1', 'значение2');
sql_cmd.ExecuteNonQuery();

то получается очень длительный процесс. Возможно это как то ускорить.
Например, сформировать сначала всю 1000 строк, а затем добавить их одной командой?


Спасибо за любую помощь!
Re: c# и SQLite
От: IT Россия linq2db.com
Дата: 02.02.09 20:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>то получается очень длительный процесс. Возможно это как то ускорить.


1. Использовать параметры и Prepare. Должно увеличить производительность процентов на 20-ть.

2. Открывать/закрывать транзакцию для каждых 100-200-??? записей. Увеличит производительность в несколько раз.

3. Вставлять одним запросом по нескольку сот записей:

insert into tablename (column1, column2)
select 'значение11', 'значение12'
union select 'значение21', 'значение22'
union select 'значение31', 'значение32'
Если нам не помогут, то мы тоже никого не пощадим.
Re: c# и SQLite
От: Lao Украина  
Дата: 02.02.09 20:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!


А>Нужно в таблицу добавить 1000 строк.

А>Если выполнять в цикле от 1 до 1000

А> sql_cmd.CommandText = "insert into tablename (column1, column2) values ('значение1', 'значение2');

А> sql_cmd.ExecuteNonQuery();

А>то получается очень длительный процесс. Возможно это как то ускорить.

А>Например, сформировать сначала всю 1000 строк, а затем добавить их одной командой?


А>Спасибо за любую помощь!


Если выполнять все запросы в одной транзакции, то будет быстрее.
Если надо еще быстрее, то можно попробовать отключить синхронизацию записи в файл (точное название параметра строки соединения не помню, но думаю найдешь, там их не много).
От этих действий будет самый большой прирост скорости. Есть еще параметры подключения, но от их изменения врядли добъешся большого прироста.
Не стесняйся искать на сайте производителя
Re: c# и SQLite
От: samius Япония http://sams-tricks.blogspot.com
Дата: 02.02.09 20:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!


А>Нужно в таблицу добавить 1000 строк.

А>Если выполнять в цикле от 1 до 1000

А> sql_cmd.CommandText = "insert into tablename (column1, column2) values ('значение1', 'значение2');

А> sql_cmd.ExecuteNonQuery();

А>то получается очень длительный процесс. Возможно это как то ускорить.

А>Например, сформировать сначала всю 1000 строк, а затем добавить их одной командой?


Перед циклом выполните
using (var cmd = new SQLiteCommand("BEGIN", connection))
    cmd.ExecuteNonQuery();


После цикла
using (var cmd = new SQLiteCommand("COMMIT", connection))
    cmd.ExecuteNonQuery();


Должно существенно помочь, особенно при наличии индекса.
Re[2]: c# и SQLite
От: Аноним  
Дата: 02.02.09 20:51
Оценка:
S>Перед циклом выполните
S>
S>using (var cmd = new SQLiteCommand("BEGIN", connection))
S>    cmd.ExecuteNonQuery();
S>


S>После цикла

S>
S>using (var cmd = new SQLiteCommand("COMMIT", connection))
S>    cmd.ExecuteNonQuery();
S>


S>Должно существенно помочь, особенно при наличии индекса.


Спасибо всем!
Теперь все просто летает!

Еще один вопросик.
Нужно работать с файлом базы данных одновременно из двух приложений.
На данный момент при подключении к базе данных из второго приложения получаю сообщение,
что файл уже используется. Строка подключения:

private SQLiteConnection sql_con;
sql_con = new SQLiteConnection("Data Source=my.db;Version=3;New=False;Compress=True;");

Можно это подправить?
Re[3]: c# и SQLite
От: Блудов Павел Россия  
Дата: 03.02.09 01:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Еще один вопросик.

А>Нужно работать с файлом базы данных одновременно из двух приложений.
SQLite это однопользовательская встаиваемая СУБД. Она специально затачивалась под работу в одном приложении.
Так что короткий ответ: меняйте или движок или постановку задачи.
Длинный ответ: Отключите connection pool и введите внешний механизм синхронизации обращений к базе (именованный mutex). На каждый чих прийдётся открывать подключение и закрывать его. Т.е. как-то так
_mutex.WaitOne();
conn.Open();
// работаем с базой
conn.Close();
_mutex.ReleaseMutex();
... << RSDN@Home 1.2.0 alpha 4 rev. 1136>>
Re[3]: c# и SQLite
От: TK Лес кывт.рф
Дата: 03.02.09 08:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>private SQLiteConnection sql_con;

А>sql_con = new SQLiteConnection("Data Source=my.db;Version=3;New=False;Compress=True;");

А>Можно это подправить?

попробуйте увеличить таймауты на подключение. SQLite для записи в базу хочет что-бы у нее не было активных читателей...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: c# и SQLite
От: Аноним  
Дата: 12.09.09 12:34
Оценка:
На форуме sqlite.phxsoftware.com http://sqlite.phxsoftware.com/forums/t/134.aspx в самом конце поста автор дает простой примерчик, и обещает, что таким образом 100000 записей вставляется за 1,4 секунды. Сам не проверял
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.