05. august 2004 - 15:29Der 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.)?
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.
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?
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)
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).
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.
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
Hov, glemte lige at sige tak for svar, det er dejligt med en masse tekniske detaljer!
Synes godt om
Ny brugerNybegynder
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.