2016-03-30 20 views
1

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

+0

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 –

+0

Ich denke, Sie sollten versuchen, das Problem zu reduzieren. Kannst du mit 'isql' oder nur mit' FIBPlus' reproduzieren? – EMBarbosa

+0

@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 ... –

Antwort

1

[diese] Client-API-Aufrufe können keine temporäre Zuordnung auf dem Server führen. Firebird ordnet Raumtemp in mehreren bekannten Fällen: - Index erstellen (nicht Ihr Fall) - Abfrageergebnis Sortierung (nicht Ihren Falles sinse kein SORT Wort in PLAN ist) - mit der Funktion LIST (scheint nicht Ihr Fall) - ...

Also, vielleicht Ihre Anwendung führt zusätzlich eine andere Abfrage, die große Sortierung oder temporäre Nutzung führt. Oder Sie gaben uns eine falsche Abfrage :-) BTW, was sind die Dateinamen (und ihre Größe), die Ihre Temp? Können Sie die Überwachung aktivieren (mithilfe von FIBPlus), um zu überprüfen, was mit dieser Abfrage an den Server geht?

+0

Der Themen Starter weggelassen viele wichtige Informationen Fragmente, so ist es alles ein Rätselraten . Aber wenn wir es auf den Nennwert beziehen, dann impliziert "wenn es über meine Datenbank-IDE ausgeführt wird und einen Abfrageplan mit guten Indizes verwendet", dass er irgendwie den von seiner anwendungsdefinierten Abfrage verwendeten Plan gelernt hat und diese Abfrage keine Indizes verwendet. Dann, wieder, wenn wir es zum Nennwert nehmen würden .... Er gibt keine Quellen, so ist es durchaus möglich, dass seine Anwendung tatsächlich etwas andere Anfrage verwendet .... –

+0

Auf der anderen Seite, wenn man "frb_info_sql_relation_alias" googlen würde er würde nur einige raubkopierte Quellen von FIB + finalisieren - es gibt einen riesigen Mangel an Firebird Dokumentation hier denke ich .... –

+0

@ Arioch'Das 'frb_info_sql_relation_alias' ist wahrscheinlich eine FIB spezifische alternative Konstante für' isc_info_sql_relation_alias' für Leute, die ein fbclient oder ibase.h von einer älteren Version, die diese Konstante nicht hatte. –