Вместо размера больших объектов в процедуру
sp_tableoption можно было передать значение On. В этом случае размер
устанавливается равным 250 байтам. Отключить размещение данных в строке можно, задав в качестве параметра значение 0 или Off. Максимальный размер данных в
строке равен 7000 байт. Следующий рисунок иллюстрирует схему распределения
данных при размере, превышающем 350 байт (для нашей таблицы).
Рисунок 2
Если в строке данных присутствует расширяемое поле
типа varchar или varbinary, то при его расширении, если общий размер строки
превысит 8060 байт, часть данных из строки может быть выгружена на
дополнительные страницы. Другими словами, остальные поля имеют приоритет перед
LOB при нехватке пространства в строке данных. Вернем нашу таблицу в начальное
состояние, так как следующие примеры рассчитаны на режим по умолчанию:
sp_tableoption
blob_test, 'text in row', 'off'
|
После перевода таблицы в режим «данные в строке» сами
данные в строку не переносятся, однако обратное действие вызывает немедленную
операцию по переносу данных на отдельные страницы. При этом вся таблица
полностью блокируется, а при большом количестве переносимых данных операция
может занять длительное время.
Работа с большими данными
В работе с бинарными данными на уровне сервера
большого смысла нет. Поэтому большинство примеров использует текстовые данные, хотя описываемые процедуры вполне сгодятся и для бинарных данных.
При работе с LOB можно использовать обычные операторы
SQL (select, insert). Но иногда может понадобиться работать не с LOB целиком, а
с его частями. Операторы работы с такими небольшими порциями довольно необычны
для SQL тем, что в них используются указатели, смещения и другие низкоуровневые
понятия.
Указатель представляет собой 16-байтовую переменную
типа binary или varbinary. Это абстракция, указывающая на данные в конкретной
колонке конкретной строки. Указатель получается путем вызова функции textptr, куда передается имя колонки. Он может быть равен NULL в том случае, если данных
не существует. Если указатель равен NULL, вы не можете использовать функции
READTEXT, WRITETEXT и UPDATETEXT. Указатель должен содержать какое-либо
значение, поэтому для правильной работы этих функций в колонке изначально
должны содержаться данные. Для простоты мы запишем туда следующие значения:
insert
into blob_test values(0x0,'My wife is Rosa','My son is Dima')
|
Значения для колонки типа image должны указываться в
шестнадцатеричном формате, а для типов text и ntext это должны быть строки.
Для всех операторов DML, изменяющих данные, предыдущее
значение всей строки сбрасывается в лог транзакций, однако для операторов
WRITETEXT и UPDATETEXT это зависит от модели восстановления базы данных. Для
модели Bulk logged данные не записываются в лог транзакций, вместо этого
измененные страницы помечаются особым образом и записываются в архив лога
транзакций при вызове соответствующей операции архивирования.
READTEXT
Этот оператор предназначен для блочного чтения больших
текстовых и бинарных данных:
READTEXT
{ table.column text_ptr offset size } [ HOLDLOCK ]
|
Параметры:
table.column – таблица и колонка;
text_ptr – указатель, полученный с помощью функции
textptr;
offset – смещение, с которого начинается чтение
данных;
size – размер считываемых данных.
Пример: