AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Abfrage dauert zu lange unter Delphi

Abfrage dauert zu lange unter Delphi

Ein Thema von Dumpfbacke · begonnen am 7. Jan 2015 · letzter Beitrag vom 8. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2   
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.880 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 13:45
Bei IN kann auch kein Index greifen. Wenn die Werte mit 'Röhre" beginnen könnte man STARTING WITH statt IN verwenden, dann mit Indexunterstützung.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 13:57
Ich gehe davon aus, daß das IN hinterher mit mehreren Werten gefüllt ist. Niemand wird ein = durch ein IN ersetzen! (oder doch?)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#3

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 14:19
Jegliche Ungleichheitsoperatoren (<>, IS NOT, NOT IN etc.) können in der Regel nicht durch einen Index bedient werden, d.h. der einzige Index der ev. greift ist auf dem Feld "Eingang".

Mich würde primär mal der Ausführungsplan interessieren.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 14:43
Und etwas Klarheit zu bekommen würde in Delphi mal folgende Abfrage testen:
SQL-Code:
Select COUNT(*) AS Anzahl
From Material
where Eingang IS NULL and MaterialTyp not in ('Rohre')
and StatusRaus <> 'Auftrag noch nicht erzeugtand Refernz is not NULL
Diese Abfrage erzeugt auf dem Server annähernd die gleiche Last; allerdings wird nur ein einziger Datensatz an den Client übertragen.
Somit lässt sich erkennen wo der Flaschenhals ist.
Und dann würde ich dir DRINGEND empfehlen das Feld "StatusRaus" als Integerfeld anzulegen.
Überlege dir welche Statuswerte es gibt und welche es in Zukunft noch geben könnte.
fork me on Github
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
335 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 18:50
Jegliche Ungleichheitsoperatoren (<>, IS NOT, NOT IN etc.) können in der Regel nicht durch einen Index bedient werden, d.h. der einzige Index der ev. greift ist auf dem Feld "Eingang".

Mich würde primär mal der Ausführungsplan interessieren.
Also das in ist hier natürlich falsch und unlogisch. Es muss hier nur eine Wert ausgeschlossen werden und deshalb wird hier auch ein <>. Ich hatte es mal geändert im zu sehen ob sich was ändert und dann ganz vergessen es hier zu ändern.
Also : and MaterialTyp <> 'Rohre'

Nun zum Ausführungsplan. Leider ist es richtig das hier wirklich nur ein Index greift und zwar der vom Feld Eingang. Mir war nicht bewusst das beim negieren der Index nicht mehr greift. Man lernt immer dazu.
Also Dauert es nun wirklich so lange bis die wenigen Datensätze ausgelesen sind ? Gibt es noch eine Möglichkeit für mich wo ich etwas ändern kömnnte ?

Schon einmal Danke alle hier Ihr seit einfach die Experten.
Tanja
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.880 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 19:51
Zitat:
Also Dauert es nun wirklich so lange bis die wenigen Datensätze ausgelesen sind ?
Das hat nichts mit der Anzahl der zurückgegebenen Datensätze zu tun, sondern mit der Tatsache, dass kein Index greift.
Zitat:
Gibt es noch eine Möglichkeit für mich wo ich etwas ändern kömnnte ?
Ja, Normalisierung ( Materialtyp, Statusraus, usw.)
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 20:52
Wenn Du von 3,8 mio auf 20 Datensätze kommst, muss irgendetwas in den Parametern ja diese Einschränkung bringen.
Das Kriterium, das die größte Einschränkung bringt, sollte idealerweise per Index laufen.
Neben den genannten Vorschlägen, würde ich mal probieren, wieviel die eine Spalte mit Index bringt, also wie groß /klein das Ergebnis bereits ist und das in einer Kapselung weiter einschränken, wenn es bereits klein genug ist.
Also bspw. im ersten Schritt per Kriterium 1 von 3,8 Mio auf 10 T und im 2. die restlichen Kriterien anwenden, ist dann quasi nur noch etwas Kopfrechnen.
Im Grunde ist das Spielerei mit dem Optimizer, geht vermutlich auch per Hints, weiß nicht genau wie das bei Firebird ist.
Konkret wäre noch der Vorschlag, das schwache
Referenz is not null gegen ein kräftiges
Referenz> ' '
oder anderes auszutauschen, je genauer, desto besser. Dann könnte hier auch der Index greifen. Muss natürlich sichergestellt sein, dass das Kriterum auch die gleiche Menge ergibt.
Gruß, Jo
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 23:01
Hallo,
ich warte immer noch auf den Query-Plan ...

Heiko
Heiko
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 15:01
Bei IN kann auch kein Index greifen.
Wieso nicht? ein 'X IN (A,B)' ist identisch mit 'X=A or X=B' und dann kann sehr wohl ein Index greifen. Vielleicht bei FB nicht, aber nur dann, weil FB an der Stelle schlampt.
Wie bereits gesagt, in der Entwicklungsumgebung ...
...Wenn ich die Query im Objektinspektor ...
Meinst Du mit 'Entwicklungsumgebung' Dinge, wie IBExpert, oder wirklich die Delphi-IDE?
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#10

AW: Abfrage dauert zu lange unter Delphi

  Alt 7. Jan 2015, 15:06
Zitat:
Wieso nicht? ein 'X IN (A,B)' ist identisch mit 'X=A or X=B' und dann kann sehr wohl ein Index greifen. Vielleicht bei FB nicht, aber nur dann, weil FB an der Stelle schlampt.
Ne, Firebird schlampt hier nicht und kann bei einem IN Operator (ohne Negation) natürlich einen Index verwenden sofern der Optimizer anhand der Indexstatistiken der Meinung ist, dass der Zugriff über den Index sinnvoll ist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz