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

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


Ну зато пиво наверняка пьешь. Так что с меня причитается при певой же возможности... :)))


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


Вспомнилось:
Эй Вася, лови молоток... Чего молчишь-то? Не поймал чтоли? :)

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

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

Ну не нужен и фиг с им. Выкину. Ломать - не строить.


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

Ок. Это чуть посложнее, но вполне осуществимо. А на сервере по 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


Ок. Вообщем-то  trace флаги  у меня выключены.

Спасибо. Самому бы это копать и копать... Вообщем точно, с меня пиво.


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


Я так понимаю, что IBX править придется, чтобы добраться до этого "кое-что еще" :) ? Да и вообще,кстати, IBX будет работать с 2.1 без доводки напильником?

PPS эээх, столько "секретов" выдал :)

Я знал, что ты добрый :)))

With b/r. Gleb.

Ответить