Es gibt eine SQL-Abfrage eine temporäre Tabelle mit Blick Verbinden (Verbindung von zwei Tabellen):Call to isc_dsql_sql_info() bewirkt, dass temporäres Verzeichnis Überlauf
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
Es Abfrage-Plan hat, die ich gut aussieht:
PLAN JOIN (SUB INDEX (UNQ_TMP_TABLE_SRT), MAIN ADS INDEX (PK_M_S_AD), MAIN ADSCJT INDEX (FK_M_S_AD_CONJUNCTION_SUBADS))
In meiner Datenbank IDE, die IBExpert ist, wird diese Abfrage schnell genug ausgeführt (weniger als eine Sekunde). Dies geschieht jedoch in der Client-Anwendung: Wenn die Abfrage ausgeführt wird, wird das temporäre Verzeichnis des Servers vollständig ausgeführt. Es sind ca. 23 GB Speicherplatz frei. Sobald kein Speicherplatz mehr frei ist, stürzt die Anwendung ab.
Zuerst dachte ich, dass die Abfrage das verursacht. Aber dann habe ich untersucht, dass es schnell läuft (ohne das temporäre Verzeichnis zu überlaufen), wenn es über meine Datenbank-IDE ausgeführt wird und einen Abfrageplan mit guten Indizes verwendet. Darüber hinaus erkannte ich, dass dies nicht passiert, wenn die Abfrage geöffnet ist, sondern wenn ein API-Aufruf an isc_dsql_sql_info()
von Datenbankkomponente FIBPlus
gemacht wird, nachdem die Abfrage geöffnet wurde (um Aliase zu bekommen - ich nehme an).
Die Funktionen Anforderungsparameter werden mit diesem gefüllt:
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
etwas über diesen API-Aufruf bewirkt, dass Firebird eine riesige Menge an temporärem Speicherplatz benötigen. Leider habe ich fast nichts über diese Funktion gefunden (abgesehen davon Interbase API guide, die mir nichts über die Anfragewerte sagt).
Vielleicht gibt es hier einige Firebird oder Interbase-Experten, die mir helfen können, herauszufinden, was dieses Problem verursacht. Ich benutze Firebird (klassische Server) 2.5.5.26952 und fbclient.dll 2.5.5.26952
Angenommen, dies ist das eigentliche Problem, es klingt wie ein Fehler für mich, da dies nichts anderes tun sollte als das Melden von Informationen aus der Vorbereitung der Anweisung, melden Sie es bitte an http://tracker.firebirdsql.org/browse/CORE –
Ich denke, Sie sollten versuchen, das Problem zu reduzieren. Kannst du mit 'isql' oder nur mit' FIBPlus' reproduzieren? – EMBarbosa
@MarkRotteveel - ein Fehler in der FB - oder in FIB + (was nicht mehr funktioniert)? Ich glaube, es geht um 'Fetch All Records' oder um' Bidirektional cursor'. Ich vermute, er ruft implizit oder explizit (via db-aware controls) Query.RecordCount auf - was das Abrufen des gesamten Datensatzes bis zum Ende ... –