Если у вас есть база данных больших 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 | ||||||
---|---|---|---|---|---|---|---|
10k | 20k | 50k | 100k | 200k | 500k | 1m | |
1024 | 1.535 | 1.020 | 0.608 | 0.456 | 0.330 | 0.247 | 0.233 |
2048 | 2.004 | 1.437 | 0.870 | 0.636 | 0.483 | 0.372 | 0.340 |
4096 | 2.261 | 1.886 | 1.173 | 0.890 | 0.701 | 0.526 | 0.487 |
8192 | 2.240 | 1.866 | 1.334 | 1.035 | 0.830 | 0.625 | 0.720 |
16384 | 2.439 | 1.757 | 1.292 | 1.023 | 0.829 | 0.820 | 0.598 |
32768 | 1.878 | 1.843 | 1.296 | 0.981 | 0.976 | 0.675 | 0.613 |
65536 | 1.256 | 1.255 | 1.339 | 0.983 | 0.769 | 0.687 | 0.609 |
Мы выводим следующие эмпирические правила из матрицы выше:
Размер страницы базы данных 8192 или 16384 дает лучшую работу для большого BLOB I/O.
Для BLOB меньше 100KB чтение быстрее, когда BLOB сохранены непосредственно в файле базы данных. Для BLOB больше 100 КБ чтение от отдельного файла быстрее.
Конечно, ваши результаты могут измениться в зависимости от аппаратных средств, файловой системы и операционной системы. Перепроверьте их в расчете на целевые аппаратные средства перед согласием на конкретный дизайн.