AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DB Tabelle beschleunigen

Ein Thema von Ykcim · begonnen am 12. Jul 2019 · letzter Beitrag vom 18. Jul 2019
Antwort Antwort
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#1

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:03
Also ich bin Keys etc nicht sehr vertraut...

Ich habe einen Primary gesetzt, der aber aus 3 Spalten besteht (waaunr, waaupo, oaagnr). Aber außer das ich den in der Tabelle gesetzt habe, mache ich sonst nichts damit...
Die Query ist fast egal, denn auch eine ganz einfache dauert sehr lange (1,7 sek).

Delphi-Quellcode:
SELECT * FROM as400archiev
where waaunr=291482
Was die Hardware betrifft, so liegt der Server auf eine Virtualisierung und hat einiges an Power....

Vielen Dank
Patrick

Zitat:
Wer auch immer für die ersten 2/3 der Spaltennamen verantwortlich ist, gehört sehr fest an den Marterpfahl gezurrt!
Die kommen aus XPPS... WAAUNR=WarenauftragsNr, WAAUPO=Warenauftragsposition, WATENR=WarenauftragsTeileNr...
Patrick

Geändert von Ykcim (12. Jul 2019 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:16
Dein Query auf waaunr sollte hier eigentlich den Primary Key verwenden und in diesem Fall ein schnelles Resultat bringen. Was für eine DB nutzt du? Gibt es da eine Art Execution Plan den du anschauhen kannst? Dort würdest du sehen, ob für das abgesetzte SQL ein Index verwendet wird oder nicht. Wieviele Records liefert dir dein Besipiel SQL?

Wenn du nicht recht weisst wie man einen Index nutzt, solltest du dich unbeding erst mal zu diesem Thema auseinandersetzen. Das ist das A und O bei der DB Entwicklung.

Geändert von Rolf Frei (12. Jul 2019 um 15:18 Uhr)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#3

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:19
Ich benutze einen MySQL Server 5

Kannst Du mir ein Beispiel aufschreiben, wie ich den Primary in mein SQL-Statement einbauen muss?

Danke
Patrick
Patrick
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:49
Ich benutze einen MySQL Server 5

Kannst Du mir ein Beispiel aufschreiben, wie ich den Primary in mein SQL-Statement einbauen muss?

Danke
Patrick
Das kannst du nicht im SQL bestimmen. Es kommt darauf an was du bei der DB-Erstellung für Keys definiert hast. Diese werden soweit es eben geht, vom SQL Optimizer benutzt. Wie gesagt müsste der Optimizer für dein SQL so den Primary Key nutzen, sofern das Feld waaunr auch wirklich das erste Feld im Key ist. Ansonsten könnte er den Key nicht nutzen und er würde einen Scan über alle Records machen. Dann müsstest du einen eigenen Index für das Feld "waaunr" erstellen. Der Optimizer schaut dann selber, ob da ein Index passt, den er nutzen kann.

Geändert von Rolf Frei (12. Jul 2019 um 15:58 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:22
Ich bin mir grad nicht 100% sicher, aber ist der primary key so in dieser Form nicht ein kombinierter Schlüssel, und bringt auch wirklich nur etwas, wenn man über alle 3 Felder filtert? Man könnte testhalbar mal einen Index über die Spalte WAAUNR erzeugen, und dann schauen ob die konkrete Abfrage hier dann schneller ist.

Das ist übrigens auch, warum die ganz konkreten Abfragen wichtig sind: Man muss immer spezifisch für die optimieren, die man tatsächlich auch einsetzt. Allgemeine Maßnahmen gibt es, von Hardware abgesehen, praktisch kaum.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#6

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:27
Zitat:
Das ist übrigens auch, warum die ganz konkreten Abfragen wichtig sind: Man muss immer spezifisch für die optimieren, die man tatsächlich auch einsetzt. Allgemeine Maßnahmen gibt es, von Hardware abgesehen, praktisch kaum.
Ich weiß, wenn ich eine Frage mit einer Abfrage habe, dann stelle ich die auch online. Aber hier ist nicht die Abfrage das Problem, sondern der Umgang mit den vielen Datensätzen.

Zitat:
Man könnte testhalbar mal einen Index über die Spalte WAAUNR
Die WAAUNR Spalte ist nicht unique. Die Werte wiederholen sich hier. Geht das dann trotzdem?

Vielen Dank
Patrick

EDIT: Ich habe einen Index auf WAAUNR gelegt - keine Veränderung...
Patrick

Geändert von Ykcim (12. Jul 2019 um 15:29 Uhr)
  Mit Zitat antworten Zitat
hoika

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

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:42
Hallo,
nehmen wir mal eine andere Abfrage

SELECT TEBEZ1 FROM as400archiev
where waaunr=291482


1. Wie schnell ist die?

2. Und was passiert, wenn du die Query 2mal hintereinander ausführst?

3. Was läuft noch auf dem Datenbank-Server, vielleicht ein Domain-Controller?
Heiko
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#8

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:43
Tabellendefinition haben wir.

Es fehlen: Die Indexdefinitionen!
Die auszuführenden SQLs!

Ohne diese Angaben kann man nicht helfen, sondern nur rumspekulieren.

Index erstellen: https://www.w3schools.com/sql/sql_create_index.asp

Grundlagen für SQL aneignen: Dringend. https://www.google.com/search?q=grun...t=firefox-b-ab
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#9

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 16:02
Zitat:
1. Wie schnell ist die?
1,7951 s

Zitat:
2. Und was passiert, wenn du die Query 2mal hintereinander ausführst?
0,0008 s

Zitat:
3. Was läuft noch auf dem Datenbank-Server, vielleicht ein Domain-Controller?
Nichts, auf dem Server läuft ausschließlich der MySQL-Server

Zitat:
Es fehlen: Die Indexdefinitionen!
Leider weiß ich nicht, was damit gemeint ist.

Zitat:
Die auszuführenden SQLs!
Ich glaube zwar nicht, dass das weiterhilft, wenn schon die einfachsten Abfragen Probleme bereiten, aber nachfolgend die Abfragen...
Delphi-Quellcode:
procedure TMySQLDB.Get_Alternativen(ArtikelNr, Bereich: string);
var I: integer;
      where1: string;
      Cols: TCols;
      Rows: TRows;
begin
   where1:='';
   FMySelectQuery.SQL.Clear;
   FMySelectQuery.SQL.Add('select max(a.waaunr) from as400archiev as a '+
                          'where a.watenr=:artikel '+
                          'and left(a.oamanr,2) in (SELECT arbeitsplatzkz from bereiche '+
                          'where bereiche_text= :bereich ) '+
                          'group by a.oamanr ');
   FMySelectQuery.ParamByName('artikel').AsString:=ArtikelNr;
   FMySelectQuery.ParamByName('bereich').AsString:=Bereich;
   ExecQuery(FMySelectQuery, Cols, Rows,0);
   if FMySelectQuery.RecordCount=0 then begin
      SetLength(FRows_Alternativen, Length(FCols_Alternativen),0);
      Exit;
   end;
   for I := 0 to Length(Rows[0]) -1 do begin
      if I=0 then
         where1:=where1+QuotedStr(Rows[0,I])
      else
         where1:=where1+', '+QuotedStr(Rows[0,I])
   end;
   FMySelectQuery.SQL.Clear;
   FMySelectQuery.SQL.Add('select oamanr, mamabz, oaagbz from as400archiev '+
                          'where waaunr in ('+where1+') '+
                          'and left(oamanr,2) in (SELECT arbeitsplatzkz FROM bereiche '+
                          'where bereiche_text=:bereich) '+
                          'group by oamanr' );
   FMySelectQuery.ParamByName('bereich').AsString:=Bereich;
   ExecQuery(FMySelectQuery, FCols_Alternativen, FRows_Alternativen,0);
end;
Mit der ersten Abfrage hole ich mir den letzten Auftrag des Artikels, der beendet wurde und in der zweiten hole ich mir die Maschineninformationen. Die erste Query mache ich, weil sich Angaben zur Geschwindigkeit (in oaagbz) der Maschine von Zeit zur Zeit ändern. Also hole ich mir damit den letzten Stand.

Zitat:
Grundlagen für SQL aneignen: Dringend.
Werde mir die Links am WE vornehmen...

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: DB Tabelle beschleunigen

  Alt 12. Jul 2019, 15:56
Ich bin mir grad nicht 100% sicher, aber ist der primary key so in dieser Form nicht ein kombinierter Schlüssel, und bringt auch wirklich nur etwas, wenn man über alle 3 Felder filtert?
Das hängt vom verwendeten DBMS ab. Die DB die ich selber nutze, würde in diesem Fall den PK benutzen, da es das erste Feld im Index ist. Würde nach den 2. Feld im Key gesucht, ginge das natürlich nicht. Was MySQL hier macht weiss ich leider auch nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:07 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 by Thomas Breitkreuz