> Контексты точно есть, юнионов вроде 1-2 и всё,
> а что под агрегатами подразумевается ?
MAX, SUM etc
SELECT COUNT(*), MAX() FROM TABLE
потребляет 2 контекста - для таблицы и для 1-го уровня
аггрегирования
Update, кстати, потребляет 2 контекста
Краткие заметки по ит-шным темам, с которыми я сталкиваюсь. Чаще это вопросы работы с СУБД и прикладной разработки.
четверг, 26 октября 2006 г.
понедельник, 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 в котором часть вышенаписанного уже есть
плюс кое-что ещё :)
> вспомишь чего...
Я не кореец, аднака, собак не ем :)
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. По числу
занятых слотов на них определяется кол-во страниц данных. По этой цифре
оценивается число записей.
> пересчитывается кол-во страниц!?
Для каждой участвующей таблицы сканируются ее 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-ый знак не гарантируется.
Т.е. он может быть показан не для всех чисел
--
Хорсун Влад
> ответил 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". Но счетчик
использования держит каждый препарированный запрос, в котором используется
процедура, плюс каждая аналогичная транзакция.
--
Дмитрий Еманов
FB2 больше не допускает альтер/дроп процедур "in use". Но счетчик
использования держит каждый препарированный запрос, в котором используется
процедура, плюс каждая аналогичная транзакция.
--
Дмитрий Еманов
Кажется из epi
- двойная бухгалтерская запись - это замечательная (!) бухгалтерская
выдумкка такой регистрации (как камера Вильсона) событий и фактов,
которая, в частности, позволяет (постоянно) убеждаться в
справедливости обобщенного закона Ломоносова-Лавуазье:
"Сумма везде всего всегда равняется всему"*
___
*Просьба не путать с основным законом социализьма:
"Всего на всех не хватит, патамучта всех много, а всего мало."
выдумкка такой регистрации (как камера Вильсона) событий и фактов,
которая, в частности, позволяет (постоянно) убеждаться в
справедливости обобщенного закона Ломоносова-Лавуазье:
"Сумма везде всего всегда равняется всему"*
___
*Просьба не путать с основным законом социализьма:
"Всего на всех не хватит, патамучта всех много, а всего мало."
Подписаться на:
Сообщения (Atom)