meltedmoon Novice
18. april 2004 - 22:45 Der er 3 kommentarer

Optimering af SQL sætning

Er der nogen der har nogle forslag til hvordan man kunne performance-optimere disse SQL sætninger i stored procedures, så de ikke sluger så meget cpu når der er rush på? Vil helst gerne af med de 2 interne select-sætninger hvis det kan lade sig gøre... eller i det mindste kunne genbruge dem på en eller anden måde, da de er tæt på at være ens.

Den første:

SELECT @iNumChallWon=count(ChallengeID)
FROM Challenges
WHERE ID2Accept = 1
AND EndDate < getdate()
AND (ID1 = @CarId
AND ID1Votes > ID2Votes)
OR (ID2 = @CarId
AND ID2Votes > ID1Votes)
AND challenges.ID1 IN
(SELECT gallerier.ID
FROM gallerier
WHERE gallerier.aktiv = 1
AND gallerier.acceptVote = 1)
AND challenges.ID2 IN
(SELECT gallerier.ID
FROM gallerier
WHERE gallerier.aktiv = 1
AND gallerier.acceptVote = 1)

Den anden:

SELECT @iNumChallWon=count(ChallengeID)
FROM Challenges
WHERE ID2Accept = 1
AND EndDate < getdate()
AND (
(ID1Votes > ID2Votes
AND challenges.ID1 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1 AND userID = @UserSeesion)
AND challenges.ID2 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1))
OR
(ID2Votes > ID1Votes
AND challenges.ID2 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1 AND userID = @UserSeesion)
AND challenges.ID1 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1))
)
trer Nybegynder
18. april 2004 - 23:02 #1
De queries er ikke nemme at tune da du bruger både "større end", "mindre end"  og "OR" samt IN.

Du kan checke artikelsektionen, der har jeg en række artikler om hvordan man tuner sin sql, og hvad man skal passe på med.

Grundlæggende med ovenstående:
Undgå brugen af IN () - brug i stedet EXISTS ()
Sørg for non-clustered indeks på alle kolonner som indgår i where betingelser og join kriterier.
Sørg for non-clustered indeks på kolonner som du laver COUNT på.


Hvis fx ENDDATE kolonnerne altid udfyldes ved INSERT og ikke senere opdateres, så er det en god kandidat til en clustered indeks - ellers non-clustered.

Du kan også prøve at starte INDEKS TUNING WIZARD - den finder du i Query Analyzer. Du fjerner lige variablerne (indsæt konstant for @USERSESSION og fjern ref til @iNumChallWon) og kører queryen via ITW og ser hvad den foreslår.

Men vær forsigtig med ITW - den tuner så KUN efter den ene query, så tag dens forslag med et gran salt og lav ikke et CLUSTERED indeks på en kolonne hvor værdien ændres selvom ITW foreslår det.
meltedmoon Novice
19. april 2004 - 21:15 #2
Jeg har fået på fornemmelsen at det ville hjælpe meget at indexere nogle af mine tabelfelter, men jeg er ikke helt med på hvordan man egentlig gør det. Har du mulighed for at skrive hvordan man gør rent praktiskt punkt for punkt? Synes nemlig det virker ret forvirrende.
trer Nybegynder
19. april 2004 - 22:10 #3
Der er ikke noget trylleri involveret. Nemmest at forklare er hvordan du skriver et indeks i rå sql - men du kan også oprette indeks via Enterprise Manager.

Men i SQL syntax:

create index [mytable_myindex] on [mytable] (column,,,,)

dvs hvis du skal have et indeks på aktiv i tabellen gallerier kan du gøre således

create index [ix_gallerier_aktiv] on [gallerier](aktiv)

Du kan godt samle flere kolonner i et enkelt indeks - men det er ikke altid det er en fordel, og det er altid en vurdering hvilken kolonne der skal først.

create index [ix_gallerier_aktivaccept] on [gallerier](aktiv,acceptvote)

Jeg vil igen henvise til mine artikler om indeks i artikel sektionen - der er det lidt mere uddybende forklaret.

Husk at jo flere indeks, jo mere belastning af server ved indsættelse / opdatering - altså ikke flere indeks end du har behov for.
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

Opret Preview

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





Premium
Test: Huaweis Matebook X er særlig laptop med en svaghed, som du skal være opmærksom på
Huawei beviser endnu en gang, at de sagtens kan mingle sig med de bedste pc-producenter. Men alligevel skyder selskabet lidt ved siden af, med sin nyeste maskine.
Computerworld
Bitcoinen nåede lige at kulminere igen – men så kom krakket
Der blev sat en ny rekord for bitcoinens værdi i år – men godt 24 timer efter blev der høvlet næsten 20.000 kroner af den.
CIO
Podcast: Her er seks gode råd om ledelse og digitalisering fra danske top-CIO'er
The Digital Edge: Vi har talt med 17 af Danmarks dygtigste digitale ledere - og samlet deres seks bedste råd om digitalisering og ledelse. Få alle rådene på 26 minutter i denne episode af podcasten The Digital Edge.
Job & Karriere
Se Waoos forklaring: Derfor har selskabet fyret topchef Jørgen Stensgaard med omgående virkning
Waaos bestyrelse opsiger fiberselskabets topchef, Jørgen Stensgaard, der fratræder med omgående virkning. Se hele forklaringen fra Waao her.
White paper
Sådan øger du medarbejdertilfredshed og produktivitet
En af de mest effektive måder at øge medarbejdernes produktivitet og tilfredshed med arbejdspladsen er ved at give frit valg mellem Windows eller Mac, når der skal vælges arbejdscomputer. Samtidig mindskes presset på supporten, mens sikkerhedsniveauet højnes. Med en client-as-a-service aftale kan du lade medarbejderne selv træffe valget, men uden at uden at det behøver at være udfordrende eller ressourcekrævende for virksomheden. Eksempelvis kan du lade partneren håndtere alt fra finansiering, leverance, klargøring og implementering til support og lifecycle-management. Læs mere i denne hvidbog.