Firebird SQL Abfrage optimieren

freedamo

Benutzer
Beiträge
14
Hallo,

ich habe nachfolgende Abfrage über mehrere Tabellen. Es funktioniert auch alles soweit, meine Frage ist nun, ob man diese noch etwas optimieren könnte. Gibt es vielleicht eine Alternative zu den Joins?

Bin gespannt was euch so einfällt :)
Code:
select a.POSNR, a.BELEGNR, a.ADRESSNR, a.ARTIKELNR,
a.MENGE, getdate(a.DATUMME) as Lieferdat, b.KOMINFO, f.ETIKETTINFO, g.Info,
a.LAGERORT, f.Name1, f.Name2, f.Name3, f.Strasse, f.Plz, f.ORT, f.LAND, b.VERSNDNAME, h.STAMMLORT
from BELEGPOS a
left outer Join BELEG b on a.BELEGNR=b.Belegnr and
  a.BELEGTYP=b.BELEGTYP and
  a.BELEGART=b.BELEGART and
  a.ADRESSNR=b.ADRESSNR
left outer Join KUNDEN f on a.ADRESSNR=f.KUNDENNR
left outer Join ADRART g on a.ADRESSNR=g.ADRESSNR and
  a.ARTIKELNR=g.ARTIKELNR
left outer Join ARTIKEL h on a.ARTIKELNR=h.ARTIKELNR
where
a.BELEGTYP='V'
and a.BELEGART='AU'
and a.KZDRUCK = ''
and a.KZAMS in ('5','6','7','30','31','32','33','34','35','36','37','82','84')
and b.MSMDE_VERSAND = '1'
and a.LAGERORT = ''
or (a.BELEGTYP='V'
and a.BELEGART='AU'
and a.KZDRUCK = ''
and a.KZAMS not in ('1','2','3','4','8','9','10','11','12','13','14','15','16','17','18','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','66','70','71','72','73','74','75','76','77','78','79','83')
and b.MSMDE_VERSAND = '1'
and a.LAGERORT = ''
and a.ADRESSNR = '155050')
and a.ARTIKELNR <> 'Porto'
order by a.DATUMME, a.BELEGNR, a.POSNR
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Hi! Ich habe den "Sinatica Monitor for Thunderbird" laufen und da wird diese Abfrage mit "Excess table scans" deklariert. Deshalb meine Frage bezüglich einer Optimierung.

Seltsam ist das ab einer gewissen Uhrzeit der Firebird Server extrem langsam wird (hohe CPU Auslastung) und ich jetzt jede Fehlerquelle ausschließen möchte. Ansonsten laufen keine anderen Programme auf diesem Server.

Zu dieser Zeit läuft auch kein Backup etc, auch die User-Anzahl ist konstant. Virenscanner ist deaktiviert. Deshalb meine Vermutung mit dieser Abfrage...
 
Ich kenne Firebird nicht, von daher kann ich auch kaum helfen. Die Meldung ist a bissl komisch, finde ich. Das DB-System sollte in der Lage sein, wenn es unnötige Dinge im Plan erkennt, diese zu optimieren und nicht solch Meldungen von sich zu geben. Aber vielleicht bin ich auch nur verwöhnt.
 
Grundsätzlich sollte das etwas mehr Performance rausholen:
Code:
Select a.posnr
      ,a.belegnr
      ,a.adressnr
      ,a.artikelnr
      ,a.menge
      ,getdate(a.datumme) As lieferdat
      ,b.kominfo
      ,f.etikettinfo
      ,g.info
      ,a.lagerort
      ,f.name1
      ,f.name2
      ,f.name3
      ,f.strasse
      ,f.plz
      ,f.ort
      ,f.land
      ,b.versndname
      ,h.stammlort
From   belegpos a

Left   Outer Join beleg b
On     b.belegnr = a.belegnr
And    b.belegtyp = a.belegtyp
And    b.belegart = a.belegart
And    b.adressnr = a.adressnr

Left   Outer Join kunden f
On     f.kundennr = a.adressnr

Left   Outer Join adrart g
On     g.adressnr = a.adressnr
And    g.artikelnr = a.artikelnr

Left   Outer Join artikel h
On     a.artikelnr = h.artikelnr

Where  a.belegtyp = 'V'
And    a.belegart = 'AU'
And    a.kzdruck = ''
And    (a.kzams In ('5', '6', '7', '30', '31', '32', '33', '34', '35', '36', '37', '82', '84') Or
       (a.adressnr = '155050'
       And a.kzams Not In ('1', '2', '3', '4', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '38', '39', '40', '41', '42',
                        '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61',
                        '62', '63', '64', '66', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '83')))
And    b.msmde_versand = '1'
And    a.lagerort = ''
And    a.artikelnr <> 'Porto'

Order  By a.datumme
         ,a.belegnr
         ,a.posnr
Da ich aber weder DDLs noch Daten habe, kann ich leider nicht mehr tun...
 
SUPER DANKE! Echt klasse! Das hier ist genau was ich gesucht habe. Meine Abfrage benötigt ca 10x Sekunden, deine Abfrage dagegen nur ca 3 x Sekunden > natürlich bei gleicher Anbindung und Datenmenge :)

Grundsätzlich sollte das etwas mehr Performance rausholen:
Code:
Select a.posnr
      ,a.belegnr
      ,a.adressnr
      ,a.artikelnr
      ,a.menge
      ,getdate(a.datumme) As lieferdat
      ,b.kominfo
      ,f.etikettinfo
      ,g.info
      ,a.lagerort
      ,f.name1
      ,f.name2
      ,f.name3
      ,f.strasse
      ,f.plz
      ,f.ort
      ,f.land
      ,b.versndname
      ,h.stammlort
From   belegpos a

Left   Outer Join beleg b
On     b.belegnr = a.belegnr
And    b.belegtyp = a.belegtyp
And    b.belegart = a.belegart
And    b.adressnr = a.adressnr

Left   Outer Join kunden f
On     f.kundennr = a.adressnr

Left   Outer Join adrart g
On     g.adressnr = a.adressnr
And    g.artikelnr = a.artikelnr

Left   Outer Join artikel h
On     a.artikelnr = h.artikelnr

Where  a.belegtyp = 'V'
And    a.belegart = 'AU'
And    a.kzdruck = ''
And    (a.kzams In ('5', '6', '7', '30', '31', '32', '33', '34', '35', '36', '37', '82', '84') Or
       (a.adressnr = '155050'
       And a.kzams Not In ('1', '2', '3', '4', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '38', '39', '40', '41', '42',
                        '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61',
                        '62', '63', '64', '66', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '83')))
And    b.msmde_versand = '1'
And    a.lagerort = ''
And    a.artikelnr <> 'Porto'

Order  By a.datumme
         ,a.belegnr
         ,a.posnr
Da ich aber weder DDLs noch Daten habe, kann ich leider nicht mehr tun...
 
Werbung:
Zurück
Oben