Åbne poster

Her er der mulighed for at komme med forslag til forbedringer til Saldi

Redaktører: Agerskov, Peter Rude, Sarah Aagaard

Besvar
Tony
Indlæg: 26
Tilmeldt: tors apr 26, 2012 1:47 pm

Åbne poster

Indlæg af Tony »

Sad og irriterede mig over at rapporten over åbne poster hurtigt bliver ret langsom..

Den er heller ikke super smart konstrueret - men der kan gøres noget, uden at ændre i koden...

Strukturen er, at der først dannes en liste over ALLE kunder - uanset om der er nuværende eller tidligere poster vedr. denne kunde.. I sig selv ikke slemt, da dette er lynhurtigt i SQL.

Men denne liste bliver brugt til at lave en forespørgsel - en på HVER kunde. Og i denne forespørgsel løbes ALLE åbne poster (også dem der er udlignet) igennem - og der selekteres selvfølgelig på den enkelte kunde.

Kort udregning på tallene: Har du en kundedatabase med 5000 kunder - og du i alt har skrevet 1000 regninger til 100 af disse kunder (10 regninger pr. aktive kunde i snit) - dette er ikke usandsynligt. Det giver 2000 (lidt under, hvis nogle fakturaer ikke er betalt) rækker i "openpost" - som løbes igennem 5000 gange - i alt 10 millioner gennemløb - Det tager tid!!

Havde vi i stedet løbet gennem openpost (2000 linjer), og lavet en order by kunde, så kan vi klare os med et gennemløb..

Nå pyt, sådan gør vi ikke - men vi kan gøre noget der hjælper voldsomt:

Lav et index på tabellen"openpost" - feltet "konto_id".

Nu vil du godt nok stadig have 5000 gennemløb, men de 4900 (der ikke er aktive kunder) vil være ekstremt hurtige (1999 linjer sparet - pr styk), og der hvor der er aktive kunder, der kører forespørgslerne også væsentligt hurtigere...

Der kan overvejes at lave et "multiple_column" index på "faktnr,amount" - det vil hjælpe hvis du har kunder med rigtigt mange handler.. (Der laves en order by på disse, jeg kan dog ikke lige regne ud hvor det gør en forskel af denne order by laves - så måske skal man bare droppe den i koden???

@Peter: kan du se en grund til denne order by?? Og skal man ikke opdatere installationen til at lave index på kunde_id i openpost tabellen??
Tony
Indlæg: 26
Tilmeldt: tors apr 26, 2012 1:47 pm

Re: Åbne poster

Indlæg af Tony »

Fik lige set på "Regnskab"...

Det er samme princip, først laves oversigt over kontoplan, og derefter en query der løber alle transaktioner igennem... det bliver nemt langsomt..

For mig tog det ca. 3.5 sekund at lave disse SQL forespørgsler, ved at tilføje et index på "transaktion" - "kontonr" kom jeg på ca. 0,6 sekund...

(og ved at fjerne order by transdate - som jeg heller ikke her kan gennmskue bliver brugt - så kom jeg til 0,5 sekund)
Tony
Indlæg: 26
Tilmeldt: tors apr 26, 2012 1:47 pm

Re: Åbne poster

Indlæg af Tony »

Tony skrev: Den er heller ikke super smart konstrueret - men der kan gøres noget, uden at ændre i koden...
Nu besluttede jeg mig så for at lege lidt med koden.
Mit konkrete eksempel har 723 debitorer, 1420 openpost linier, og 113 adresse med en åben saldo (kun 2 kreditorer)... og de har 355 åbne poster

Det tog ca. 4,2 sekunder at køre rapporten...

Så tilføjede som omtalt ovenfor index på tabellen"openpost" - feltet "konto_id".

Så tog den ca. 1,5 sekund...

Jeg var stadig ikke tilfreds (dels fordi den stadig skalerer skidt, dels fordi man stadig liiige skulle vente på at den fik fyldt rapporten - havde næsten været bedre hvis listen blev genereret INDEN den begyndte at loade)...

Så derfor ændrede jeg lidt i koden... Jeg løb gennem openpost for at få en liste over kunder med en saldo:

Kode: Vælg alt

        $op=db_select("SELECT distinct konto_id FROM openpost WHERE udlignet = 0 order by konto_id",__FILE__ . " linje " . __LINE__);
        $kop = array();
        while ($kunderaekke = db_fetch_array($op)) {
          $kop[] = $kunderaekke['konto_id'];
        }
        $koplist = implode(',', $kop);
Og derefter ændrede jeg i genereringen af debitorer (som jo bruges i den løkke der køres for hver kunde:

Kode: Vælg alt

 else $tekst = "select * from adresser where art = '$kontoart' order by firmanavn";
Til:

Kode: Vælg alt

 else $tekst = "select * from adresser where art = '$kontoart' and id in ($koplist) order by firmanavn";
Så kører den på 0,5 sekund - hvilket i min verden er næsten øjeblikkeligt... Og skalering er nu helt anderledes... Der er nu kun tale om 111 gennemløb af openpost tabellen...
(index på "openpost"-"konto_id" er stadig meget gavnligt...)

Jeg kan stadig ikke helt gennemskue order by faktnr,amount, og hvorfor den skulle være desc når det er oversigt over åbne kreditorposter????
Besvar