LINUX.ORG.RU

pragma optimize: почему рекомендуют вызывать в конце а не в начале? а если из отдельного коннекта?

 ,


0

2

Здрасьти.

Имеем сайт, т.е. приложение с очень большим аптаймом. База – SQLite. Нужно чтобы всё работало быстро, и стартовало / завершалось тоже.

Если вызывать pragma optimize при закрытии каждого соединения, как рекомендуют по ссылке выше, то есть шанс, что рано или поздно – и как положено, в самый неподходящий момент – оно задумается. А вместе с ним и админ: с чего это вдруг nginx не хочет завершаться? kill -9 его.

Понятно, что перед pragma optimize я ещё выдам pragma analysis_limit = 1000, чтобы оно совсем уж неприлично не задумывалось. Но внутренний перфекционист всё равно недоволен.

Для долгоиграющих приложений, по первой ссылке рекомендуют запускать pragma optimize раз в несколько часов. Делать это в рабочих коннектах – нехорошо, юзеры также будут время от времени ни с того ни с сего задумываться.

Отсюда вопросы:

  • Много ли выгоды я потеряю, если буду вызывать optimize из-под отдельного коннекта в фоновом потоке? Не спроста ж они рекомендуют вызывать его перед закрытием коннектов – небось накопленную коннектом статистику используют. Впрочем, бит 8 в MASK я в любом случае буду отключать – ещё блин какая-то сраная железка за меня не решала, какие индексы ей нужны. Но хотя бы тупой analyze-то отработает?

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

★★★★★

Если вызывать pragma optimize при закрытии каждого соединения, как рекомендуют по ссылке выше, то есть шанс, что рано или поздно – и как положено, в самый неподходящий момент – оно задумается. А вместе с ним и админ: с чего это вдруг nginx не хочет завершаться? kill -9 его.

И что?

В общем пока не понятно, почему ты не хочешь делать так, как пишут в документации. У тебя есть какие-то основания бояться того, что kill -9 во время оптимизации испортит твою базу? sqlite вроде не настолько плох.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 1)

Почему бы не выводить соединения на профилактику? Например, сделал по соединению 100к запросов — отправил соединение на профилактику, вместо него открыл новое. А в выведенном на профилактику соединении в отдельном потоке исполнения запустил оптимайз и закрыл. Запускать оптимайз в соединении, которое не поработало и не набрало статистики, нет смысла.

iliyap ★★★★★
()