Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Alexander
- Сообщения: 3
- Зарегистрирован: 15 фев 2006, 23:25
Сообщение
Alexander » 15 фев 2006, 23:56
При реализации UDF (getvalue), многократно вытаскивающей из BLOB поля какие-то значения, например:
Код: Выделить всё
select getvalue(BLOB_FIELD,'param1') P1, getvalue(BLOB_FIELD,'param2') P2, getvalue(BLOB_FIELD,'param3') P3 from ...
,
в которой сначала производится ресурсоемкий разбор всего поля (парсинг XML), а затем быстрое получение значения, получается неэффективное повторение первоначального разбора поля...
Может ли каким нибудь образом UDF определить, что в качестве параметра в нее передано то же значение BLOB, что и для предыдущего вызова? Тогда в UDF можно было бы не вызывать разбор содержимого многократно. Если нет, то заложено ли что-нибудь подобное в будущих версиях сервера?
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 16 фев 2006, 00:16
Запоминай результат разбора блоба (или нескольких последних блобов) и используй повторно. Т.к. блобы не редактируются, то единственный шанс напороться на новое содержимое блоба - это его удаление, сборка мусора и вставка на его место нового блоба. Дабы избежать этого, можно передавать в UDF вместе с blob_id ещё и transaction_id.
-
Alexander
- Сообщения: 3
- Зарегистрирован: 15 фев 2006, 23:25
Сообщение
Alexander » 16 фев 2006, 00:45
А как получить изнутри UDF или передать в UDF эти blob_id и transaction_id?
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 16 фев 2006, 00:53
У - как всё запущено ...
blob_id ты и так передаёшь. Для transaction_id заведи ещё один пар-р
-
Alexander
- Сообщения: 3
- Зарегистрирован: 15 фев 2006, 23:25
Сообщение
Alexander » 16 фев 2006, 09:08
Дык, поскольку всё так запущено и обращаюсь...
Я передаю BLOB в UDF в виде var ABlob:TBlob, как оттуда получить blob_id?
C transaction_id все понятно.
Код: Выделить всё
TBlob = record
GetSegment: function(Handle: Pointer; Buffer: PChar;
MaxLength: Long; var ReadLength: Long): WordBool; cdecl;
Handle: Pointer; // BLOb handle
SegCount, // Number of BLOb segments
MaxSegLength, // Max length of BLOb segment
TotalLength: Long; // Total BLOb length
PutSegment: procedure(Handle: Pointer; Buffer: PChar;
Length: Long); cdecl;
// Seek : function : Long; cdecl; // I don'n know input parameters
end;
procedure INIV_GetValue(var ABlob: TBlob; Param: PChar; v:PDSC); cdecl;