Toon posts:

[Delphi] & [MySQL]

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit al een tijdje met het volgende probleem:

Ik heb een MySQL database met 2 tabellen 1 tabel heeft +/- 25000 records andere heeft een stuk of 50.
Hier voor heb ik in Delphi een applicatie gemaakt om de tabel van 25000 records te laten zien, wijzigen, etc. Ik maak gebruik van een BDE Table en daaraan een standaard Dataset, Met een DB Grid en DB veldjes.

Het grote probleem is dat dit alles heel traag gaat. Het laden kost al gauw zon 5 sec. Bij het scrollen duurt het ook eerst weer 5 sec voor dat ie klaar is met laden, en altijd als ik post aanroep krijg ik dit zelfde ook weer.

Het lijkt me dat dit niet normaal is, dit moet toch sneller kunnen? De server draait gewoon op mijn lokale pc, en het gaat niet over het internet ofzo.
Ik loop al een week te zoeken naar een oplossing en nix gevonden dat heeft geholpen (heb ook de search optie hier gebruikt :9 )

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Lees even dit topic door, misschien dat het je al op weg helpt.

https://fgheysels.github.io/


  • _DeWie_
  • Registratie: November 2001
  • Laatst online: 10-04 16:23
Bij elke actie wordt de gehele tabel in het geheugen van de applicatie geladen.
Ga is naar tquery kijken.

Verwijderd

Topicstarter
Ik gebruik er al een aantal indexen in, maar het helpt weinig, merk alleen dat het echt helpt bij het zoeken.

Verder is tabel is gesorteert op de primaire key.

Verwijderd

Topicstarter
Een TQuery heb ik ook al geprobeerd, zelfde laad tijd, enigste verschil is dat na de query alles inderdaad in het geheugen is geladen. Maar als ik een record wil inserten en dan met een TUpdateQuery, krijg ik die vertraging weer.

Sorry dat ik het andere topic omhoog gehaald heb was niet mn bedoeling, ging iets mis.

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op maandag 24 juni 2002 12:00 schreef prober001 het volgende:
Het grote probleem is dat dit alles heel traag gaat. Het laden kost al gauw zon 5 sec. Bij het scrollen duurt het ook eerst weer 5 sec voor dat ie klaar is met laden, en altijd als ik post aanroep krijg ik dit zelfde ook weer.
Doe je na je post een refresh van de dataset of sluit en open je die Table dan opnieuw?

Ik denk toch dat het iets met de queries te maken heeft. Misschien liggen ze op de verkeerde velden?
Kun je een execution plan van die queries bekijken?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op maandag 24 juni 2002 12:11 schreef whoami het volgende:

[..]

Doe je na je post een refresh van de dataset of sluit en open je die Table dan opnieuw?

Ik denk toch dat het iets met de queries te maken heeft. Misschien liggen ze op de verkeerde velden?
Kun je een execution plan van die queries bekijken?
Na een post hoef ik niet te refreshen, als ik de standard TTable gebruik, dat gebeurt dan automatisch. Als ik een TQuery gebruik heb ik zowel het refreshen als het openen en sluiten geprobeerd, beide werken even traag.
Kun je een execution plan van die queries bekijken?
Heb eigenlijk geen idee hoe ik dat kan doen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op maandag 24 juni 2002 14:01 schreef prober001 het volgende:
Na een post hoef ik niet te refreshen, als ik de standard TTable gebruik, dat gebeurt dan automatisch. Als ik een TQuery gebruik heb ik zowel het refreshen als het openen en sluiten geprobeerd, beide werken even traag.
Ik bedoelde niet of je dat handmatig of niet deed, maar eerder of er een requery/refresh gebeurde. Dat gebeurt dus ook, dus zal het ook wel die refresh zijn die zo lang duurt.
Heb eigenlijk geen idee hoe ik dat kan doen.
Hoe je het in MySQL kunt doen, weet ik niet maar ik denk dat het statement in dat ander topic staat dat ik hier al vermeld heb.

https://fgheysels.github.io/


  • yodax
  • Registratie: Januari 2000
  • Laatst online: 28-04 08:47
Wat je kan doen, mits je Delphi 6 gebuikt, is een BDEClientDataSet gebruiken. Je kan daar de property FetchOnDemand aanzetten.

Hou hier wel rekening mee dat de updates naar de database gecached worden. Je zult deze dus moeten applyen.

Je kan met de SQLCommandText een Query invoeren. En met het DBConnection property kan je naar je TDatabase component verwijzen.

[edit]

Nog maar een editje, het probleem is dus dat alle records naar de client worden overgehaald. Deze staan dus in het lokale geheugen, als je daar dus een mutatie op doet wordt alles op het scherm ook weer geupdate. (Dat is standaard met de datacontrols, er zit wel een optimalisatie in maar het houdt op een gegeven moment op met 25000 records)

Met deze oplossing heb je dus niet alle records aan de client kant, wat het scrollen versneld. (Je ziet de scrollbalk ook groeien als je een paar records verder naar beneden gaat)

Verwijderd

Topicstarter
Aan de vorige post heb ik erg veel gehad, ik gebruik nu een TBDEClientDataset, snelheden zijn nu zoals ik ze verwacht :).
Heb alleen nu een probleem met het posten en daarna het applyUpdates, hier krijg ik een error, en waarom weet ik niet. Dit is mijn procedure die ik aanroep om op te slaan vanuit Insert of Edit mode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.OpslaanButtonClick(Sender: TObject);
begin
      DM.Planning.post;
      DM.Planning.ApplyUpdates(-1);

      OpslaanButton.Enabled:=false;
      AnnuleerButton.Enabled:=false;
      NieuwButton.Enabled:=true;
      WijzigButton.Enabled:=true;
      VerwijderButton.Enabled:=true;
      VolgendeButton.Enabled := true;
      VorigeButton.Enabled :=true;
      DBGrid1.Enabled := true;
end;

Bij het uitvoeren krijg ik dan de volgende fout:

Project ..... raised exception class EDBEngineError with message 'Capability not supported. General SQL Error.
[TCX][MyODBC] Transactions are not enabled'.

Ik kom er maar niet uit hoe ik dit kan oplossen, ik kan nergens iets vinden over een optie voor Transactions, de db is niet readonly en ook niet exclusive. Wat gaat hier mis?

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Ik heb geen ervaring in het werken met ClientDataSets en Cached Updates (vind ze niet lekker werken), maar een transactie kun je zo starten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
try
  TDatabase.StartTransaction();
  // doe wijzigingen in databank
  ...
  // commit de wijzigingen 
  TDatabase.Commit();
except
  // bij eventueler error, maak wijzigingen ongedaan
  on EDatabaseError do begin
    TDatabase.Rollback();
  end;
end;

Tip: gebruik [code]-tags ipv <code>

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik kom er nog steeds niet uit als ik bovenstaande doe krijg ik weer: transactions are not enabled.

Als ik het gewoon met een aparte insert sql query doe werkt alles wel goed. Maar vind ik minder netjes en een het is een hoop extra code.
Pagina: 1