Results 1 to 15 of 15

Thread: Lastige bug bij een query

  1. #1
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579

    Lastige bug bij een query

    Na het aanmaken van een tabel wordt een eenvoudige select * query uitgevoerd. Hierna klapt mijn programma eruit. Ik heb gekeken of het aantal records te veel is. Dat is niet zo. Idem voor het aantal kolommen. Als ik steeds een aantal kolommen opvraag gaat dat prima. Als ik een paar records opvraag dan gaat dat ook goed. Het totaal in 1 keer gaat niet goed.

    Omdat het programma er zomaar uitklapt zonder melding weet ik niet hoe ik kan debuggen. Ik draai het programma op een pc zonder lazarus.

  2. #2
    En ik neem aan dat je programma op je computer met Lazarus wel goed draait?

    Debuggen wordt dan lastig. Je zou je range-checks, overflow e.d. aan kunnen zetten en kijken of je een fatsoenlijke melding krijgt. Ook kun je showmessages inbouwen om te kijken tot hoever je programma komt en met welke waardes voor specifieke variabele.

  3. #3
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    gegevens wegschrijven naar een Log helpt. Ik heb nu een foutmelding bij een on Exception
    Zie hieronder.

    De query haalt circa 740000 records op met 67 kolommen.

    Code:
    procedure.. 
      Frm_main.Logging.WriteToLogAndFlush('10');
      with DataModule_Waarderen.ZQuery_Woning do
        begin
          Filtered := False;  //Eventueel filter uitzetten
          Frm_Main.DBGrid_Model_Woningen.Enabled := True;
          Close;
          SQL.Clear;
          if Actie = 608 then SQL.Text := Frm_Query_Editor.W_stap_9.Text; --query inlezen
          try
            EnableControls;  //moet voor active anders wordt de dbgrid niet ververst
            Frm_Main.DBGrid_Model_Woningen.Color := clWindow;
            Frm_main.Logging.WriteToLogAndFlush('11');
            Active:=True;
            Frm_main.Logging.WriteToLogAndFlush('12');
            Frm_Main.DBGrid_Woning.DataSource := DataModule_Woning.Ds_Woningen; <--HIER treedt de out of memory melding op
            Frm_main.Logging.WriteToLogAndFlush('13');
            Frm_Main.DBNavigator_Woning.DataSource := DataModule_Woning.Ds_Woningen;
            ...
     except
        on E: Exception do
          begin
            Knopafhandeling_Aan;
            Frm_Main.Visueel.KnopKleur(Actie, True);
            Frm_Main.StatusbarText_0 := 'De query "'+ trim(Naam) + '" is mislukt.';
    
            Frm_Main.Logging.WriteToLog('FOUT      | Uitvoeren query "' + trim(Naam)+ '" is mislukt.');
            Frm_Main.Logging.WriteToLog('FOUT      | Een onverwachte uitzondering heeft plaats gevonden:');
            Frm_Main.Logging.WriteToLog('FOUT      | ' + E.Message);
            Frm_Main.Logging.WriteToLogAndFlush('FOUT      | ');
          end;
      end;

    Log file:

    Code:
    20:32:11 --> |  : 11
    20:32:11 --> |  : 
    20:32:11 --> |  : 12
    20:32:11 --> |  : 
    20:33:01 --> |  : FOUT      | Uitvoeren query "Stap 9" is mislukt.
    20:33:01 --> |  : FOUT      | Een onverwachte uitzondering heeft plaats gevonden:
    20:33:01 --> |  : FOUT      | Out of memory
    20:33:01 --> |  : FOUT      | 
    20:33:01 --> |  : 20

  4. #4
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Ik maak gebruik van ZEOS ZQuery daarbij kan ik FetchRow op bijvoorbeeld 1000 zetten. Echter als je met de navigator op next klikt als je op records 1000 staat dan loop je alsnog tegen de geheugenmelding aan want dan wordt waarschijnlijk de rest alsnog ingeladen.
    Is er een andere oplossing?

    (Ja het zijn absurt veel records om op te halen maar dit is soms nodig).

  5. #5
    Welke versie van Zeoslib gebruik je?

    En FetchRow op 1000? Wat gebeurt er als je die op 10 of 50 zet?

  6. #6
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Ik gebruik zeoslib 7.14. Dat is op sourceforge de meest recente.

    fetch op 1000 werkt prima, maar je kunt niet naar record 1001 want dan wordt alsnog alle records ingeladen en loopt de boel vast.


    is er een nieuwere nog niet vrijgegeven zeoslib?

  7. #7
    Op zich zou 7.1.4 wel goed moeten zijn.
    Er is nog wel 7.2 beta of gewoon de trunk versie.
    Hier een discussie over het feit dat alle records gelijk opgehaald werden ongeacht de FetchRow instelling.

    Maar wat doet ie nu bij jou als je die FetchRow op 20 zet. Hoever kun je dan scrollen. Kom je dan ook ergens pas bij 1000 records in de problemen?

  8. #8
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Ga ik morgen proberen.
    ondertussen gevonden dat er een 7.2 en 7.3 versie in ontwikkeling is. Ook het proberen waard.

  9. #9
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Stel ik zet fetchrow op 20 en klik met de navigator op next dan gaat de dbgrid door naar record 21 etc. Echter als ik in de dbgrid de scrollbar omlaag sleep dan loop ik vast op out of memory.
    Idem als ik last klik in de navigator (maar dat was te verwachten).

  10. #10
    heb je alle kolommen nodig?

    740.000 records is een hoop, maar met de hoeveelheid geheugen van tegenwoordig zou dat ook geen drama moeten opleveren.

  11. #11
    67 kolommen zijn er ook wel heel erg veel (voor een DBGrid).

    Je zou eens kunnen kijken tot hoever je kunt komen met naar beneden scrollen. Dat getal zou je even moeten onthouden. Daarna zou je eens wat minder kolommen kunnen maken en kijken of je verder kunt komen met scrollen. (Je zou ook fetchrow telkens kunnen vergroten, 1000, 5000, 20000, 100000 etc en kijken waar hij stuk gaat)

    Als het echt zo is dat de TDBGrid een limiet heeft en regels "boven" het huidige scherm niet vrij geeft en daardoor "Out of Memory" raakt dan zou je misschien met paginering moeten gaan werken.

  12. #12
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Als ik bijvoorbeeld 10 kolommen opvraag dan worden alle regels opgehaald. Het is dus een combinatie van het aantal regels en het aantal kolommen. Ik kijk of ik deze week het omslag punt kan bepalen.

    Hoe werkt paginering?

  13. #13
    BAM... ja hoor... ik heb het ook.

    Een tabel met 1.476.411 records. Weliswaar geen 67 kolommen (het is een log-bestand) maar als ik met IBExpert Ctrl+End doe in die tabel loop IBExpert ook "Out of Memory" ergens op rij 646.303.

    Als ik in Delphi een TDBGrid Ctrl+End doe krijg ik ook:
    Code:
    Error Class: EOutOfMemory
    Error Message: Out of memory
    Ik gebruik echter altijd filters om in die tabel te zoeken dus het is eigenlijk nooit een probleem maar het is wel duidelijk dat je niet alles weer kunt geven in een TDBGrid uit zo'n grote tabel. Je zult dus of met filters moeten werken of met FIRST en SKIP or ROWS paginering in moeten bouwen.
    Code:
    SELECT FIRST x [SKIP y] ... [rest of query]
    Code:
    SELECT <columns> FROM ...
       [WHERE ...]
       [ORDER BY ...]
       ROWS <m> [TO <n>]
    
    <columns>  ::=  The usual output column specifications.
    <m>, <n>   ::=  Any expression evaluating to an integer.

  14. #14
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Met filtering heb ik al eens zitten spelen. Het nadeel was dat het ophalen van gegevens bij grote tabellen lang duurde. Welicht eens goed googelen.
    Een andere mogelijkheid die mij nog te binnen schoot is om eens lazarus 64 bits te gebruiken.

  15. #15
    64bit zou je nog kunnen proberen maar hoe dan ook zul je ook daar ooit tegen een grens lopen. Je kunt je natuurlijk beter afvragen of je zo'n grote dataset wel in je dbgrid moet laten zien. Wie gaat daar met pagedown helemaal doorheen scrollen. Ik open dat log-scherm ook wel eens maar dan worden alleen de eerste x records ingeladen (altijd de laatste zichtbaar). Ik doe nooit Ctrl+End maar gebruik edit velden boven het grid om een filter op te geven. In de OnExit van die velden pas ik de oorspronkelijke SQL aan en heropen de tabel (gefilterd).

    Dat het even duurt om de gegevens van zo'n tabel op te halen kan ook aan je indexen liggen. Overigens is dan een Ctrl+End ook een langdurige zaak want dan moeten de gegevens van 750.000 records opgehaald worden. Als je dus een WHERE gebruikt dan is dat altijd sneller dan alles inladen (omdat het dan server-side gefilterd wordt).

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •