调用 isc_dsql_sql_info() 导致临时目录溢出

Call to isc_dsql_sql_info() causes temporary directory overflow

有一个 SQL 查询将临时 table 加入一个视图(加入两个 table):

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 GB 的可用空间 space。一旦没有空闲 space,应用程序就会崩溃。

起初,我认为是查询导致的。但后来我检查了一下,当通过我的数据库 IDE 执行并使用具有良好索引的查询计划时,它运行速度很快(不会溢出临时目录)。此外,我认识到这不是在打开查询时发生的,而是在打开查询后 FIBPlus 数据库组件对 isc_dsql_sql_info() 进行 API 调用时发生的(为了获得别名 -我想)。

函数请求参数填写:

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 需要大量临时 space。不幸的是,我几乎没有发现任何关于这个函数的信息(除了这个 Interbase API guide,它没有告诉我任何关于请求值的信息)。

也许这里有一些Firebird或Interbase专家可以帮助我找出导致此问题的原因。我使用 Firebird(经典服务器)2.5.5.26952fbclient.dll 2.5.5.26952

[这些] 客户端 API 调用无法在服务器上进行临时分配。 Firebird 在几种已知情况下分配 temp space: - 创建索引(不是你的情况) - 排序查询结果(不是你的情况,因为 PLAN 中没有 SORT 词) - 使用函数 LIST(似乎不是你的情况) - ...

因此,也许您的应用程序还执行其他查询,这会导致大量排序或临时使用。或者,您给了我们错误的查询:-) 顺便说一句,分配临时文件的文件名(及其大小)是什么? 您可以打开监控(使用 FIBPlus)来检查通过此查询发送到服务器的内容吗?