Spec-Zone.ru › SQLite

Внутренние и внешние 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-объектов читались в случайном порядке.

cellpadding="5" cellspacing="0">
Размер страницы базы данных Размер 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API