Внутренние и внешние 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-объектов для размера 10 КБ и так далее.) Использулась версия SQLite 3.7.8 (2011-09-19).
Обновление: Новые измерения для версии SQLite 3.19.0 (2017-05-22) показывают, что SQLite примерно на 35% быстрее, чем прямые операции ввода-вывода с диском для чтения и записи BLOB-объектов размером 10 КБ.
Нижеприведенная матрица показывает время, необходимое для чтения BLOB-объектов, хранящихся в отдельных файлах, по отношению к времени, необходимому для чтения BLOB-объектов, хранящихся полностью в базе данных. Следовательно, для чисел больше 1,0 быстрее хранить BLOB-объекты непосредственно в базе данных. Для чисел меньше 1,0 быстрее хранить BLOB-объекты в отдельных файлах.
Во всех случаях размер кеша страниц настраивался, чтобы поддерживать объем памяти кеша примерно в 2 МБ. Например, использовался кеш из 2000 страниц для страниц размером 1024 байта и кеш из 31 страницы для страниц размером 65536 байт. Значения BLOB-объектов читались в случайном порядке.
| Размер страницы базы данных | Размер BLOB-объекта | ||||||
|---|---|---|---|---|---|---|---|
| 10к | 20к | 50к | 100к | 200к | 500к | 1м | |
| 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-объектами.
Для BLOB-объектов размером меньше 100 КБ чтение быстрее, когда BLOB-объекты хранятся непосредственно в файле базы данных. Для BLOB-объектов размером больше 100 КБ чтение из отдельного файла быстрее.
Конечно, ваши результаты могут отличаться в зависимости от аппаратного обеспечения, файловой системы и операционной системы. Перед внедрением конкретного решения убедитесь, что эти показатели соответствуют целевому оборудованию.
SQLite is in the Public Domain.
https://sqlite.org/intern-v-extern-blob.html