Avatar billede ixus Nybegynder
05. august 2004 - 15:29 Der er 7 kommentarer og
1 løsning

C5 SQL 'performance'

Jeg har foretaget nogle målinger på C5 1.8, C5 3.0 native, og C5 3.0 SQL. Og det ser absolut ikke godt for C5 3.0 SQL!

Tiden er blevet taget på nogle 'hjemmelavet' XAL'er - første kørelse er en der læser en ekstern fil, og opdatere LagKart i fire felter.

1.80 : 107,6 sekunder
3.00 : 29,6 s
SQL  : 214,7

En anden kørelse jeg har testet på er en der opdatere LagPris, den læser en prisgruppe, og opdatere en anden prisgruppe for samtlige vare (32000).

1.80 : 23,7 sekunder
3.00 : 18 s
SQL  : 761,7 s !!!

Begge kørsler er kørt 10 gange i træk, og første tid er blevet udeladt i gennemsnittet.

Har jeg 'glemt' noget i min konvertering til SQL? Er det normalt for en SQL version af C5 at være så sindsyg langsom? Den primære grund til vi har købt licens til SQL er for at kunne undgå låsninger på kartoteksniveau, men med den hastighed den arbejder med, kan det snart være ligemeget.

I det hele taget virker SQL'en doven i forhold til native, også de kørsler Navision selv har basket sammen.

PS. Findes der en stor og tung XAL kørsel, som Navision har lavet, og som kan sættes i gang med henblik på tidsmåling (dvs. ingen inputs mv.)?
Avatar billede jasman Nybegynder
05. august 2004 - 17:37 #1
Problemet med Native i forhold til SQL versionen når vi snakker XAL/C5 kernen er den, at kernen ikke kan finde ud af at lave fornuftige joins til SQLdatabasen.

Ligeså snart du har en struktur som f.eks.:

SEARCH kart USING Idx
  WHERE ....
    SEARCH kartb USING Idx
        where kartb.felt == karta.felt
    END
END

Så kan XAL kernen ikke finde ud af at lave en join ud af det.

Typisk ville man i SQL skrive noget i retningen af

SELECT kart.felt,kart.felt1,kart.felt2,kartb.felt1,kartb.felt2,kartb.felt3 from kart,kartb where kart.felt == kartb.felt

men det kan XAL/C5 ikke finde ud af, hvorfor der bliver mange flere database-"trips" for at få de ønskede data, hvor en join måske kan nøjes med et trip som returnerer det ønskede datasæt.
Avatar billede ixus Nybegynder
06. august 2004 - 15:56 #2
Hmm, det er jo lidt af et problem, da jeg går ud fra at den eneste måde at få mere fart på dyret, er at skrive XAL'en om til f.eks. stored procedures?

Et andet spørgsmål vedr. SQL'en, er der nogen bestemt grund til jeg ikke kan 'trace' hvad der sker i C5 SQL'en? Når jeg kører profileren på den, viser den kun nogle cursorfetch osv. og ikke selects, som jeg er vant til. Kan det passe den vælger den første record, og så triller den igennem de resterende ved hjælp af cursors?
Avatar billede Broholm Novice
08. august 2004 - 19:47 #3
Hvad hardware er der på den SQL server? Og hvad laver den ellers? Hvordan ser dine kørsler ud? (Og sig ikke at du ikke har RAID, og at datafilen og logfilen ligger på samme drev)
Avatar billede Broholm Novice
08. august 2004 - 19:52 #4
Til det sidste spørgsmål: Ja, det er DM i client-cursors. Du kan evt. starte den på med -zX for at aktivere tracing...

Evt. kan du starte den op med -zSQL -zLsqldump.txt
Avatar billede ixus Nybegynder
09. august 2004 - 15:45 #5
Logfilen ligger på samme drev som datafilen (det er ikke samme som at den bliver ved med det, hvis vi går i drift med C5 SQL). 2x2 GHz Xeon (DP), 1,5 GB RAM, og RAID 1 til OS og RAID 10 til databaserne, mv. Så vi har hardwaren til at få nogenlunde hastighed ud af SQL'en, men det er jo heller ikke det problemet tyder på at være (mere at C5 ikke bruger SQL'en optimalt).
Avatar billede mariaf Juniormester
10. august 2004 - 23:43 #6
Der er masser af eksempler på at SQL er langsommere end Native - det er derfor man ikke automatisk køber en SQL med til en C5 (ud over prisen, altså).
Kernen i C5 er udviklet til Native - og da der er flere kunder på Native end på SQL, så er fordelen for de fleste.
Avatar billede Broholm Novice
11. august 2004 - 16:34 #7
Det hele bunder i at det er to forskellige opbygninger: C5 Native database er en recordbaseret ISAM database, hvor klienten behandler een record ad gangen. SQL Server er en recordSÆTbaseret database, hvor een kommando kan påvirke mange records.

Broen imellem disse to verdener er cursors. Derfor bruger C5 SQL masser af dem og bruger ikke joins mv., da dette begreb ikke findes i ISAM databaser.

Hvad nu hvis vi ændrer eksemplet foroven til:

SEARCH kart USING Idx
  WHERE ....

    SET kart.x = kart.x*2
    UPDATE kart

    #Prompt()
      ... //Bruger taster data ind
    #PromptAbort

    SEARCH kartb USING Idx
        where kartb.felt == karta.felt

       
    END
END

Hvordan skal dette kunne laves med en JOIN? Kernen oversætter koden til SQL runtime. Derfor bliver 1 SEARCH -> 1 SELECT (og INTRODUCE, FIND og direkte opslag)

Dermed ikke sagt at man ikke kan klemme mere performance ud af det. Der findes masser af eksempler i XAL applikation, som er kodet anderledes og bedre end C5 med henblik på SQL databaser. Dette har INTET med kernen at gøre, da C5 og XAL kernerne er ens (bortset fra et par enkelte kommandoer).

Det første man kan gøre er at minimere antallet af SELECT's. Noget andet er at bruge temporære kartoteker mere, da disse stadig kører i native.

Eksemplet kunne skrives om til (hvis "kart" ikke indeholder at for mange poster):

[Overfør poster fra "kart" til "tmpkart"]
INTRODUCE tmpkart
SEARCH kartb USING Idx ORDER BY felt
    IF tmpkart.felt <> kartb.felt THEN
        FIND tmpkart[Idx == kartb.felt]
    ENDIF
END

Nu er der kun 2 SELECT's til SQL databasen.

-Broholm
Avatar billede ixus Nybegynder
17. august 2004 - 19:17 #8
Hov, glemte lige at sige tak for svar, det er dejligt med en masse tekniske detaljer!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester