Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Здравствуйте, подскажите почему при первом подключении к базе, подключение происходит довольно долго, особенно заметно на базах с большим объемом данных. После того как база загрузилась, то последующие запуски приложения с загрузкой базы происходит быстро, но только до тех пор пока компьютер не перезагрузишь, после перезагрузки, первый запуск опять долгий.

Вопросы такие:
1. почему так происходит?
2. как можно от этого избавиться, есть ли способ сделать первый запуск быстрым как и последующие?

Спасибо.
3 ноя 18, 19:33    [21723369]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Возможно первый раз идет чтение с диска, затем из кэша, т.е. из памяти. Если так, то просто сделать первый запуск в холостую, т.е. планировщик при старте ОС запускает какую-то прогу, которая обращается к базе.
3 ноя 18, 19:39    [21723373]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Dima T
Если так, то просто сделать первый запуск в холостую, т.е. планировщик при старте ОС запускает какую-то прогу, которая обращается к базе.
Не совсем понятно о чем вы и при чем тут планировщик.
Опишу ситуацию подробнее. У меня есть приложение написанное на C#, с помощью библиотеки sqlite.dll я открываю базу. При первом запуске приложения база открывается долго, затем если закрыть программу и снова программу запущу и открою базу, то база открывается очень быстро, до тех пор пока я не перезагружу компьютер. После перезагрузки, первое открытие базы программой всегда долгое. Это происходит с каждой базой, которою я открываю программой.
3 ноя 18, 19:51    [21723383]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Железо опиши. В нем проблема. Но по описанным симптомам просто достаточно сделать один фальшстарт и дальше все будет работать. Это самый дешевый вариант решения проблемы.
3 ноя 18, 20:39    [21723408]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Dima T
Железо опиши. В нем проблема. Но по описанным симптомам просто достаточно сделать один фальшстарт и дальше все будет работать. Это самый дешевый вариант решения проблемы.
Дело не в железе. Потому как погуглив, понял что проблема не у одного меня, но ответа на решение проблемы я не нашел.
Вот к примеру у человека такая же проблема. Я в английском несилен, но из того что понял проблему там так и не решили.

Вот еще тут, но тот ответ что там указан:
CREATE INDEX i_tableone_entry ON tableOne( entry );

мне не помог.

Так что тут дело не в железе, проблема распространенная.
3 ноя 18, 20:51    [21723412]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
White Owl
Member

Откуда:
Сообщений: 12390
Neff,

Поддерживаю первый ответ (21723373).
Дай базе расширение которое не обрабатывается виндами как потенциально опасное или собственное виндовое.
Убедись что твоя база не лежит на сетевом диске.
3 ноя 18, 22:31    [21723451]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
White Owl
Neff,

Поддерживаю первый ответ (21723373).
Дай базе расширение которое не обрабатывается виндами как потенциально опасное или собственное виндовое.
Убедись что твоя база не лежит на сетевом диске.

Расширения менял, на проблему это никак не повлияло. База лежит на локальном диске.
3 ноя 18, 22:37    [21723455]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Хочу уточнить, скорее не при первом подключении базы, а при первом запросе SELECT, затем все работает быстро, даже если приложение закрыть а потом снова открыть и делать запросы к базе.
3 ноя 18, 23:30    [21723461]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Вот еще аналогичная проблема, без ответа.
4 ноя 18, 02:42    [21723492]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Поискав информацию в сети, понял вашу мысль. Вы считаете, что при первом запуске происходит кеширование файла базы, средствами Windows, при первом запуске. Я решил проверить это, вот пример:

1. делаю первый запрос
SELECT column1, column2 FROM Table1 WHERE column1 LIKE 'test'
Этот первый запрос длиться 30 секунд, после того как данные загрузились, закрываю приложение, затем открываю и снова выполняю данный запрос, данные загружаются за 1 секунду.

2. изменяю запрос на запрос
SELECT column1 FROM Table1 WHERE column1 LIKE 'test'
И снова первый запрос занимает 30 секунд, а последующие 1 секунду.

Я так понял кеширование средствами OC тут не причем? Не могу понять, почему так происходит.
4 ноя 18, 17:13    [21723677]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1313
Neff,

Может проблема в вашем провайдере данных (C# -> провайдер -> ADO.NET -> SQlite ). Попробуйте выполнить запрос через стандартную утилиту для sqlite, если задержек не будет, то проблема не в самих данныхи ни в ядре БД, тогда надо смотреть ваше приложение
4 ноя 18, 19:04    [21723727]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Neff
Я так понял кеширование средствами OC тут не причем? Не могу понять, почему так происходит.

Возможно ни при чем. Но надо сделать ситуацию повторяемой, чтобы все могли увидеть и подтвердить. Как понимаю как-то завязаны старт ОС и использование LIKE.

Свои данные мало кто готов предоставить для опытов, отчасти поэтому тут 21680375 выкладывал скрипт создания относительно большой БД со штрихкодами, можно на ее основе попытаться повторить данную проблему. Сегодня некогда, завтра позанимаюсь.
4 ноя 18, 19:29    [21723737]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
VSVLAD
Neff,

Может проблема в вашем провайдере данных (C# -> провайдер -> ADO.NET -> SQlite ). Попробуйте выполнить запрос через стандартную утилиту для sqlite, если задержек не будет, то проблема не в самих данныхи ни в ядре БД, тогда надо смотреть ваше приложение
Здравствуйте, пробовал открывал базу в сторонних приложениях, например в SQLite Expert. Первый раз так же открывает с задержкой, последующие запуски открывает сразу за 1 сек.
4 ноя 18, 21:41    [21723805]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Dima T
Neff
Я так понял кеширование средствами OC тут не причем? Не могу понять, почему так происходит.

Возможно ни при чем. Но надо сделать ситуацию повторяемой, чтобы все могли увидеть и подтвердить. Как понимаю как-то завязаны старт ОС и использование LIKE
Открывал базу на других машинах и без использования LIKE, пробовал открывать базу сторонними утилитами, проблема та же. Долгий первый запуск, затем все быстро, пока не перезагрузишь компьютер или не скопируешь базу в другой каталог и снова открыть. Так что и при смене каталога первый запуск с задержкой, что странно.
4 ноя 18, 21:45    [21723807]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Dima T
Свои данные мало кто готов предоставить для опытов, отчасти поэтому тут 21680375 выкладывал скрипт создания относительно большой БД со штрихкодами, можно на ее основе попытаться повторить данную проблему.
Я попробовал скачал архив и преобразовалего по инструкции в посте и преобразовал ее в базу. Сторонней утилитой база открылась сразу без задержек.
4 ноя 18, 22:14    [21723819]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Блин ребята, проблему решил благодаря этому 21680375 посту, спасибо Dima T за наводку. Проанализировав созданную с конвертированную базу sqlite.exe, увидел, что там добавлен индекс к каждому столбцу. Добавил индекс ко всем столбцам в своей базе через CREATE INDEX и все нормально заработало, база стала открываться быстро всегда и везде. Раньше то же пробовал CREATE INDEX, но не для всех столбцов, в этом видимо и была проблема. В общем спасибо за ответы, что натолкнули меня свой "косяк".
4 ноя 18, 22:47    [21723835]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Столкнулся с новой проблемой...
Если я создаю таблицу, потом заполняю ее данными, затем создаю индексы через команду CREATE INDEX, то таблица всегда открывается быстро.

Но если я создаю таблицу, затем создаю индексы, а потом заполняю таблицу данными, то проблема остается.

Так и должно быть? Как правильно создавать индексы?
5 ноя 18, 04:25    [21723916]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Neff
Добавил индекс ко всем столбцам в своей базе через CREATE INDEX и все нормально заработало

Это бред какой-то и так точно не надо делать.
Индекс нужен для быстрого поиска, т.е. если ты пишешь
select ... where name = 'товар'

то тут нужен индекс по name, тогда поиск будет не перебором всей таблицы, а по индексу будут выбраны только нужные записи.
Минус индексов в том что при каждом insert/update требуется перестройка индекса, что тоже занимает время. Вкратце описал, не буду углубляться, при желании это в книгах почитаешь.
Явно дело не в индексах.

Несколько раз перечитал топик, согласен с подозрениями White Owl на антивирус, но сменой расширения его не проведешь. Просто отключи антивирус и запусти свою прогу - не будет тормозов, значит дело в нем, добавь прогу в исключения.
5 ноя 18, 15:27    [21724269]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Dima T, да я почитал про индексы и с вами согласен, но то что без индексов первый запуск таблицы составляет 30 секунд, а с индексами 1 сек это факт. Как сделать по другому, что бы без индексов загружалось за те же 1 сек, я не знаю.

В обще, ранее использовал под хранение данных, базы Access и там таких проблем не было, при том же формате таблиц и данных. Но затем пришлось искать альтернативу, так как у Access ограничение в 2 гб, а разделение таблиц на части делать не хочется.

Вот решил попробовать SQLite базы, но тут проблем оказалось не меньше, индексы, после удаления данных каждый раз вызывать команду VACUUM, что тоже не вариант, а PRAGMA auto_vacuum при создании таблиц не работает, так как видимо нужно включить параметр SQLITE_DEFAULT_AUTOVACUUM при компиляции библиотеки.

Если подскажите варианты баз, для хранения больших объемов данных буду благодарен. Нужно что бы база хранилась на локальном диске, одним файлом и помимо текста, можно было сохранять в базе документы в формате Word и PDF. Знаю что хранить файлы в базе плохая идея, но так нужно.
5 ноя 18, 16:58    [21724345]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Dima T
Member

Откуда:
Сообщений: 13939
Neff
Dima T, да я почитал про индексы и с вами согласен, но то что без индексов первый запуск таблицы составляет 30 секунд, а с индексами 1 сек это факт. Как сделать по другому, что бы без индексов загружалось за те же 1 сек, я не знаю.

Индексы нужны, но там где надо. Как уже написал у них есть плюсы и минусы, т.е. прежде чем добавить индекс - надо понимать зачем он нужен.

Neff
В обще, ранее использовал под хранение данных, базы Access и там таких проблем не было, при том же формате таблиц и данных. Но затем пришлось искать альтернативу, так как у Access ограничение в 2 гб, а разделение таблиц на части делать не хочется.

Если у тебя база 2+ Гб и первый запрос делает скан всей базы, то считай: скорость чтения HDD ~100 мб/сек, т.е. 20+ сек в идеале. Скорость чтения памяти (кэша диска) 3-4 Гб/сек, т.е. меньше секунды. Скорее всего ответ в этом, сделай как я советовал 21723373 и забей.
Neff
Вот решил попробовать SQLite базы, но тут проблем оказалось не меньше, индексы, после удаления данных каждый раз вызывать команду VACUUM, что тоже не вариант, а PRAGMA auto_vacuum при создании таблиц не работает, так как видимо нужно включить параметр SQLITE_DEFAULT_AUTOVACUUM при компиляции библиотеки.

Ацессовские базы тоже пухнут и требуют сжатия, что по сути тот же VACUUM. auto_vacuum не рекомендую использовать, при твоих гигабайтах это будет тормоз после каждого удаления.
Neff
Если подскажите варианты баз, для хранения больших объемов данных буду благодарен. Нужно что бы база хранилась на локальном диске, одним файлом и помимо текста, можно было сохранять в базе документы в формате Word и PDF. Знаю что хранить файлы в базе плохая идея, но так нужно.

Идея очень плохая, но если так нужно - хотя бы вынеси файлы в отдельную базу. Сделай одну нормальную базу, а вторую - куча файлов одной таблицей: (file_id int, file_data text) и там индекс по file_id чтобы быстро находить нужный файл.
По-хорошему надо использовать полноценный SQL-сервер (MSSQL, MySQL, Postgres, Oracle), но ты хочешь на файл-сервере прожить, тут только sqlite.
5 ноя 18, 18:58    [21724473]     Ответить | Цитировать Сообщить модератору
 Re: Медленное подключение к базе sqlite при первом подключении  [new]
Neff
Member

Откуда:
Сообщений: 14
Dima T, спасибо за рекомендации. Нужно будет попробовать с хранением файлов в отдельной базе. Просто файлов очень много (около 30 тыс.), но все небольшого размера, в среднем 100-200 кб, хранить и контролировать это не очень удобно. Была мысля хранить это все в zip архиве, что бы все было одним файлом, но как это все будет работать, когда в него придется добавлять/удалять файлы не знаю, надо потом протестировать.
5 ноя 18, 21:43    [21724633]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить