|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
Вопрос к практикам. Если нет практиков, сойдут и теоретики. :) Хотелось бы услышать ваши мнения по оптимизации по скорости для SQLite (версия не ниже 3.7.0). В основном интересует использование прагм и режимов журнала. Собственно, прагмы: http://sqlite.org/pragma.html#toc Журнал: http://sqlite.org/pragma.html#pragma_journal_mode Пока по логике и экспериментам установил, что наиболее значим размер кеша страниц. У кого-нибудь выработалась формула расчета необходимого размера кеша? Для монопольного режима можно отключить журнал и синхронизацию с диском. Это может привести к порче базы, но и скорость массовой вставки увеличилась раз в пять (пробовал на объемах порядка 2 ГБ, 8 млн. строк). Какие режимы журнала оптимальнее при монопольном и множественном доступах? В режиме WAL имеет ли смысл изменение wal_autocheckpoint? А отключение? Имеет ли смысл увеличивать размер страницы при работе базы на ПК? Типичный размер кластера/блока сейчас 4 кБ. Не понятно, почему по дефолту стоит размер страницы 1 кБ. Да и страницы виртуальной памяти у нас по 4 кБ. Думаю, для хранения множества TEXT/BLOB размерами больше страницы тоже стоит увеличить страницу до размера среднего BLOB-а. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2011, 20:06 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXL...пробовал на объемах порядка 2 ГБ, 8 млн. строк... У вас типичная небольшая база, обычно на таких объемах ничего и оптимизировать-то не надо. Если есть конкретные проблемы/вопросы - озвучьте их. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2011, 22:28 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
MBG, Меня интересуют "все" аспекты. Знакомство с SQLite у меня началось недавно и хотелось бы составить для себя обобщенный набор рецептов для той или иной ситуации. Раньше косо смотрел на эту базу, пока не попробовал с ней работать и захотелось узнать получше. В данный момент рассматриваю оптимизацию под заливку данных в базу, но хотелось бы узнать и про оптимизацию под остальные ситуации. К примеру, ведение лога, накопление результатов по триггеру и частое чтение результатов накопления: ситуация с частой выборкой в условиях частых вставок/модификаций (скажем, отношение 1:2 ... 1:1 и порядка 10-30 вставок/модификаций в секунду). Еще, сейчас тестирую с заливкой одних и тех же данных в различных условиях: размер страниц, режимы лога, режимы синхронизации, наличие или отсутствие индексов - ищу зависимости, подбираю более быстрые варианты. Подметил плавное, но постоянно падение скорости вставки этих 2 ГБ от объема получаемой базы: от 7 МБ/с в начале до 300 кБ/с к концу. Зато, скорость выборки по индексу меня поразила: в условиях одной машины, одних и тех же данных и аналогичного индекса SQLite отработала вдвое быстрее, чем MySQL+Innodb. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2011, 00:32 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
Еще подмеченный аспект: при страницах 4 кБ одни и те же данные занимают на 9% места меньше, чем при страницах 1 кБ. Может мелочь, но мне интересно. MBGЕсли есть конкретные проблемы/вопросы - озвучьте их. В данный момент у меня конкретики нет. Изучаю пока. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2011, 00:38 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXL, См. параметры моей сборки, например. Страница, скажем, 8к разумнее для "типичных" применений и т.д. Тесты и заметки есть у меня в блоге http://geomapx.blogspot.com/search?q=sqlite Патчи и модули см. в моем репозитории http://sqlite.mobigroup.ru/ Ну и плюс еще море всего в сети найдется, и в рассылке sqlite-users немало интересного проскакивает. Оптимизация же БД зависит от очень многих вещей - например, чтобы быстро работать с базой в десятки и сотни гиг, придется архитектуру приложения соответствующую делать, если же у вас пара гигабайт - вероятно, достаточно выставить разумные прагмы (дисковая страница, кэш, версия формата БД) и, при необходимости конкурентности, включить режим WAL. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2011, 17:06 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
MBG, Спасибо. Тему я уже читал. Пойду дальше по ссылкам. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2011, 18:56 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
На тему выбора размера дисковой страницы интересно посмотреть "Internal Versus External BLOBs in SQLite": http://www.sqlite.org/intern-v-extern-blob.html Учтите, что для других сценариев использования результаты несколько отличаются (как правило, выбор все равно стоит между страницами 4к/8к/16к). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2011, 08:00 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
MBG, Я написал тест массовой вставки: данные находятся в MySQL+MyISAM (2 ГБ, 8 млн строк) и через perl-скрипт перегоняются в SQLite. В таблице есть целые столбцы, и небольшие текстовые (менее 1 кБ). Прогоняю по разным режимам журнала с разными страницами. Памяти на машине (1.5 ГБ) явно не достаточно для кеширования данных. Т.ч. каждый прогон работает в одинаковых условиях с одним и тем же патерном. Пока итоги рано подводить, но есть некоторая закономерность: 1. Выключение журнала резко снижает производительность и использовать его можно только с отключенной синхронизацией или с базой в памяти. Данный тест я повторю еще раз для чистоты, т.к. результат не соответствует ожиданию. 2. Для режимов без журнала или с журналом MEMORY оптимальнее страницы 4 кБ. 3. Для журнала на диске страницы 4 кБ и 8 кБ близки, но 8 кБ немного быстрее. 4. Прочие страницы дают потерю производительности. Причем, 16 кБ - хуже, чем 1 кБ. На BLOB не проверял - такой тест тоже надо будет сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2011, 10:45 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
Есть, кстати, у меня оракловая база с картинками: размер 9 ГБ, около 100 тыс. строк. Если не надоест, сделаю тесты и для BLOB-ов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2011, 12:02 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXLЕсть, кстати, у меня оракловая база с картинками: размер 9 ГБ, около 100 тыс. строк. Если не надоест, сделаю тесты и для BLOB-ов. Если уж тестировать, то при размере базы, более чем в 10 раз превышающем объем ОЗУ. Я тестировал на 100М записей по 1к и 100к записей по 1М - то есть в обоих случаях размер базы 100Гб+, данные генерировались случайным образом. Для задач чтения и записи - оптимальны разные дисковые страницы, разумный компромисс был равен 8к. Вставка миллиарда записей только с PK не дает измеримой деградации скорости, с обычным индексом - зависит от данных, часто есть неприемлемая для больших баз деградация скорости вставки (с выборками все ок), с FTS индексом - нет деградации вставки, но на 435М записей вылетал сегфолт (думаю, что баг я тогда нашел и сейчас все будет ок, но этот тест я не повторял). На десктопном железе - до 50М особых проблем нет, если воткнете SSD (кардинально уменьшает время модификации индексов при вставке) - то и сотни миллионов записей обработаете. С год назад я репортил баг, возникающий при некоторых условиях для баз более 5Гб размером (сейчас соответствующий тест есть в апстриме), так что сильно старые версии SQLite для таких баз не стоит брать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2011, 22:18 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
MBG, Как раз такие тесты и провожу сейчас: 10 ГБ исходных данных (база может быть вдвое больше) и 1.5 ГБ оперативки. Вероятно, тесты у меня протянутся до конца недели. После напишу отчет. Уже есть интересные особенности выделения страниц под данные в районе page_size/2. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2011, 11:59 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
Про индексы оно понятно: чем их больше и чем они длиннее, тем медленнее обрабатываются. Ну и размер кеша на индексы сильно влияет. Т.к. универсальных тестов не бывает, то для чистоты эксперимента я не использую индексы. Известно же, что много-много быстрее удалить индексы, залить данные и после создать индексы заново. В обычных же ситуациях столь большие объемы вставок маловероятны (либо для них был выбран не подходящий инструмент). Думаю, что самый-самый быстрый способ вставки будет через временные таблицы в памяти: вставить в таблицу по N строк и скопом перенести их в базу на диске через "INSERT SELECT". Такое я еще не тестировал. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2011, 12:07 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXL, Я использую версию 3.7.0.1. К сожалению, в CentOS 5 нет более свежей. Собирать сам не хочу - это нарушает принцип обновления из репозитория и потом может выйти боком. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2011, 12:12 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXLИзвестно же, что много-много быстрее удалить индексы, залить данные и после создать индексы заново. Не везде и не всегда! В эскулайт такая оптимизация сделана только в последнем релизе, см. http://www.sqlite.org/draft/releaselog/3_7_8.html Если тестировать эскулайт именно как бэкенд хранения - до миллиарда записей все хорошо :) Деградация скорости вставки возникает только из-за индексов и может быть заметна уже на десятке миллионов записей. Чувствуете разницу? Так что без индексов тестировать смысла мало. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2011, 17:07 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
MBG, Кстати, на счет поиска по индексам. Как я прочитал в доках, уровень дерева у SQLite фиксированный: root page -> internal pages (interior pages) -> leafs. Появляются overflow страницы (цепочки страниц на одном уровне), но сам уровень косвенности не растет. Т.е. при больших количествах строк (от 10^6) не должно быть большой разницы в скорости поиска между смежными порядками. Особенно если индекс организованный. Хорошо бы придумать тест для проверки. У вас нет идей на этот счет? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2011, 17:29 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXLMBG, Кстати, на счет поиска по индексам. Как я прочитал в доках, уровень дерева у SQLite фиксированный: root page -> internal pages (interior pages) -> leafs. Появляются overflow страницы (цепочки страниц на одном уровне), но сам уровень косвенности не растет. Т.е. при больших количествах строк (от 10^6) не должно быть большой разницы в скорости поиска между смежными порядками. Особенно если индекс организованный. Хорошо бы придумать тест для проверки. У вас нет идей на этот счет? А чем не устраивают тесты, выложенные в моем блоге? Вот тестирование скорости индексной выборки на таблицах 1М, 10М, 100М записей: Тестирование SQLite 3.6.17-mobigroup.2 на больших таблицах А вот другая сторона проблемы - скорость вставки: Degradation of indexing speed in SQLite 3.6.20 Как видим, индексирование большой таблицы могло быть проблемой до выхода последнего релиза. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2011, 22:14 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
MBG, Читается плохо и там показаны только значения user и system, но не полное время, куда входит ожидание IO. Вот вам пример: Код: plaintext 1. 2. 3. 4. 5.
Хотя прошло две секунды, user - 0 и system - 1 мс. При ожидании процесс не использует процессорное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2011, 21:33 |
|
Оптимизация по скорости под большие объемы.
|
|||
---|---|---|---|
#18+
RXLMBG, Читается плохо и там показаны только значения user и system, но не полное время, куда входит ожидание IO. ... В данном случае не используется ни IO ни CPU, и здесь вовсе нет "ожидание IO". Замерять время простоя - бессмысленно, но, если хотите, никто не мешает делать Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2011, 23:13 |
|
|
start [/forum/topic.php?fid=54&msg=37493307&tid=2009107]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
88ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 209ms |
0 / 0 |