четверг, 26 октября 2006 г.

Как считается кол-во контекстов

> Контексты точно есть, юнионов вроде 1-2 и всё,
> а что под агрегатами подразумевается ?

MAX, SUM etc

SELECT COUNT(*), MAX() FROM TABLE

потребляет 2 контекста - для таблицы и для 1-го уровня
аггрегирования

Update, кстати, потребляет 2 контекста

понедельник, 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 в котором часть вышенаписанного уже есть
плюс кое-что ещё :)

вторник, 25 июля 2006 г.

Как оказалось при подготовке(prepare) запроса в IB/FB...

> Вот это для меня новость - т.е. при каждой препарации запроса
> пересчитывается кол-во страниц!?

Для каждой участвующей таблицы сканируются ее pointer pages. По числу
занятых слотов на них определяется кол-во страниц данных. По этой цифре
оценивается число записей.

суббота, 22 июля 2006 г.

Модификация метаданных "по живому"

> Я отвечал по факту, а не по намерению. Т.е. если альтеруемый объект не
> заюзан на момент альтера, то это безопасно.

Создание и удаление таблиц во время интенсивных вставок в другие таблицы
часто приводит к повреждениям - в основном конфликтам между системными
страницами и страницами данных. Конечно, в основном на классике, но и на
супере тоже наблюдал не раз.

С уважением,
Алексей Ковязин

Из вопросов теста: "точность типа double precision"

> укажите точность типа double precision (максимальное число знаков)
> ответил 17, а в качестве правильного ответа указано 15
> зашел в IBE, проверил:
> select cast(CAST(1123 as DOUBLE PRECISION)/1233451 as varchar(100)) from
RDB$DATABASE
> 0.0009104536783382559
> 16 знаков-то, как ни крути :)

16-ый знак не гарантируется.
Т.е. он может быть показан не для всех чисел

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

FB2 больше не допускает альтер/дроп процедур "in use"

> (Для FB1 все работает как часы.)

FB2 больше не допускает альтер/дроп процедур "in use". Но счетчик
использования держит каждый препарированный запрос, в котором используется
процедура, плюс каждая аналогичная транзакция.

--
Дмитрий Еманов

Кажется из epi

- двойная бухгалтерская запись - это замечательная (!) бухгалтерская
выдумкка такой регистрации (как камера Вильсона) событий и фактов,
которая, в частности, позволяет (постоянно) убеждаться в
справедливости обобщенного закона Ломоносова-Лавуазье:
"Сумма везде всего всегда равняется всему"*
___
*Просьба не путать с основным законом социализьма:
"Всего на всех не хватит, патамучта всех много, а всего мало."