Jeg har behov for at skulle optimere udtræk fra nogle tabeller så meget
som muligt.
Mit setup er følgende:
Jeg skal kombinere to tabeller - den ene er ca 7x15000 og den anden er
ca. 7000X25 . Resultatet er pt et recordset på ca. 5000x3.
Først filtrerer jeg tabel 1 - der er en UNIX-passwordfil. Dette filter
anvender et RegExp og returnerer et recordset på ca. 2X10000. Filtret ser
nogenlunde således ud:
SELECT
col001 as Studienr,
RIGHT(Col001, DATALENGTH(Col001) - 1) as pswd_studienr
....
WHERE
col001 LIKE '[cdsu][0-9][0-9][0-9][0-9][0-9][0-9]'
Filtret er lavet til et view.
Dernæst laver jeg et INNER JOIN imellem min tabel 2 og dette view.
Derudover har jeg et par WHERE-conditioner, der fratrækker yderligere
rækker i min tabel 2.
Disse ser nogenlunde således ud:
WHERE t.studie NOT IN ('er','htg','fi','wer') AND t.field2 = 0
Jeg har lavet følgende indexes på mine to tabeller:
Tabel 1 (UNIX-passwordfil)
Index på:
col001 (non-unique, ASC,non-clustered)
Tabel 2
Index på:
Studienr (unique index, ASC,non-clustered)
der lavet et INNER JOIN på denne kolonne
Studie (unique index, ASC,non-clustered)
denne kolonne testes der for i ovenstående "NOT IN ..."
Fornavn (unique index, ASC, non-clustered)
Efternavn (unique index, ASC, non-clustered)
Som jeg ser det, så er et af problemerne, at jeg laver et join på
resultatet af et RegExp-filter i et view. Dette betyder, at jeg ikke kan
sætte et index på den ene kolonne i mit view. Jeg ved blot ikke, hvad jeg
skal/kan gøre ved det. Èn af grundene til at jeg er lidt ude efter at
optimere det mere er, at jeg har oplevet querytider på 10 sekunder ... og
det synes jeg virker som lidt i overkanten. Og endeligt: mit felt
t.field2 fra ovenfor er et bit-felt ... er det korrekt, at man ikke kan
lave index på sådan et felt ?
--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|