Avatar billede pimpf202 Nybegynder
24. juni 2004 - 19:18 Der er 3 kommentarer og
1 løsning

Forståelses problemer med dbcc show_statistics.

Hejsa...

Jeg har et problem med at forstå outputtet fra dbcc show_statistics. Jeg har brug for at vide hvad min density ligger på i mine tabeller (for at finde ud af om det kan betale sig at indexe dem.) Det jeg ikke forstår er som følgende:
Jeg opretter en tabel (postnr), og jeg indsætter en værdi (1000), når jeg så kører følgende kommando:  sp_updatestats    dbcc show_statistics ('postnr','index_post'), så skriver den at density er 1, hvilket må betyde at den er 100 % ?. Hvis jeg så indsætter værdien 2000 & 3000, og gentager kommandoen, så får jeg en density på 0.3333 hvilket må betyder 33 procent ? hvis jeg så sætter værdien 3000 ind 8 gange mere, så skriver den stadigvæk en density på 0.3333 ?? det kan jeg ikke rigtig få til at hænge sammen.
Hvis jeg så tager en produktionstable jeg har, som indeholder 1380 rækker med postnumre (og er rimelig fordelt over de forskellige postnumre vi har i lille danmark, så får jeg en density der hedder 1.2539689E-4. Hvad betyder det ??
På forhånd tak
Avatar billede trer Nybegynder
05. juli 2004 - 20:53 #1
DBCC SHOW_STATISTICS returnerer selectiviteten på et indeks - ikke hvor tæt data ligger.

Selectiviteten er et udtryk for hvor mange gange hver enkelt værdi forekommer i indekset. Et indeks er i nogle sammenhænge uanvendeligt hvis der er mange ens værdier.

For at se density skal du have fat i DBCC SHOWCONTIG - den returnerer information om hvordan data er pakket i de enkelte pages samt fragmenteringen.

Hvis du kigger i BOOKS ONLINE (installeret sammen med din Query Analyzer og Enterprise Manager) kan du se outputtet fra SHOWCONTIG beskrevet.
Avatar billede pimpf202 Nybegynder
06. juli 2004 - 09:19 #2
Det kan godt være at det er mig der blander begreberne lidt sammen. Det som jeg leder efter er det som du beskriver som selectiviteten, og det havde jeg forstået som den værdi sql serveren returnere under feltet "density" når du kører en dbcc show_statistics. Mit problem er så bare at jeg ikke forstå dens output - som jeg har beskrevet i mit første inlæg. Håber du kan hjælpe mig med det.
Avatar billede trer Nybegynder
06. juli 2004 - 21:25 #3
Ah, det var mig der blot fokuserede på ordet Density og derfor var på vildspor.

Selectiviteten er ikke den eneste faktor for om det kan betale sig at indeksere.  Du skal have et par andre ting med, muligvis ved du det allerede, men jeg tillader mig lige at docere lidt :-)

Fx. Du har en tabel der indeholder personer og deres køn - M eller K. Hvis du har behov for at lave en betingelse a la WHERE [køn]='M'  - så er der absolut fordel ved at have et indeks på kolonnen, uanset at det altid vil have en dårlig selectivitet. Indekset giver nemlig serveren mulighed for at smide halvdelen af tabellen væk i et hug.

Dernæst - SQL Server lægger indeks og tabel-data på forskellige extents. Det betyder at såfremt din tabel er mindre end 64 KB (eller 128 - kan ikke helt huske), så fravælger SQL Server normalt at bruge indeks. Det vil nemlig kræve flere fysiske læsninger at få både indeks og data op - og en fysisk læsning er dyrere end at lave et tablescan på sådan en lille tabel.

Jeg har en række artikler i artikelsektionen - MsSQL: Performance tuning, part 1-3 - en af dem handler om performancetuning med indeks. De er på et meget grundlæggende niveau, men kan måske hjælpe.

Mht outputtet fra DBCC SHOW_STATISTICS - jeg har faktisk aldrig brugt den, normalt beregner jeg selv spredningen på følgende vis

select count(distinct col) / count(*) from mintabel

Her vil et resultat omkring 1 sige at der er mange unikke værdier i kolonnen ifht antal rækker - mens et lavt resultat (som 1.2539689E-4) siger at der er meget få unikke værdier ifht antal rækker. Fx vil køns-indekset ovenfor normalt kun kunne have unikke 2 værdier for køn uanset antal rækker.

Jeg vil tro at det underlige output du ser hænger sammen med, at DBCC kommandoen kun kigger på statistikkerne - og de opdateres ikke ved hver indsættelse af data. Du kan prøve at køre en UPDATE STATISTICS på din tabel efter hver indsættelse.
Avatar billede pimpf202 Nybegynder
07. juli 2004 - 23:11 #4
Mange tak for dit svar, det var lige noget i den retning jeg havde brug for..
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
Computerworld tilbyder specialiserede kurser i database-management

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