Вызов isc_dsql_sql_info() вызывает временное переполнение каталога
Существует SQL-запрос, соединяющий временную таблицу с представлением (объединяющий две таблицы):
select main.*
from tmp_table_srt sub -- temporary table
inner join vw_s_ad_conjunct main -- joining tables M_S_AD_CONJUNCTION and M_S_AD
on sub.I_SRTREF = 94646 and
sub.O_ID = main.ID
where ASCJTREF = 1678744 and
SOURCEADSREF = 1193467 and
isnodummy(ID) = 1
У него есть план запроса, который выглядит хорошо для меня:
PLAN JOIN (SUB INDEX (UNQ_TMP_TABLE_SRT), MAIN ADS INDEX (PK_M_S_AD), MAIN ADSCJT INDEX (FK_M_S_AD_CONJUNCTION_SUBADS))
В моей базе данных IDE, которая называется IBExpert, этот запрос выполняется достаточно быстро (менее секунды). Но в клиентском приложении это происходит: когда запрос выполняется, временный каталог сервера полностью заполняется. До этого было около 23 ГБ свободного места. Как только свободного места не осталось, приложение вылетает.
Сначала я думал, что запрос вызывает это. Но затем я проверил, что он работает быстро (без переполнения временного каталога) при выполнении через IDE моей базы данных и использует план запросов с хорошими показателями. Кроме того, я понял, что это происходит не тогда, когда запрос открыт, а когда вызов API isc_dsql_sql_info()
сделан FIBPlus
Компонент базы данных после того, как запрос был открыт (для получения псевдонимов - я предполагаю).
Параметр запроса функций заполняется так:
InfoRequest[0]:= AnsiChar(isc_info_sql_select); // 4
InfoRequest[1]:= AnsiChar(isc_info_sql_describe_vars); // 7
InfoRequest[2]:= AnsiChar(isc_info_sql_sqlda_seq); // 9
InfoRequest[3]:= AnsiChar(frb_info_sql_relation_alias); // 25
InfoRequest[4]:= AnsiChar(isc_info_sql_describe_end); // 8
Что-то в этом вызове API приводит к тому, что Firebird требуется огромное количество временного пространства. К сожалению, я почти ничего не нашел об этой функции (кроме этого руководства по Interbase API, которое ничего не говорит мне о значениях запроса).
Возможно, здесь есть несколько экспертов по Firebird или Interbase, которые могут помочь мне выяснить причину этой проблемы. Я использую Firebird (классический сервер) 2.5.5.26952 и fbclient.dll 2.5.5.26952
1 ответ
[эти] клиентские вызовы API не могут привести к временному распределению на сервере. Firebird выделяет временное пространство в нескольких известных случаях: - создание индекса (не ваш случай) - сортировка результата запроса (не ваш случай, так как в PLAN нет слова SORT) - использование функции LIST (кажется, не ваш случай) - ...
Поэтому, возможно, ваше приложение дополнительно выполняет какой-то другой запрос, который приводит к огромной сортировке или временному использованию. Или вы дали нам неправильный запрос:-) Кстати, каковы имена файлов (и их размер), который выделяет ваш темп? Можете ли вы включить мониторинг (используя FIBPlus), чтобы проверить, что идет на сервер с этим запросом?