Søger du en specifik kategori?

 



Oprettet tir. d. 10. februar 2009 kl. 19:25

trer
trer (32.597 point)
Guidens karaktér
1
2
3
4
5

MsSQL: Basal performance tuning, part 2

Grundlæggende brug af indeks for bedre performance.
Disse artikler om basal performance tuning er uddrag af en intern anbefaling om SQL som jeg har skrevet til udviklerne på min arbejdsplads, NNIT a/s.

Korrekt brug af indeks er nødvendig for at opnå god performance i en database applikation, men indeks er et tve-ægget sværd - på den ene side øger de hastigheden når data skal ud af basen, og på den anden side sænker de hastigheden når data skal ind i.

Man kan derfor ikke ukritisk smide indeks på ens database, men må overveje hvor de kan gøre gavn.

Det er i øvrigt værd at bemærke, at SQL Server kan traversere et indeks lige godt forfra og bagfra. Der er derfor ikke noget vundet ved at angive et indeks som stigende eller faldende.

Undtagelsen er naturligvis sammensatte indeks med skiftende orden i de enkelte kolonner.

Benyt "Index Tuning Wizard"
Det første og nemmeste er, at man afvikler Query Analyzers indbyggede værktøj, Index Tuning Wizard, med de forskellige queries man skal køre mod databasen.

Det bedste er her, at have en profilertrace der giver et typisk  billede af databasen under brug så ITW har denne at gå ud fra. ITW vil så afvikle tracen med forskellige index-sammensætninger, og efter det fortæller den, indeks der bør tilføjes og hvilke der kan fjernes. ITW kan endda simulere indeks brug ved større data-mængder end der reelt findes i databasen.

Bemærk at såfremt der i større omfang benyttes views kan Index Tuning Wizard give et ret fejlagtigt billede da den ikke opløser views i de underliggende SELECTs.

Benyt ikke Query og Index hints
Undgå at benytte Query/Indeks Hints i produktionssystemer. Korrekt skrevne queries / stored procedures vil vælge det bedste index og join-type udfra de aktu-elle indeks-statistikker og server belastning.

Tvinger man Query Optimizeren til at benytte et bestemt indeks eller join-type vil denne ikke længere kunne vælge den optimale tilgang til data.

I forbindelse med test og udvikling kan det dog være fordelagtigt at benytte in-deks hints til at checke effekten af forskellige index og join typer.

Benyttes Query / Indeks-hints vil man være tvungen til at gen-teste ved hver server og/eller database-opdatering idet selv små ændringer kan påvirke effekten af hints.

Fjern ubrugte indeks
Alle indeks sløver performance på en tabel ved indsættelse og opdatering af data. Såfremt et indeks generelt ikke benyttes af nogen query giver det derfor bedst mening af fjerne det.

Via Query Analyzers Index Tuning Wizard og et profilertrace kan man identificere indeks som muligvis ikke benyttes.

Fjern indeks på små tabeller.
For at benytte en tabel skal der altid læses mindst 1 extent og for at benytte et indeks skal der også altid læses mindst 1 extent. Optimizeren vælger derfor ofte ikke at benytte indeks på tabeller der ligger på 1 til 2 extents i størrelse (ca. 128 KB).

Undlad derfor indeks på små tabeller (men erklær stadig PRIMARY KEY constraints på tabellen af hensyn til mulighed for fremmednøgler og unikke række-identifikation).

Størrelsen på en given tabel kan altid beregnes ud fra forventet antal rækker * række-definitionen. I en database i brug kan størrelsen ses direkte i KB via Enterprise Manager.

Begræns brug af Clustered Index
På en tabel i SQL Server kan der være ét og kun ét clustered index. Typisk vil SQL Server vælge at lægge det på primær nøglen, men der er det sjældent til gavn.

Et clustered index styrer den fysiske orden hvori data lagres - derfor må det ikke bruges på data der opdateres (f.eks. en LastUpdated kolonne). Det skal istedet bruges på kolonner der kun én gang tildeles en værdi (f.eks. en CreatedDate kolonne).

Lægges et clustered index på en kolonne der opdateres skal SQL Server reorganisere data ved hver opdatering, dette er ekstremt tidskrævende sammenlignet med en normal indsættelse.

Man bør forbeholde clustered index til kolonner hvorpå der foretages RANGE-scan, dvs. typisk en BETWEEN operator, eller hvor man ønsker en implicit ORDER BY.

Sammensatte indeks
I visse tilfælde vil det være fordelagtigt at benytte sammensatte indeks (indeks der indeholder flere kolonner) - mens de i andre situationer vil være ufleksible, i forhold til optimeringsplanen.

Brug sammensatte indeks når flere kolonner alle benyttes i betingelser og vil understøttes af indeks. Sammensatte indeks vil ofte fylde mindre og kan gøre at læsning af data extents er unødvendig når indekset dækker de kolonner der indgår i querien.

Query Optimizeren kan kun benytte et sammensat indeks i kolonne-orden - oprettelse af separate indeks giver ofte mere fleksibilitet. Det betyder at et indeks der dækker kolonne A,B og C ikke kan anvendes hvis en WHERE betingelse kun benytter kolonne B.

I SQL Server 7.0 og 2000 kan Query Optimizeren anvende flere indeks i udarbejdelsen af queryplanerne - dermed kan flere enkeltkolonne indeks indgå og sammensatte indeks er knap så nødvendige som på f.eks. Oracle.

Bemærk at sammensatte indeks altid skal opbygges så den kolonne med største spredning af data står først i indekset. Det er kun denne kolonne der benyttes til at afgøre om indeks vil blive brugt eller ej.

Understøt joins med indeks
Alle kolonner der indgår i en JOIN eller WHERE betingelse bør være understøttet af indeks. Vurder om det bør være enkeltkolonne indeks eller sammensatte indeks.

Overvej værdien af indeks.
Indeks er ofte mest anvendelige såfremt der er en rimelig spredning i data. Har man fx. 1.000.000 rækker i en person tabel vil et indeks på personens køn være af begrænset effekt (*).

Spredningen i data på en kolonne kan vises i procent ved nedenstående SQL:

    SELECT CAST(COUNT(DISTINCT [col1]) AS FLOAT) /
    CAST(COUNT(*) AS FLOAT)*100) AS [Spredning]
    FROM [dbo].[mytable]

Hvor [col1] er den kolonne man ønsker at placere indeks på. En grov tommelfin-ger regel siger at spredningen bør være 70% eller højere før indeks er godt.

På historik tabeller og lignende hvorfra data kun sjældent læses men ofte indsæt-tes bør man undlade indeks - evt. kombineret med stored procedures til at opret-te / nedlægge indeks før rapport-
udtræk

*) En sandhed med modifikationer. Hvis man f.eks. kun ønsker at få samtlige mænd ud, vil indekset med ét opslag være i stand til at skære samtlige kvinder fra og vice-versa, og så er indekset rart.

Understøt sorteringer med indeks
Alle kolonner der indgår i implicitte eller eksplicitte sorteringer bør understøttes af indeks.

Implicit er fx. DISTINCT og UNION
Explicit er fx ORDER BY, GROUP BY

Det vil ofte være en fordel ved f.eks. DISTINCT at understøtte hele dataudtrækket med ét indeks.

God fornøjelse
Troels

Skrevet tor. d. 05. februar 2004 kl. 00:32| #1

lomse (19.687 point)
Jamen, for søren da osse, skriv dog lidt mere, om ´hvad det handler om. Man kan jo ikke se det ud fra din overskrift.

Skrevet tor. d. 03. juni 2004 kl. 22:49| #2

net-base.dk (14.851 point)
net-base.dk
Sag lige og ledte efter hvordan kan trak alt data fra 2 tabeller på en gang, så prøvede lige her, men fandt ikke noget, men hvordan skulle jeg også vide hvad det var jeg ville få frem, tam overskrift. Men har ikke gidet at læse teksten

Skrevet tor. d. 17. juni 2004 kl. 12:55| #3

skwat (25.826 point)
smukt og så til de point

Skrevet lør. d. 18. december 2004 kl. 23:10| #4

arne_v (1.016.094 point)
Meget godt beskrevet.

Skrevet søn. d. 19. december 2004 kl. 19:35| #5

driis (61.122 point)
www.driis.dk
God artikel om emnet.

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
14 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   



   




Tips & Tricks fra PC World

Teaser billede

Top 5: Virale YouTube-videoer fra Danmark

Lægger du mærke til de mere eller mindre skjulte reklamebudskaber, når du ser videoer på nettet? Vi har taget et kig på fem utrolige danske videoer, som er blevet virale hit.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan fupper smarte svindlere dig på Facebook

Se hvordan du undgår Facebook-fup i fremtiden.


Nyheder fra Computerworld

Teaser billede

App-udvikling 2.0: Sådan er den perfekte app

ComputerViews: Den værste app-hype er ved at have lagt sig, og nu ser vi konturerne af fremtidens app-design. Men hvordan udnytter man de mobile muligheder optimalt?


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger