Hallo,
ich habe folgendes Problem:
Ich stelle über WISQL folgende Anfrage an einen Interbase 6.01 Server:
<b><pre>SELECT *
FROM produktion
WHERE (produktionnr IN
(SELECT produktionnr
FROM rus_slots
WHERE ((slot_nr = 100) and (slot_lizenzen > 0)) or ((slot_nr = 200) and ((slot_lizenzen < 1) or (slot_lizenzen IS NULL)))
GROUP BY produktionnr
HAVING (COUNT(produktionnr) = 2)))</pre></b>
Die beiden Tabellen "Produktion" (Master) mit 22000 Datensätzen und "RUS_Slots" (Detail) mit 5 Mio Datensätzen sind über das Feld "Produktionnr" mit einander verknüpft. Zu jedem Produktionsdatensatz werden mehrere Slotdatensätze abgelegt. Die Abfrage soll mir alle Produktionsdatensätze liefern, welche in dem Slot "100" Lizenzen haben <b>und</b> im Slot "200" keine Lizenzen haben (deswegen auch GROUP BY und HAVING COUNT).
<b>Das Ergebnis:</b>
Der IBServer läuft ne halbe Stunde mit 100% und lieferte kein Ergebnis......zumindest habe ich den Spass nach ner halben Stunde abgebrochen, weil das kann man ja keinem Benutzer zumuten.
<b>Der Witz:</b>
Vorher befanden sich die beiden Tabellen in einer Paradox-Datenbank....und ich habe genau die gleiche Abfrage über die BDE gestartet (Local-SQL) und hatte nach <b>15 Sekunden</b> ein Ergebnis bei genau der gleichen Menge an Daten!!!!!
Also was mache ich denn hier falsch.....
<b>Anmerkung:</b>
Das eigentlich kuriose......
Der Interbase-Server lief auf einem 2-GHz-Rechner.....die Local-SQL-Abfrage über die BDE habe ich auf einem Pentium 200 MMX Rechner ausgeführt......
Für schnelle Hilfe wäre ich sehr dankbar.....
ciao Elerian...
PS: Die Unter-Abfrage...
<b><pre>SELECT produktionnr
FROM rus_slots
WHERE ((slot_nr = 100) and (slot_lizenzen > 0)) or ((slot_nr = 200) and ((slot_lizenzen < 1) or (slot_lizenzen IS NULL)))
GROUP BY produktionnr
HAVING (COUNT(produktionnr) = 2)</pre></b>
...habe ich auf dem Interbase-Server probeweise in eine Stored Procedure gepackt.....
<b><pre>SET TERM ^;
CREATE PROCEDURE GET_ALL_PRODUKTIONNR(MITSLOT SMALLINT, OHNESLOT SMALLINT)
RETURNS (PRODUKTIONNR INTEGER)
AS
BEGIN
FOR SELECT produktionnr
FROM rus_slots
WHERE ((slot_nr = :MITSLOT) and (slot_lizenzen > 0)) or ((slot_nr = :OHNESLOT) and ((slot_lizenzen < 1) or (slot_lizenzen IS NULL)))
GROUP BY produktionnr
HAVING (COUNT(produktionnr) = 2)
INTO :PRODUKTIONNR
DO
SUSPEND;
END^
SET TERM ;^
COMMIT;</pre></b>
....und dann eben anstelle der Unterabfrage in die eigentlich Abfrage mit aufgenommen....
<b><pre>SELECT *
FROM produktion
WHERE (produktionnr IN
(SELECT produktionnr
FROM GET_ALL_PRODUKTIONNR(100, 200)))</pre></b>
...das Ergebnis war das gleiche..... <b>:-(</b>
ich habe folgendes Problem:
Ich stelle über WISQL folgende Anfrage an einen Interbase 6.01 Server:
<b><pre>SELECT *
FROM produktion
WHERE (produktionnr IN
(SELECT produktionnr
FROM rus_slots
WHERE ((slot_nr = 100) and (slot_lizenzen > 0)) or ((slot_nr = 200) and ((slot_lizenzen < 1) or (slot_lizenzen IS NULL)))
GROUP BY produktionnr
HAVING (COUNT(produktionnr) = 2)))</pre></b>
Die beiden Tabellen "Produktion" (Master) mit 22000 Datensätzen und "RUS_Slots" (Detail) mit 5 Mio Datensätzen sind über das Feld "Produktionnr" mit einander verknüpft. Zu jedem Produktionsdatensatz werden mehrere Slotdatensätze abgelegt. Die Abfrage soll mir alle Produktionsdatensätze liefern, welche in dem Slot "100" Lizenzen haben <b>und</b> im Slot "200" keine Lizenzen haben (deswegen auch GROUP BY und HAVING COUNT).
<b>Das Ergebnis:</b>
Der IBServer läuft ne halbe Stunde mit 100% und lieferte kein Ergebnis......zumindest habe ich den Spass nach ner halben Stunde abgebrochen, weil das kann man ja keinem Benutzer zumuten.
<b>Der Witz:</b>
Vorher befanden sich die beiden Tabellen in einer Paradox-Datenbank....und ich habe genau die gleiche Abfrage über die BDE gestartet (Local-SQL) und hatte nach <b>15 Sekunden</b> ein Ergebnis bei genau der gleichen Menge an Daten!!!!!
Also was mache ich denn hier falsch.....
<b>Anmerkung:</b>
Das eigentlich kuriose......
Der Interbase-Server lief auf einem 2-GHz-Rechner.....die Local-SQL-Abfrage über die BDE habe ich auf einem Pentium 200 MMX Rechner ausgeführt......
Für schnelle Hilfe wäre ich sehr dankbar.....
ciao Elerian...
PS: Die Unter-Abfrage...
<b><pre>SELECT produktionnr
FROM rus_slots
WHERE ((slot_nr = 100) and (slot_lizenzen > 0)) or ((slot_nr = 200) and ((slot_lizenzen < 1) or (slot_lizenzen IS NULL)))
GROUP BY produktionnr
HAVING (COUNT(produktionnr) = 2)</pre></b>
...habe ich auf dem Interbase-Server probeweise in eine Stored Procedure gepackt.....
<b><pre>SET TERM ^;
CREATE PROCEDURE GET_ALL_PRODUKTIONNR(MITSLOT SMALLINT, OHNESLOT SMALLINT)
RETURNS (PRODUKTIONNR INTEGER)
AS
BEGIN
FOR SELECT produktionnr
FROM rus_slots
WHERE ((slot_nr = :MITSLOT) and (slot_lizenzen > 0)) or ((slot_nr = :OHNESLOT) and ((slot_lizenzen < 1) or (slot_lizenzen IS NULL)))
GROUP BY produktionnr
HAVING (COUNT(produktionnr) = 2)
INTO :PRODUKTIONNR
DO
SUSPEND;
END^
SET TERM ;^
COMMIT;</pre></b>
....und dann eben anstelle der Unterabfrage in die eigentlich Abfrage mit aufgenommen....
<b><pre>SELECT *
FROM produktion
WHERE (produktionnr IN
(SELECT produktionnr
FROM GET_ALL_PRODUKTIONNR(100, 200)))</pre></b>
...das Ergebnis war das gleiche..... <b>:-(</b>
Comment