Abfrage-Statement mit View fehlerhaft
Verfasst: Do 24. Jul 2025, 11:17
Hallo, ich bin neu hier und eventuell wurde das Thema hier schon erörtert. Dann gleich sorry vorab...
Problem:
Nach der Umstellung von Firebird 3 auf 5.02 laufen einige Abfragen extrem lang.
Wenn man eine View in der Abfrage joint werden meist (nicht immer bei der gleichen Abfrage in der gleiche Datenbank ohne Datenänderungen!!!)
zu jeder Datenzeile alle Datensätze aus der view geladen.
Beispiel:
CREATE OR ALTER VIEW VIEW_AU_PRUEFUNG(
KUNDE,
LIEFERTERMIN,
MENGE,
EINHEIT)
AS
select
coalesce(k.kund_a_name1, '') || ' [' || coalesce(k.kund_a_nr, '') || ']',
iif(bp.bpos_d_liefertermin > cast('01.01.1900' as Date), bpos_d_liefertermin,
iif(b.bele_d_lieferdate > cast('01.01.1900' as Date), bele_d_lieferdate, NULL)),
bpos_n_menge,
ARTI_A_EINHEIT,
from
belege b
left outer join belegpos bp on bp.bpos_a_typ = 'AU' and bp.bpos_n_nr = b.bele_n_nr
left outer join Kunden k on k.kund_a_nr = b.bele_a_kundennr
[left outer join ARTIKEL x on ARTI_A_NR = bp.bpos_a_artikelnr
left outer join artikelwerte w on w.ARWE_A_NR = bp.bpos_a_artikelnr
left outer join touren t on t.tour_n_nr = b.bele_n_tour
where
b.bele_a_typ = 'AU' and b.bele_l_erledigt = 'N' and b.bele_l_gesperrt = 'N'
and coalesce(bp.bpos_n_menge,0) > 0 and coalesce(bp.bpos_n_menge,0) - coalesce(bp.bpos_n_mengegelief,0) > 0
order by
bp.bpos_a_artikelnr
bei dieser Abfrage ist alles gut, Laufzeit 1 Sekunde.
Die Statistik sagt in meiner Testdatenbank 9000 Abfragen auf Artikel und 9000 auf Artikelwerte.
Wenn ich aber statt auf die Tabelle ARTIKEL und ARTIKELWERTE auf eine View zugreife die relevante Daten aus den beiden Tabellen enthält
bekomme ich in der Statistik 240000000 Zugriffe auf die Tabelle Artikel und die Abfrage läuft mehrere Minuten.
Bis Firebird 4 gab es diesen Effekt nicht, das Problem tritt ab dem 5.01 auf.
Dies aber auch nur in bestimmten Konstellationen.
Es scheint das ab FB 5 etwas über die Suchoptimierung läuft.
(die Statistik für alle Indexe wurde neu berechnet)
Die gleiche Datenbankstruktur mit anderen Datensatzanzahlen in Belegen und Artikel reagiert anders.
Da tritt dieser Effekt nicht auf.
Hat jemand damit Erfahrungen ?
Wir verwenden Views schon häufig und können nicht vorhersagen bei welchem Kunden von uns dann Abfragen extrem lange laufen.
Die Alternative wäre alle Views zu eliminieren, oder Firebird 5 nicht einzusetzen.
Das kann ja auch nicht die Lösung sein.
Problem:
Nach der Umstellung von Firebird 3 auf 5.02 laufen einige Abfragen extrem lang.
Wenn man eine View in der Abfrage joint werden meist (nicht immer bei der gleichen Abfrage in der gleiche Datenbank ohne Datenänderungen!!!)
zu jeder Datenzeile alle Datensätze aus der view geladen.
Beispiel:
CREATE OR ALTER VIEW VIEW_AU_PRUEFUNG(
KUNDE,
LIEFERTERMIN,
MENGE,
EINHEIT)
AS
select
coalesce(k.kund_a_name1, '') || ' [' || coalesce(k.kund_a_nr, '') || ']',
iif(bp.bpos_d_liefertermin > cast('01.01.1900' as Date), bpos_d_liefertermin,
iif(b.bele_d_lieferdate > cast('01.01.1900' as Date), bele_d_lieferdate, NULL)),
bpos_n_menge,
ARTI_A_EINHEIT,
from
belege b
left outer join belegpos bp on bp.bpos_a_typ = 'AU' and bp.bpos_n_nr = b.bele_n_nr
left outer join Kunden k on k.kund_a_nr = b.bele_a_kundennr
[left outer join ARTIKEL x on ARTI_A_NR = bp.bpos_a_artikelnr
left outer join artikelwerte w on w.ARWE_A_NR = bp.bpos_a_artikelnr
left outer join touren t on t.tour_n_nr = b.bele_n_tour
where
b.bele_a_typ = 'AU' and b.bele_l_erledigt = 'N' and b.bele_l_gesperrt = 'N'
and coalesce(bp.bpos_n_menge,0) > 0 and coalesce(bp.bpos_n_menge,0) - coalesce(bp.bpos_n_mengegelief,0) > 0
order by
bp.bpos_a_artikelnr
bei dieser Abfrage ist alles gut, Laufzeit 1 Sekunde.
Die Statistik sagt in meiner Testdatenbank 9000 Abfragen auf Artikel und 9000 auf Artikelwerte.
Wenn ich aber statt auf die Tabelle ARTIKEL und ARTIKELWERTE auf eine View zugreife die relevante Daten aus den beiden Tabellen enthält
bekomme ich in der Statistik 240000000 Zugriffe auf die Tabelle Artikel und die Abfrage läuft mehrere Minuten.
Bis Firebird 4 gab es diesen Effekt nicht, das Problem tritt ab dem 5.01 auf.
Dies aber auch nur in bestimmten Konstellationen.
Es scheint das ab FB 5 etwas über die Suchoptimierung läuft.
(die Statistik für alle Indexe wurde neu berechnet)
Die gleiche Datenbankstruktur mit anderen Datensatzanzahlen in Belegen und Artikel reagiert anders.
Da tritt dieser Effekt nicht auf.
Hat jemand damit Erfahrungen ?
Wir verwenden Views schon häufig und können nicht vorhersagen bei welchem Kunden von uns dann Abfragen extrem lange laufen.
Die Alternative wäre alle Views zu eliminieren, oder Firebird 5 nicht einzusetzen.
Das kann ja auch nicht die Lösung sein.