RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

Внутренние BLOB против внешних в SQLite

Если у вас есть база данных больших BLOB, вы получаете лучшую производительность чтения, когда вы храните полное содержание BLOB непосредственно в базе данных, или быстрее сохранить каждый BLOB в отдельном файле и сохранить просто соответствующее имя файла в базе данных?

Чтобы попытаться ответить на это, мы управляли 49 тестовыми сценариями с различными размерами BLOB и размерами страницы SQLite на рабочей станции Linux (Ubuntu приблизительно 2011 с файловой системой Ext4 на быстром диске SATA). Для каждого тестового сценария база данных была создана содержащей 100 МБ содержания BLOB. Размеры BLOB колебались от 10 КБ до 1 МБ. Количество BLOB изменилось, чтобы держать полное содержание BLOB на уровне приблизительно 100 МБ. Следовательно, 100 BLOB в 1 МБ размером и 10000 BLOB по 10K размера и т.д. Применялся SQLite version 3.7.8 (2011-09-19).

Update: New measurements for SQLite version 3.19.0 (2017-05-22) show that SQLite is about 35% faster than direct disk I/O for both reads and writes of 10KB blobs.

Матрица ниже показывает, время, чтобы прочитать BLOB, сохраненные в отдельных файлах, разделенное на время, чтобы прочитать BLOB, сохраненные полностью в базе данных. Следовательно, для чисел, больше 1.0, быстрее сохранить BLOB непосредственно в базе данных. Для чисел, меньших 1.0, быстрее сохранить BLOB в отдельных файлах.

В каждом случае размер страничного кэша был приспособлен, чтобы держать сумму кэш-памяти на уровне приблизительно 2 МБ. Например, кэш на 2000 страниц использовался для 1024-байтовых страниц, а кэш на 31 страницу использовался для 65536-байтовых страниц. Значения BLOB были прочитаны в произвольном порядке.

Размер страницы БДРазмер BLOB
10k20k50k100k200k500k1m
10241.5351.020 0.6080.456 0.3300.247 0.233
20482.0041.437 0.8700.636 0.4830.372 0.340
40962.2611.886 1.1730.890 0.7010.526 0.487
81922.2401.866 1.3341.035 0.8300.625 0.720
163842.4391.757 1.2921.023 0.8290.820 0.598
327681.8781.843 1.2960.981 0.9760.675 0.613
655361.2561.255 1.3390.983 0.7690.687 0.609

Мы выводим следующие эмпирические правила из матрицы выше:

  • Размер страницы базы данных 8192 или 16384 дает лучшую работу для большого BLOB I/O.

  • Для BLOB меньше 100KB чтение быстрее, когда BLOB сохранены непосредственно в файле базы данных. Для BLOB больше 100 КБ чтение от отдельного файла быстрее.

Конечно, ваши результаты могут измениться в зависимости от аппаратных средств, файловой системы и операционной системы. Перепроверьте их в расчете на целевые аппаратные средства перед согласием на конкретный дизайн.