AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Performance verbessern
Thema durchsuchen
Ansicht
Themen-Optionen

Performance verbessern

Ein Thema von Luncustaf · begonnen am 8. Dez 2006 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
Seite 2 von 9     12 34     Letzte »    
Luncustaf

Registriert seit: 31. Jan 2003
80 Beiträge
 
Delphi 6 Enterprise
 
#11

Re: Performance verbessern

  Alt 10. Dez 2006, 11:07
hi,

hört sich interessant an - ich hab mal danach gesucht - kann aber nicht wirklich was damit anfangen.

Zitat:
To create parameters at runtime, you can use the

ParamByName method to assign values to a parameter based on its name (not available for TADOQuery)
Params or Parameters property to assign values to a parameter based on the parameter's ordinal position within the SQL statement.
Params.ParamValues or Parameters.ParamValues property to assign values to one or more parameters in a single command line, based on the name of each parameter set.

The following code uses ParamByName to assign the text of an edit box to the :Capital parameter:

SQLQuery1.ParamByName('Capital').AsString := Edit1.Text;

The same code can be rewritten using the Params property, using an index of 0 (assuming the :Capital parameter is the first parameter in the SQL statement):

SQLQuery1.Params[0].AsString := Edit1.Text;

The command line below sets three parameters at once, using the Params.ParamValues property:

Query1.Params.ParamValues['Name;Capital;Continent'] :=
VarArrayOf([Edit1.Text, Edit2.Text, Edit3.Text]);

Note that ParamValues uses Variants, avoiding the need to cast values.
evtl ist auch mein englisch zu schlecht das ich es genau verstehe wie es gemeint ist.
kannst du mir vllt einen kleinen Anstoss geben - bitte nicht den ganzen code - evtl auch nur erklären - bin ja hier zum lernen abschreiben bringt da nichts.

gruß
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Performance verbessern

  Alt 10. Dez 2006, 12:25
Hallo,

beim Zugriff auf deine Datenbank muss dein Programm versuchen alle Informationen mit möglichst wenigen Queries zu besorgen. In deinem Fall würde eine einzige Query genügen, was den Ladeprozess ungemein beschleunigen sollte. Informiere dich mal über die GROUP BY Klausel - und zeige mal das Schema (Datenmodell) deiner Datenbank.

Grüße vom marabu
  Mit Zitat antworten Zitat
Luncustaf

Registriert seit: 31. Jan 2003
80 Beiträge
 
Delphi 6 Enterprise
 
#13

Re: Performance verbessern

  Alt 10. Dez 2006, 17:28
hi,

also habe mich nun darüber infomiert - sehe ich es richtig das ich zb die unterkategorien mit group bei sortieren soll, so das das zählen schneller geht?

ich habe momentan 4 tabellen,
Delphi-Quellcode:
kategorie
   name //namen der kategorien

unterkat
   kat //hauptkategorie -> aus tabelle kategorie
   unter //name der unterkategorie

rezepte
   name //name des rezepts
   unterkat //dazu gehörige unterkategorie -> aus tabelle unterkat
   kategorie //hauptkategorie -> aus tabelle kategorie

zutaten
   kategorie //hauptkategorie -> aus tabelle kategorie
   unterkat //dazu gehörige unterkategorie -> aus tabelle unterkat
   name //name des rezepts
   zutat //name der zutat
   menge //menge der zutat
   mass //maß der zutat
   zubereitung //zubereitung als BLOB
die zwei tabellen kategorie und unterkat brauche ich momentan eigentlich nicht mehr da ich die werte dieser beiden lokal liegen habe. ist das das was du wolltest?

gruß
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Performance verbessern

  Alt 10. Dez 2006, 17:31
Die lokale Speicherung von Tabllen, bringt m.E. nichts. Wie sehen die Abftagen aus, was soll abgefragt werden?
Markus Kinzler
  Mit Zitat antworten Zitat
Luncustaf

Registriert seit: 31. Jan 2003
80 Beiträge
 
Delphi 6 Enterprise
 
#15

Re: Performance verbessern

  Alt 10. Dez 2006, 17:34
hi,

habe nicht die tabellen sondern nur die werte dieser in einer txt und ini datei abgelegt in der hoffnung das es dadurch schneller geht.
momentan sieht meine abfrage so aus.

Delphi-Quellcode:
tv_rezept.Items.BeginUpdate;
try
  frm_laden.Show;
  frm_laden.Label1.Caption := 'Lade Datenbank';
  Application.ProcessMessages;
  for i := 0 to namen.Count -1 do
  begin
     sqlqrez.Active := False;
     sqlqrez.SQL.Clear;
     sqlqrez.SQL.Add('SELECT Count(name) FROM rezepte WHERE kategorie in ("'+namen.Strings[i]+'")');
     sqlqrez.Active := True;
     with tv_rezept.Items do
     begin
       t := AddChild(nil,namen.Strings[i] + ' ('+sqlqrez.fieldbyname('Count(name)').AsString+')');
     end;
     for a := 0 to 8 do
     begin
       if not (ini.ReadString(namen.Strings[i],'unter'+IntToStr(a),'') = '') then
       begin
         unterkat.Add(ini.ReadString(namen.Strings[i],'unter'+IntToStr(a),''));
       end;
     end;//for a :=
     for a := 0 to unterkat.Count -1 do
     begin
         sqlqrez.Active := False;
         sqlqrez.SQL.Clear;
         sqlqrez.SQL.Add('SELECT Count(name) FROM rezepte WHERE unterkat in ("'+unterkat.Strings[a]+'") AND kategorie in ("'+namen.Strings[i]+'") GROUP BY unterkat');
         sqlqrez.Active := True;
         tv_rezept.Items.AddChild(t,unterkat.Strings[a]+ ' (' + sqlqrez.fieldbyname('Count(name)').AsString +')' );
         sqlqrez.Active := False;
     end;//for a
     unterkat.Clear;
     frm_laden.progress.StepBy(10);
  end;//for i
finally
  tv_rezept.Items.EndUpdate;
  frm_laden.Close;
end;
wie oben beschrieben ist das problem das es ziemlich lange braucht alle daten zu laden die aich abfrage.

gruß
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Performance verbessern

  Alt 10. Dez 2006, 17:40
Meine Frage, war was du abffragen willst und nicht wie du es jetzt macht.
Markus Kinzler
  Mit Zitat antworten Zitat
Luncustaf

Registriert seit: 31. Jan 2003
80 Beiträge
 
Delphi 6 Enterprise
 
#17

Re: Performance verbessern

  Alt 10. Dez 2006, 17:45
ich will in einer treeview meine kategorien mit den dazugehörigen unterkategorien anzeigen - hinter den jeweiligen kategorien und unterkategorien soll in klammen angezeigt werden wieviel rezepte es in dieser kategorie bzw. unterkategorie schon gibt.

damit man sich net durchklicken muss um auf gut glück ein rezept zu finden.

klappt auch soweit ganz gut nur soll die geschwindigkeit des ladens verbessert werden.
Miniaturansicht angehängter Grafiken
treeview_388.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Performance verbessern

  Alt 10. Dez 2006, 17:53
Dann würde ich das per SQL abfragen:

select count( id) from rezepte where kategorie = :kat; select count( id) from rezepte where ukat = :ukat;
Markus Kinzler
  Mit Zitat antworten Zitat
Luncustaf

Registriert seit: 31. Jan 2003
80 Beiträge
 
Delphi 6 Enterprise
 
#19

Re: Performance verbessern

  Alt 10. Dez 2006, 17:58
hmm das mache ich doch momentan eigentlich auch oder nicht?

kategorien:

Delphi-Quellcode:
     sqlqrez.Active := False;
     sqlqrez.SQL.Clear;
     sqlqrez.SQL.Add('SELECT Count(name) FROM rezepte WHERE kategorie in ("'+namen.Strings[i]+'")');
     sqlqrez.Active := True;
unterkategorien:

Delphi-Quellcode:
         sqlqrez.Active := False;
         sqlqrez.SQL.Clear;
         sqlqrez.SQL.Add('SELECT Count(name) FROM rezepte WHERE unterkat in ("'+unterkat.Strings[a]+'") AND kategorie in ("'+namen.Strings[i]+'") GROUP BY unterkat');
         sqlqrez.Active := True;
bei unterkategoriem uss ich die hauptkategorie auch mit anfragen da es zb die unterkategorie grundrezepte in mehreren hauptkategorien gibt.
wenn ich falsch liegen sollte bitte um verbesserung.

gruß
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Performance verbessern

  Alt 10. Dez 2006, 18:04
Besser wäre aber wie schon erwähnt das ganze parametrisiert zu machen:

Delphi-Quellcode:
    sqlkat.SQL.Text := 'SELECT Count(name) FROM rezepte WHERE kategorie = :kat';
     sqlukat.SQL.Text := 'SELECT Count(name) FROM rezepte WHERE kategorie = :kat and unterkategorie = :ukat';
    ...
     sqlKat.paramByName('kat').Value := namen.Strings[i];
     sqlKat.Open;
   ...
     sqluKat.paramByName('kat').Value := namen.Strings[i];
     sqluKat.paramByName('kat').Value := unterkat.Strings[a];
     sqluKat.Open;
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 9     12 34     Letzte »    


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 18:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz