медленная вставка и извлечение базы данных tcl - PullRequest
1 голос
/ 14 апреля 2011

Я новичок в Tcl.Я подключился к базе данных SqLite.

У меня есть около 100 000 записей, которые я хочу вставить в базу данных после вычислений.Я использую следующую команду, чтобы вставить записи в базу данных 100 000 раз.

Я уверен, что я делаю что-то здесь не так.Каков был бы подходящий способ сделать это?

Для вставки:

db eval {insert into table values(value1,value2,value3,value4)} 

Для поиска я должен сделать операцию выбора по крайней мере 1000 раз, все очень медленно:

db eval {select x as x, y as y from table} {
   set z  [expr $z + $x + $y]
}

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

По умолчанию каждая вставка является отдельной транзакцией.Это очень медленно.Вы можете сгруппировать вставки в одну транзакцию, скажем, в 100 вставок, и значительно ускорить процесс.

db eval { BEGIN TRANSACTION }

... do some insertions ...

db eval {  END TRANSACTION }

или

db transaction {

... do some insertions ...

}

Из коробки SQLITE чрезвычайно безопасен, но довольно медленно.Если вы знаете, что делаете, и готовы рисковать повреждением БД при сбое диска, вы можете сделать несколько оптимизаций, обеспечивающих впечатляющие улучшения скорости.

В частности:

  • Отключить синхронизацию (PRAGMA synchronous = OFF;)
  • Группировать записи в транзакции
  • Индексные таблицы
  • Использовать базу данных в памяти

Есливы не изучили все это, и, вероятно, вы работаете во много раз медленнее, чем могли бы.

0 голосов
/ 14 апреля 2011

Да, выполнение одиночных вставок из Tcl в таблицу sql - не самый быстрый способ достичь желаемого.

Чтобы ускорить процесс, вы должны записать нужную таблицу во внешний файл и сохранить данные в с одним оператором БД.

Вы бы записали данные так:

set fh [open temp_file w]
set rowid 0
# loop
  puts $fh [join [list $value1 $value2 $value3 $value4] \t]
# end loop
close $fh

Затем, используя метод copy , вы можете прочитать все за один снимок:

db copy replace values temp_file

А что касается расчета суммы, я не знаю, почему вы не используете сам sql для суммирования. В Интернете есть много примеров того, как это сделать. Здесь являются a парой . Я полагаю, что ваше заявление SQL будет что-то вроде:

db select sum(x+y) from table

или, возможно,

db select sum(x+y) as z from table
0 голосов
/ 14 апреля 2011

Я не могу говорить о части вопроса sqlite, потому что я не использовал sqlite в течение нескольких лет, но одной из причин снижения производительности является ваше выражение expr. Вам нужно заключить аргументы в expr, что должно значительно ускорить эту часть вашего цикла:

set z [expr {$z + $x + $y}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...