Avatar billede qqq Nybegynder
03. marts 2003 - 05:58 Der 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 :-)
Avatar billede Slettet bruger
03. marts 2003 - 07:44 #1
Kan du ved lejlighed ikke lukke nogle af dine gamle spm.:
http://www.eksperten.dk/bruger.phtml?sort=%40&order=asc&catid=0&q=&navn=qqq&option=22
Avatar billede kichian Nybegynder
03. marts 2003 - 08:32 #2
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.
Avatar billede mfalck Praktikant
03. marts 2003 - 08:33 #3
ellers kan du overveje at lave SELECT COUNT som et view i databasen.
Avatar billede eagleeye Praktikant
03. marts 2003 - 08:56 #4
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..

"SELECT Count(ID) FROM ..."
Avatar billede mfalck Praktikant
03. marts 2003 - 09:00 #5
eagleeye > det passer ikke hvad du siger - ved en select count(*) erstattes * af et tilfældigt tal og der er ingen performance forbedring.
Avatar billede arnvig Nybegynder
03. marts 2003 - 09:34 #6
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 ?!?
Avatar billede hossein Nybegynder
03. marts 2003 - 23:00 #7
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.
Avatar billede qqq Nybegynder
05. marts 2003 - 06:08 #8
Tak for svarene..
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
Kurser inden for grundlæggende programmering

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