Avatar billede tblaster Nybegynder
25. april 2006 - 16:58 Der er 4 kommentarer og
1 løsning

Optimer sql udtryk

Hejsa

Er der nogen der kan optimer følgende sql udtryk for mig. Den er ekstrem langsom til at lave forespørgelsen:

SELECT *
FROM (

SELECT D.Tekst AS Tekst, D.ID AS ID, D.Score / D.Stemmer AS Point
FROM DATA d
WHERE d.id NOT
IN (

SELECT dataid
FROM log
WHERE nr = '32124'
)
AND LENGTH( d.Tekst ) <160
AND (
D.ParentID =0
OR D.ParentID =15
OR D.ParentID =16
OR D.ParentID =32
OR D.ParentID =34
OR D.ParentID =35
OR D.ParentID =36
OR D.ParentID =37
OR D.ParentID =38
OR D.ParentID =39
OR D.ParentID =40
OR D.ParentID =42
OR D.ParentID =45
OR D.ParentID =46
OR D.ParentID =47
OR D.ParentID =49
OR D.ParentID =50
OR D.ParentID =51
OR D.ParentID =52
OR D.ParentID =53
OR D.ParentID =55
OR D.ParentID =57
OR D.ParentID =58
OR D.ParentID =202
OR D.ParentID =213
OR D.ParentID =214
OR D.ParentID =284
OR D.ParentID =285
OR D.ParentID =286
OR D.ParentID =287
OR D.ParentID =288
OR D.ParentID =671
OR D.ParentID =688
OR D.ParentID =721
OR D.ParentID =17
OR D.ParentID =18
OR D.ParentID =19
OR D.ParentID =20
OR D.ParentID =21
OR D.ParentID =22
OR D.ParentID =23
OR D.ParentID =24
OR D.ParentID =203
OR D.ParentID =204
OR D.ParentID =205
OR D.ParentID =206
OR D.ParentID =207
OR D.ParentID =208
OR D.ParentID =209
OR D.ParentID =210
OR D.ParentID =211
OR D.ParentID =212
OR D.ParentID =762
OR D.ParentID =13
)
ORDER BY rand( )
LIMIT 50
) AS temptabel
ORDER BY Point DESC
LIMIT 0 , 30
Avatar billede arne_v Ekspert
25. april 2006 - 17:01 #1
det hjaelper naeppe paa performance men du kunne erstatte alle de OR's med en IN
Avatar billede arne_v Ekspert
25. april 2006 - 17:06 #2
jeg antager at det er fordi log tabellen er stor og brugen af ORDER BY rand()
at den koerer langsomt

men jeg kan ikke lige umiddelbart se nogle smarte omskrivninger - skal de vaere
helt random ?
Avatar billede tblaster Nybegynder
25. april 2006 - 17:13 #3
Log tabellen indeholder kun 1288 poster. Data tabellen indeholder derimod næste 36.000 poster. Men når der er trukket ud på ParentID og længde så er det nok < 1000 poster det drejer sig om.

Og ja, jeg vil meget gerne have at det trækkes ud pr. random.

Det skal siges at det førhen har kørt meget godt, da log tabellen ikke var så fyldt. Kan det godt nok være fordi den har kun lidt over 1200 poster?
Avatar billede kjulius Novice
25. april 2006 - 20:54 #4
Jeg ved ikke, om det her er rigtigt, eller om det er mere effektivt, men her er mit forslag:

SELECT *
FROM (

SELECT D.Tekst AS Tekst, D.ID AS ID, D.Score / D.Stemmer AS Point
FROM DATA d LEFT JOIN log ON d.id = log.dataid AND log.nr = '32124'
WHERE log.dataid IS NULL
AND LENGTH( d.Tekst ) <160
AND D.ParentID IN (0, 15, 16, 32, 34, 35, 36, 37, 38, 39, 40, 42, 45, 46, 47, 49, 50, 51, 52, 53, 55, 57, 58, 202, 213, 214, 284, 285, 286,
287, 288, 671, 688, 721, 17, 18, 19, 20, 21, 22, 23, 24, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 762, 13)
ORDER BY rand( )
LIMIT 50
) AS temptabel

ORDER BY Point DESC
LIMIT 0 , 30
Avatar billede tblaster Nybegynder
19. august 2006 - 12:25 #5
Lukker. Valgte at optimer databasen istedet for!
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