/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MSSQL 2k] Design af db-udtræk
Fra : Jesper Stocholm


Dato : 06-09-02 08:50

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 :|

 
 
Jens Gyldenkærne Cla~ (06-09-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-09-02 09:39

Jesper Stocholm skrev:

[optimering]

> WHERE t.studie NOT IN ('er','htg','fi','wer') AND t.field2 = 0

Jeg ville bytte om på de to parametre. Jeg er ikke sikker på om det
giver performance, men en "="-operation er langt hurtigere end en
"IN"-operation, så hvis du kan filtrere nogle procent væk før IN-
kaldet kan det godt betale sig.

NOT IN kan ofte erstattes af NOT EXISTS - der også er langt mere
effektiv. Det kan gøres nogenlunde sådan her:

WHERE t.field2 = 0
AND NOT EXISTS (SELECT 'true' FROM studietabel
               WHERE studie IN ('er','htg','fi','wer'))


Jeg kan ikke lige gennemskue hvor meget eller lidt hjælp du får af
dine indeks, men det kan en query-plan afsløre.

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste