Avatar billede conrad Nybegynder
22. november 2007 - 20:16 Der er 6 kommentarer og
1 løsning

Clustered index på SQL 2005

Jeg har fæølgende clustered index

FeltA,FeltB,FeltC. FeltC er primær nogle, men de fleste queries benytter feltA og feltB.

Jeg har fælgende select:

SELECT * FROM MYTABLE WHERE
feltA = 'avalue'
feltC = 'X = enten blank eller et unikt id'// blank hvis der ikke søges efter den unikke record men alle de records som matcher feltA. Dette vil være hovedparten af tilfældene
feltX = 'bæabæa'
feltY = 'blabla'

1. Kan SQL udnytte hele indexet og ligesom springe over feltB ?
2. Hvis 1 ikke er tilfældet, vil det så ikke være mere optimalt at udelade feltC = 'X = enten blank eller unikt id' i de tilfælde hvor X er lig blank?

JEg er meget intereserret i nogle link eller lignende som forklarer det
Avatar billede hrc Mester
22. november 2007 - 22:01 #1
Hvad vil du beskrive med feltX og feltY?

Har du et indeks der indeholder alle tre felter og samtidig sat FeltC til primærnøgle, er det korrekt? Det lyder underligt, for ikke at sige umuligt. FeltC kan i alt fald ikke indeholde tomme/null' felter.

Så, væk med FeltC i indekset. Hvis du heller ikke vil søge på FeltB, kan du ligeså godt bare have et indeks på FeltA.

Hvad forhindrer dig i at have to scripts? De kan evt. pakkes væk i en function?
Avatar billede janus_007 Nybegynder
22. november 2007 - 23:30 #2
Ja det ville jeg også gerne høre.

Og en anden ting... Hvorfor har du valgt et clustered index?


Og jo SQL kan godt "springe" feltB over, den vil lave en filter bagefter - men det er jo ikke videre optimalt.

Du kunne måske også gøre som hrc foreslår, lave dit index så simpelt som muligt! Har du forsøgt dig med indexering med included columns? http://www.mssqltips.com/tip.asp?tip=1078
Avatar billede conrad Nybegynder
23. november 2007 - 06:58 #3
Jeg fik desværre tastet forkert, det beklager jeg meget.

selecten ser således ud

SELECT * FROM MYTABLE WHERE
feltA = 'avalue' AND
feltC != 'X = enten blank eller en unik værdi' AND
feltX = 'bæabæa' AND
feltY = 'blabla'

Det vil sige at i de fleste søgninger vil der stå feltC != null. FeltX og FeltY var blot medtaget for at vise at der er yderligere begrænsinger på selecten.

>>Har du et indeks der indeholder alle tre felter og samtidig sat FeltC til primærnøgle, er det korrekt? Ja

Jeg er interesseret i at vide om det vil være mere optimalt at udelade feltC != 'x' i de tilfælde hvor x = null, hvilket vel egentlig svarer til 2 forskellige queries. Querien er mere tænkt som et eksempel, så det er ikke så interessant at omskrive den, ændre index ect.
Avatar billede janus_007 Nybegynder
23. november 2007 - 12:55 #4
Hvis du bruger en != operator vil du få en full table scan, hvilket vil betyde at dit index er overflødigt.
Jeg ville udelade "!=" og "not in/ like" så vidt muligt som det kan lade sig gøre.

Jeg kan næsten regne ud at det ikke performer som du forventer ;) så hvis du skal guides i en mere konkret retning må du informere lidt mere.

Kunne du evt. vise en showplan? - Lige før du eksekverer dit sql-statement, så udfør denne kommando:
set showplan_all on
Og se tryk F5 :)

(slå den fra igen med off)
Avatar billede kichian Nybegynder
25. november 2007 - 11:31 #5
Der er tale om to forskelle query-plans/strategier, alt efter om FeltC er angivet eller ej.
Hvis FeltC, og ej FeltB, er angivet bør optimiseren benytte det primære indeks. I det generelle tilfælde uden FeltC, bør den benytte det klusterede indeks.
Derfor - Undlad at bruge FeltC != null, hvis feltet ikke er bestemmende. Sammenligningen er overflødig, ressourcekrævende og kan give anledning til at optimiseren vælger en forket søgestrategi.
Avatar billede conrad Nybegynder
27. november 2007 - 13:52 #6
Jeg tror konklusionen er at feltC skal udelades når værdien er null. Lægger i nogle svar?
Avatar billede conrad Nybegynder
05. marts 2012 - 21:59 #7
svar
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