LINUX.ORG.RU

sqlite - ужасно медленное обновление таблицы


0

1

есть БД на sqlite3

есть простаая таблица, в ней 600 000 записей

требуется: добавить к одному столбцу параметр UNIQUE

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

в принципе sqliteman так и делает

но данные надо сохранить.

вот что я делаю:
- делаю дамп базы
- удаляю все кроме удаления таблицы, создания новой и внесения в неё 600 000 записей
- открываю sqlite3 data.db
- выполняю: .read dump.sql с запросами


в итоге эта операция выполняется мучительно долго - около двух-трех часов

я что-то делаю не так или это единственно возможный способ изменить структуру таблицы не потеряв данные?

Ответ на: комментарий от splinter

а разве sqlite не предназначен для хранения больших объемов?

БД на sqlite очень удобно хранить и перемещать вместе с питоновским скриптом, который эту БД использует

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

БД на sqlite очень удобно хранить и перемещать вместе с питоновским скриптом, который эту БД использует

Может тогда MySQL embedded server?

Begemoth ★★★★★
()

Проблема, насколько я помню, в том, что sqlite driver открывает на каждый insert базу и закрывает её после запроса, потом открывает снова и т.д.

Тебе нужно обернуть всё insert'ы в одну транзакцию. Вот здесь читай сам.

schizoid ★★★
()

Может, надо выполнить begin transaction / commit?

anonymous
()
Ответ на: комментарий от Begemoth

я так понимаю что голый питон 3.2 не умеет работать с mysql?
и тем более с embedded

стоит ли искать способ работы с mysql, переделывать всю структуру базы на mysql, переписывать класс питона для работы с БД - только ради хранения большого кол-ва данных?

неужели нельзя как-то иначе внести все данные в sqlite-базу?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

>а разве sqlite не предназначен для хранения больших объемов?
sqlite предназначен в первую очередь для создания переносимой и нетребовательной БД.
600k - это, конечно, не энтерпрайз, но полнофункциональная БД подойдёт лучше, как выше советовали.

schizoid ★★★
()

600000 записей для sqlite это ооочень много. Ищи другую базу.

Reset ★★★★★
()
Ответ на: комментарий от AGUtilities

вы имеете ввиду оптимизации движка или со стороны программиста?
не требуется ли какая оптимизация в коде для больших объемов данных?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от AGUtilities

Так написано на сайте разработчика. Ни на страничке About, ни в FAQ я не нашёл ни слова о поддержке стопицот записей как фиче.
Да и не утверждал я нигде, что sqlite не потянет столько записей :3

schizoid ★★★
()
Ответ на: комментарий от sergey-novikov

и те и другие.

как уже говорили, в вашем случае, думаю действительно оптимизировать запросы.

AGUtilities ★★★
()
Ответ на: комментарий от AGUtilities

Это теоретические пределы. В реальности же на 100000 sqlite начнет тормозить, а на 1000000 просто встанет колом.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Херня, есть опыт, когда sqlite 1,5 миллиона записей неплохо ворочал.

dizza ★★★★★
()
Ответ на: комментарий от Reset

Херня, есть опыт, когда sqlite 5 миллионов записей лога squid'a неплохо ворочал.

sdio ★★★★★
()

> я что-то делаю не так

да, создавай рядом таблицу с нужной структурой, копируй записи в нее( без дампа ес-но ) и через ALTER TABLE переименовывай

aho
()

> требуется: добавить к одному столбцу параметр UNIQUE

create unique index «Новый Индекс» on «Моя Таблица» («Столбец»);

Если в будущем приспичит изменить как-то более хитро, можно создать новую таблицу и перегнать туда данные одним запросом insert-select, а не кучей инсертов. Если на изменяемую таблицу ссылаются другие таблицы, то задача усложнится :)

Плюсую советы про заворачивание в одну транзакцию и pragma synchronous.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.