Сегменты BLOB
Сегменты BLOB
Данные BLOB хранятся в различных форматах в обычном столбце данных и вне столбца. Они хранятся в виде сегментов на одной или более страницах базы данных. Сегменты являются дискретными фрагментами неформатированных данных, которые обычно создаются приложением в виде потока и передаются функциям API для пакетирования и передачи по сети по одному блоку за раз непрерывно.
В структуре записи ссылка на данные BLOB осуществляется с помощью идентификатора BLOB (BLOB_ID). BLOB_ID является уникальной шестнадцатеричной парой, которая обеспечивает перекрестные ссылки между данными BLOB и содержащей их таблицей. При поступлении на сервер сегменты сохраняются в базе в том же порядке, как они были получены, хотя не обязательно с теми же размерами фрагментов, с которыми они передавались.
Когда это возможно, BLOB сохраняются на той же странице, что и запись с остальными данными. При этом большие BLOB могут занимать много страниц, а их начальные страницы могут содержать не данные, а массив указателей на страницы с содержимым BLOB.
Примеры синтаксиса
Следующий оператор определяет два столбца BLOB: BLOB1 подтипа 0 (по умолчанию) и BLOB2 подтипа 1 (TEXT, с набором символов по умолчанию):
CREATE TABLE TABLE2
(BLOB1 BLOB, /* SUB_TYPE 0 */
BLOB2 BLOB SUB_TYPE 1);
Следующий оператор определяет домен, являющийся текстовым BLOB для хранения текстов в наборе символов ISO8859_1:
CREATE DOMAIN MEMO
BLOB SUB_TYPE TEXT /*BLOB SUB_TYPE 1 */
CHARACTER SET ISO8859_1;
Фрагмент кода SQL показывает, как объявляется локальная переменная BLOB в модуле PSQL:
CREATE PROCEDURE ...
. . .
DECLARE VARIABLE AMEMO BLOB SUB_TYPE 1;
Размер сегмента
Когда в таблице определяется столбец BLOB, определение может включать ожидаемые размеры сегментов, которые будут записываться в столбец. Значение по умолчанию - 80 байт - совершенно случайное. Говорят, что такой размер был выбран, потому что это в точности длина строки текстового дисплея!
Установка размера сегмента не влияет на производительность при обработке BLOB на сервере Firebird: сервер совсем его не использует. Для приложений DSQL - которые пишет большинство людей - вы можете просто игнорировать его или, если это важно, установите его в некоторое значение, подходящее буферу, в котором ваше приложение сохраняет данные BLOB.
Для операций DML, выполняемых через API - SELECT, INSERT и UPDATE - длина сегмента указывается явно и может быть любого размера вплоть до максимума в 32 767 байт. Повторно используемые классы, драйверы и компоненты для таких сред разработки, как Delphi, C++ и Java, обычно сами заботятся о сегментации BLOB в их внутренних функциях и процедурах (например, в IBX и FIBPlus размер сегмента для чтения и записи BLOB равен 16 Кбайт и может быть изменен только глобально).
Встроенные приложения
В базах данных, используемых во встроенных приложениях, - здесь мы говорим о приложениях ESQL, написанных для обработки препроцессором gpre, - размер сегмента должен быть объявлен для указания максимального количества байтов, которое приложение собирается записать в любой сегмент столбца. Обычно приложение ESQL не должно ожидать записи сегмента, большего, чем указанная длина сегмента, определенная в таблице; получение такого сегмента переполняет внутренний буфер сегмента и разрушает память. Полезнее указывать относительно большой сегмент для уменьшения количества вызовов при поиске данных BLOB.
Следующий оператор создает два столбца BLOB: BLOBI С размером сегмента по умолчанию 80 и BLOB2 с заданным размером сегмента 1024:
CREATE.TABLE TABLE2 (BLOBI BLOB SUB_TYPE 0,
BLOB2 BLOB SEGMENT SUB_TYPE TEXT SEGMENT SIZE 1024);
В следующем фрагменте кода ESQL приложение вставляет сегмент BLOB. Длина сегмента указана в переменной включающего языка segment_iength:
INSERT CURSOR BCINS VALUES (:write_segment_buffer :segment_length);
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Сегменты памяти
Сегменты памяти Каждый объект состоит из одного или нескольких не перекрывающихся сегментов. При создании сегмента должны быть заданы несколько характеристик. Одна из них — начальный размер. На основании начального размера компонент управления дисками выделяет
Сегменты группы доступа
Сегменты группы доступа Ранее мы говорили, что сегменты создаются либо как постоянные, либо как временные. Временный сегмент может быть также создан как часть группы доступа. На этих группах доступа мы остановимся немного подробней.Назначение группы доступа — повышение
Сегменты
Сегменты Семейство процессоров Intel позволяет разделить память на несколько логических частей, называемых сегментами. При этом адресное пространство процесса может быть представлено в виде нескольких логических сегментов, каждый из которых состоит из непрерывной
10.2.2 Сегменты
10.2.2 Сегменты TCP может преобразовывать выходящий из приложения поток данных в форму, пригодную для размещения в датаграммах. Каким образом?Приложение передает данные в TCP, а этот протокол помещает их в выходной буфер (send buffer). Далее TCP вырезает куски данных из буфера и
Тип данных BLOB
Тип данных BLOB Тип данных BLOB предназначен для хранения большого количества данных переменного размера. Тип BLOB позволяет хранить данные, которые не могут быть помещены в поля других типов, - например, картинки, музыкальные файлы, видеофрагменты и т. д.Чтобы определить самое
Фильтры BLOB
Фильтры BLOB В главе 12 мы коснулись специального типа внешних функций, которые могут быть использованы в Firebird для преобразования данных BLOB между двумя форматами, способными представлять совместимые данные. Фильтры BLOB являются определенными пользователем служебными
Функции BLOB[159]
Функции BLOB[159] FBUDF STRING2BLOB(VALUE) Linux, Win32 Принимает поле строки (столбец, переменную, выражение) и возвращает текст BLOB Аргументы VALUE: столбец или выражение, результатом вычисления которого является значение типа VARCHAR 300 символов или меньше Возвращаемое значение Текст