BlobTempSpace: ускорение операций с BLOB в HQbird
HQbird может кэшировать BLOB во временном пространстве, чтобы ускорить операции с BLOB (на 15%–200% быстрее, чем в стандартном Firebird), и предотвратить рост файла базы данных в случае ошибочных операций с BLOB.
HQbird использует дополнительный параметр firebird.conf BlobTempSpace для управления этой
функцией. Опция кэширования может быть:
0— отключена,1— включена для PSQL (по умолчанию),2— включена для всех операций с BLOB.
Результат вкратце
В приведённом ниже тесте одна и та же нагрузка выполнялась примерно в 12 раз быстрее при
включённом BlobTempSpace:
| Временное хранилище | BlobTempSpace выкл. | BlobTempSpace вкл. | Ускорение |
|---|---|---|---|
| RAM-диск (48 ГБ) | 108,2 с | 9,0 с | 12,0× |
| SSD (Samsung 870 QVO, 1 ТБ) | 106,0 с | 9,1 с | 11,7× |
Общее время = EXECUTE BLOCK + COMMIT, среднее по двум запускам.
Куда уходит время
Выигрыш достигается за счёт двух мест:
- EXECUTE BLOCK быстрее в 2,3–2,4 раза. Конкатенация BLOB выполняется во временном пространстве, а не в страницах базы данных.
- COMMIT почти мгновенный. Без кэша коммит записывает около 1,1 млн страниц в базу данных (81–88 с). С кэшем он записывает 3 021 страницу (15–16 мс).
| Временное хранилище | BlobTempSpace | EXECUTE BLOCK | COMMIT | Записи страниц (block + commit) |
|---|---|---|---|---|
| RAM-диск | выкл. | 20,9 с | 87,4 с | 1 117 485 |
| RAM-диск | вкл. | 9,0 с | 0,015 с | 3 057 |
| SSD | выкл. | 21,8 с | 84,2 с | 1 117 485 |
| SSD | вкл. | 9,1 с | 0,016 с | 3 057 |
При включённом BlobTempSpace база данных получает примерно в 365 раз меньше
записей страниц. Чтения (fetches) и отметки (marks) остаются почти такими же (5,15 млн чтений,
3,45 млн отметок), то есть база данных выполняет ту же логическую работу; исчезают только
физические записи.
Настройка теста
- Нагрузка: один
EXECUTE BLOCK, который строит BLOB путём конкатенации (750 строк), затемCOMMIT. Каждый случай выполнялся дважды (run-1, run-2). - Временное хранилище (
FIREBIRD_TMP):- RAM-диск: WinRamTech x64 (бывш. Qsoft), 48 ГБ.
- SSD: Samsung 870 QVO, 1 ТБ, с
TempCacheLimit = 48G(RAM-диск отключён).
- Измерение: статистика трассировки Firebird (затраченное время, чтения, записи, чтения (fetches), отметки (marks)).
- При выключенном
BlobTempSpaceитоговый размер базы данных составил 8 839 МБ.
Сырые результаты
| Временное хранилище | BlobTempSpace | Запуск | Действие | Затрачено, мс | Записи | Чтения | Отметки |
|---|---|---|---|---|---|---|---|
| RAM-диск | выкл. | 1 | EXECUTE BLOCK | 20 104 | 1 127 | 5 154 541 | 3 450 817 |
| RAM-диск | выкл. | 1 | COMMIT | 87 531 | 1 116 358 | 1 | 1 |
| RAM-диск | выкл. | 2 | EXECUTE BLOCK | 21 621 | 1 127 | 5 154 541 | 3 450 817 |
| RAM-диск | выкл. | 2 | COMMIT | 87 229 | 1 116 358 | 1 | 1 |
| RAM-диск | вкл. | 1 | EXECUTE BLOCK | 9 039 | 36 | 5 153 997 | 3 450 273 |
| RAM-диск | вкл. | 1 | COMMIT | 15 | 3 021 | 1 | 1 |
| RAM-диск | вкл. | 2 | EXECUTE BLOCK | 8 976 | 36 | 5 153 997 | 3 450 273 |
| RAM-диск | вкл. | 2 | COMMIT | 15 | 3 021 | 1 | 1 |
| SSD | выкл. | 1 | EXECUTE BLOCK | 21 831 | 1 127 | 5 154 541 | 3 450 817 |
| SSD | выкл. | 1 | COMMIT | 86 726 | 1 116 358 | 1 | 1 |
| SSD | выкл. | 2 | EXECUTE BLOCK | 21 834 | 1 127 | 5 154 541 | 3 450 817 |
| SSD | выкл. | 2 | COMMIT | 81 614 | 1 116 358 | 1 | 1 |
| SSD | вкл. | 1 | EXECUTE BLOCK | 9 084 | 36 | 5 153 997 | 3 450 273 |
| SSD | вкл. | 1 | COMMIT | 16 | 3 021 | 1 | 1 |
| SSD | вкл. | 2 | EXECUTE BLOCK | 9 074 | 36 | 5 153 997 | 3 450 273 |
| SSD | вкл. | 2 | COMMIT | 16 | 3 021 | 1 | 1 |
Чтения во всех запусках были равны 0.
Примечания
- RAM-диск и SSD дают почти одинаковый результат. Тип временного хранилища не является узким местом для этой нагрузки: выигрыш даёт сам кэш.
- Ускорение зависит от нагрузки. Тяжёлая конкатенация BLOB в PSQL, как в этом тесте, выигрывает больше всего. Типичные операции с BLOB выигрывают на 15%–200%.