Jeg er pt. i gang med at forsøge en optimering af en form. Formen er ganske simpel. Den inderholde en autogeneret blok, som viser X antal rækker. I form-init, har jeg en #Frm_INDEX(ProjTable) og en efterfølgende #Frm_SEARCH(ProjTable). Ligeså gør formen brug af et filter, som filtere diverse ting fra.
Problemet opstår når jeg opdatere en række i et felt der ikke er indeholdt i indexet. Når jeg forlader linien der er opdateret, begynder C5 at bombardere SQL serveren med forespørgelser.
Update ser således ud:
SQL#1 UPDATE PROJTABLE SET CLOSEPROJECT=? ,LASTCHANGED=? WHERE DATASET=? AND ROWNUMBER=?
Så kommer der en SELECT efterfølgende:
SQL#2 SELECT ROWNUMBER,LASTCHANGED,NUMBER_,SEARCHNAME,CREATED, (...), CLOSEPROJECT FROM PROJTABLE WITH (FASTFIRSTROW) WHERE DATASET=? AND ROWNUMBER=?
Og så begynder C5 ellers med:
SQL#3: SELECT ROWNUMBER,LASTCHANGED,NUMBER_,SEARCHNAME,CREATED, (...), CLOSEPROJECT FROM PROJTABLE WITH (FASTFIRSTROW) WHERE DATASET=? AND (NUMBER_>? ) ORDER BY DATASET,NUMBER_,ROWNUMBER
Det ser ud til at SQL#3 kommer i samme antal som antallet af rækker der bliver vist i skærmbilledet.
Kan man gøre noget ved SQL#3, man skulle mene engang var nok?
Det gør virkelig en forskel at bruge professionel hardware, hvad enten det er til videoproduktion, AI-udvikling eller High Performance Computing.
20. december 2024
Slettet bruger
03. februar 2010 - 20:04#1
SQL#3 bliver, som du har gættet, brugt til at finde/vise linier på skærmen.
Der findes en opstarts parametre der muligvis kan ændre mængden af sql:
-zF<f>,<l> Styrer standard metoden ved fremfinding af data i Forms, <f>, og List-billeder <l>. Begge parametre kan udelades. Følgende værdier er tilladte for <f> og <l>: F: Få første record hurtigst muligt (søger først ==). A: Få alle records hurtigst muligt (søger >=). B: Søger kun én skærmside (blok) ad gangen.
I C5.ini har jeg stående -zFA,A som jeg altid brugt. Jeg har lige så testet de andre varianter, og det gør ingen forskel. SQL serveren bliver stadigvæk bombarderet.
Synes godt om
Slettet bruger
04. februar 2010 - 21:27#3
Du kan jo kode din form via Lookup-triggeren og på den måde selv styre hvilke data der hentes fra serveren.
rahp, ved du om det virker, eller gør nogen forskel på en SQL version?
I øvrigt er det ikke alt der kan lade sig gøre via et index, hvordan vil du f.eks. afgrænse på en beregnet værdi? Det kan umiddelbart ikke løses via index, med mindre man kaster sig ud i en omgang CREIDX.
Lav et databasefelt til værdien, eller smid det hele i et temporært kartotek. Uanset hvad, så er filter og SQL noget, der fungerer meget dårligt.
Synes godt om
Slettet bruger
11. februar 2010 - 22:05#7
Filter virker lige godt (eller dårligt) på SQL og native. Man skal kun benytte filter hvis det er ganske få poster der skal ikke skal vises.
Så der er vel følgende løsninger: 1) Hæld data i et temp-kart 2) Brug CREIDX 3) Lookup-trigger
- og man kan godt have beregnede værdier i index, når blot hvert database felt kun indgår én gang.
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.