Avatar billede pnr Nybegynder
14. september 2004 - 09:29 Der er 10 kommentarer og
2 løsninger

Min søgning tager for lang tid

Jeg har en ret komplex søgning som nogen gange tager så lang tid at jeg får en timeout. Hvordan optimere jeg denne søgning:


SELECT    tblVare.billedeNavn, tblVare.tegningNavn, tblVare.vareId, s1.tekst AS tekst, s2.tekst AS beskrivelse, s3.tekst AS undergruppe
FROM        tblVare INNER JOIN
                      tblSprog s1 ON s1.sprogId = tblVare.tekstSprogId INNER JOIN
                      tblSprog s2 ON s2.sprogId = tblVare.beskrivelseSprogId INNER JOIN
                      tblUnderGrupper ON tblVare.underGruppeId = tblUnderGrupper.underGruppeId INNER JOIN
                      tblSprog s3 ON s3.sprogId = tblUnderGrupper.navnSprogId
WHERE    (s1.sprogKode = 'da') AND (s2.sprogKode = 'da') AND (s3.sprogKode = 'da') AND (s1.tekst LIKE '%skovl%' OR
                      s2.tekst LIKE '%skovl%')
ORDER BY s1.tekst
Avatar billede mountmedia Nybegynder
14. september 2004 - 09:36 #1
Hej du

1. Har du index på de felter spm du joiner med ??
2. Det der taget tiden er dine LIKE statements. Der kan du i stedet anvende FULL-  TEXT SEARCH funktionen.
3. Prøv evt. at køre dit SQL i Query Analyzer, og tjek Execution Planen.
Avatar billede ldanielsen Nybegynder
14. september 2004 - 09:37 #2
Først og fremmest: med indexer. Har du indexeret:

tblSprog.sprogId
tblVare.tekstSprogId
tblVare.beskrivelseSprogId
tblVare.underGruppeId
tblUnderGrupper.navnSprogId
tblVare.underGruppeId
tblUnderGrupper.underGruppeId

En del af disse er nok PRIMARY KEY, og er som sådan allerede indexeret
Avatar billede ldanielsen Nybegynder
14. september 2004 - 09:38 #3
tblSprog.sprogKode skal også indexeres
Avatar billede pnr Nybegynder
14. september 2004 - 09:42 #4
Det der med indexer har jeg ikke rodet med, hvordan gør jeg det, og kan jeg gøre det fra EM?
Avatar billede arne_v Ekspert
14. september 2004 - 10:50 #5
LIKE 'noget%'

er ikke slemt, men

LIKE '%noget%

vil aldrig give god performance
Avatar billede arne_v Ekspert
14. september 2004 - 10:50 #6
Jeg mener bare at du sætter et kryds i EM for at lave index
Avatar billede pnr Nybegynder
14. september 2004 - 10:59 #7
Jeg har prøvet at køre "index tuning wizard" og det hjalp en heldel :-)

Hvis ikke jeg må skrive LIKE '%noget%' hvordan skal jeg så skrive det?
Avatar billede arne_v Ekspert
14. september 2004 - 11:04 #8
Medmindre du vil skifte til full text indexering som er et helt andet koncept,
så er der ikke noget teknisk alternativ.

Men du kan fortælle din chef at enten må brugerne leve med at de skal
angive starten af det de søger efter eller så skal der anskaffes en større
server.

LIKE '%noget%' læser altid alle rækker.
Avatar billede pnr Nybegynder
14. september 2004 - 11:16 #9
Nå man i skal alle have tak for jeres kommentar, smid nogle svar så er der point!
Avatar billede arne_v Ekspert
14. september 2004 - 11:28 #10
hvis jeg fortjener ...
Avatar billede ldanielsen Nybegynder
14. september 2004 - 12:29 #11
Gå i gang med at lave indexer, det kan sætte hastigheden GEVALDIGT i vejret
Avatar billede arne_v Ekspert
14. september 2004 - 12:37 #12
Bare for at pensle det lidt ud:

indexes hjælper på WHERE =

indexes hjælper på ON =

tree indexes (altså ikke hash indexes) hjælper på WHERE LIKE uden start %

index hjælper ikke på WHERE LIKE med start %
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