03. marts 2003 - 05:58Der er
4 kommentarer og 4 løsninger
SELECT eller SELECT COUNT
Hvad er mest krævende (kræver mest serverkraft)... At lave en almindelig SELECT på et enkelt felt i en kolonne eller at lave en SELECT COUNT på 700-1300 rækker?
Grunden til mit spørgsmål er at jeg i dag laver en SELECT COUNT på 700-1300 rækker, men af performance grunde overvejer jeg at få en stored procedure til hvert 5. minut at tælle antal rækker og smide i en ekstra tabel, for så at hente antallet fra denne tabel. Men kan dette betale sig, er der noget performance at hente her, eller gør jeg det bare endnu værre? Det lyder måske som en lille ubetydelig query, men da denne query bliver kørt 100.000 - 200.000 gange pr. dag, vil jeg gerne gøre det så optimalt som muligt :-)
Det store spørgsmål er jo om du på nuværende tidspunkt har performence-problemer? Hvis ikke, så bør du ikke lave noget om.
På de fleste DB-servere er COUNT(*) optimeret. Så hvis du har et primært-index går det stærkt. Selvfølgelig går det stærkere at læse fra en forudberegnet værdi.
Umiddelbart ville man tror SELECT Count ville tage længere tid da den både SELECTer og tæller sammen. Omvendt er data mængden meget mindre på Count da det er en record frem for en SELECT som giver 700-1300 records.
Men en ting er sikkert brug ikke * i Count da den så tæller på alle kolonner, brug en kolonne og gerne den som er Primary index..
Det afhænger af DBMS'ens optimizer. Generelt så er COUNT(*) eller COUNT (<pirmary key>) det hurtigste hvis der er defineret en unik primary key. Hvis der ikke er et index, så vil de fleste DBMS'er alligevel automatisk holde styr på antallet af rækker. En stored procedure som optæller antallet af rækker, skal køre hvergang tabellen er blevet opdateret, ellers er den ikke præcis. Hvis du kun har få eller ingen opdateringer, så kan det løse et performanceproblem. Men har du overhovedet et performance problem ? Count på 700-1300 rækker lyder ikke af noget særligt ?!?
Performance på er afhængige af om at: 1- din forbindelse er DSN-less eller med DSN. Det er bevidst at DSN-less giver en bedre performance. 2- Hvilket driver man har valgt, den bedste indtil nu er OLEDB 4.0. 3- De antal rækker som du siger ligger mellem 700 - 1300 er intet hverken for en count funktion. (med eller uden index). 4- Enhver funktion formindsker performancen så som Count sum etc. men i store data mængder fx mere end 10.000 rækker. 5- Så er det spm om hardware delen. Nu ved jeg ikke hvor meget betyder de antal gange som du kører selve queryen, men den har jo noget at gøre med hvad skal vi kalde det CPU, og antal bruger.
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.