понедельник, 21 августа 2006 г.

Оптимизация IBX для медленных линий

> Ты вроде как в свое время на медленных линиях собаку съел... :) Может
> вспомишь чего...

Я не кореец, аднака, собак не ем :)

Terminal Server попроще будет, потому его и посоветовал сходу :)
Ну, раз не хочешь попроще - лови посложнее :)

Самое простое, что можно сделать с IBX, по-памяти

а) убрать никому не нужный isc_dsql_set_cursor_name

б) сделать хендлы запросов повторно используемыми, т.е.
не вызывать isc_dsql_free_statement(..., DSQL_drop), а засовывать хендл
за щёку. Вынимать из-за щеки когда оно зовёт isc_dsql_allocate_statement.

в) в TIBSQL.GetRowsAffected сделать буфер правильного р-ра (32 байта),
а не 1048 (откуда он взял это число ???). Или ваще похерить этот
вызов, если конечно можешь без него обойтись.

г) в TIBSQL.Prepare заменить

if FSQLType in [SQLSelect, SQLSelectForUpdate,
SQLExecProcedure] then
begin
{ Allocate an initial output descriptor (with one column) }
- FSQLRecord.Count := 1;
+ if FSQLRecord.FSize = 0
+ then FSQLRecord.Count := 1; // тут можно любое число > 0
{ Using isc_dsql_describe, get the right size for the columns... }
Call(FGDSLibrary.isc_dsql_describe(StatusVector, @FHandle,
Database.SQLDialect, FSQLRecord.FXSQLDA), True);
if FSQLRecord.FXSQLDA^.sqld > FSQLRecord.FXSQLDA^.sqln then
begin
- FSQLRecord.Count := FSQLRecord.FXSQLDA^.sqld;
Call(FGDSLibrary.isc_dsql_describe(StatusVector, @FHandle,
Database.SQLDialect, FSQLRecord.FXSQLDA), True);
end
- else
- if FSQLRecord.FXSQLDA^.sqld = 0 then
- FSQLRecord.Count := 0;
+ FSQLRecord.Count := FSQLRecord.FXSQLDA^.sqld;

Это я сам не пробовал, но должно работать.
Суть - не вызывать isc_dsql_describe второй раз, если у нас
и так хватает дескрипторов (XSQLDA) для резалтсета

д) Выключить trace флаги у TIBDatabase и\или выключить запрос плана в
TIBSQLMonitorHook.SQLPrepare

--
Хорсун Влад

PS Можно так же пользовать FB 2.1 в котором часть вышенаписанного уже есть
плюс кое-что ещё :)