Avatar billede pnr Nybegynder
07. juni 2005 - 06:27 Der er 6 kommentarer og
2 løsninger

Hjælp til optimering af sql-sætning

Jeg har en rimlig lang sql-sætning som på nogle søge ord får en timeout... Jeg har lidt på fornemelsen at den godt kunne skrives så den performere bedre, nogen der kan hjælpe?

SELECT DISTINCT
                      beskrivelse.vaerdie, beskrivelse.produktId, specifikationsData.benaevnelse, beskrivelse.specId, produkt.underkatId, specifikation.raekkefoelge
FROM        produkt INNER JOIN
                      beskrivelse ON produkt.produktId = beskrivelse.produktId INNER JOIN
                      specifikation ON beskrivelse.specId = specifikation.specId INNER JOIN
                      specifikationsData ON specifikation.specId = specifikationsData.specId INNER JOIN
                      underKatSpec ON produkt.underkatId = underKatSpec.underkatId AND specifikationsData.specId = underKatSpec.specId
WHERE    (underKatSpec.medtagesIOversigt = 1) AND (beskrivelse.specId IN
                          (SELECT    specifikation.specId
                            FROM          underKatSpec INNER JOIN
                                                  specifikation ON underKatSpec.specId = specifikation.specId INNER JOIN
                                                  specifikationsData ON specifikation.specId = specifikationsData.specId
                            WHERE      (underKatSpec.medtagesIOversigt = 1) AND underkatId IN
                                                      (SELECT DISTINCT produkt.underkatId
                                                        FROM          hovedkategoriData INNER JOIN
                                                                                underkategori ON hovedkategoriData.hovedkatId = underkategori.hovedkatId INNER JOIN
                                                                                underkategoriData ON underkategori.underkatId = underkategoriData.underkatId INNER JOIN
                                                                                produkt ON underkategoriData.underkatId = produkt.underkatId INNER JOIN
                                                                                produktData ON produkt.produktId = produktData.produktId
                                                        WHERE      (produktData.aktiv = 1) AND (produktData.navn LIKE '%lift%') AND (hovedkategoriData.aktiv = 1) OR
                                                                                (produktData.aktiv = 1) AND (underkategoriData.aktiv = 1) AND (underkategoriData.navn LIKE '%lift%') AND
                                                                                (hovedkategoriData.aktiv = 1)))) AND (beskrivelse.produktId IN
                          (SELECT DISTINCT produkt.produktId
                            FROM          hovedkategoriData INNER JOIN
                                                  underkategori ON hovedkategoriData.hovedkatId = underkategori.hovedkatId INNER JOIN
                                                  underkategoriData ON underkategori.underkatId = underkategoriData.underkatId INNER JOIN
                                                  produkt ON underkategoriData.underkatId = produkt.underkatId INNER JOIN
                                                  produktData ON produkt.produktId = produktData.produktId
                            WHERE      (produktData.aktiv = 1) AND (produktData.navn LIKE '%lift%') AND (hovedkategoriData.aktiv = 1) OR
                                                  (produktData.aktiv = 1) AND (underkategoriData.aktiv = 1) AND (underkategoriData.navn LIKE '%lift%') AND (hovedkategoriData.aktiv = 1)))
ORDER BY specifikation.raekkefoelge
Avatar billede dr_chaos Nybegynder
07. juni 2005 - 07:41 #1
jeg tror det er nemmere hvis du laver en beskrivelse af hvilke tabeller du har og hvad dit mål med sql sætningen er.
Avatar billede pnr Nybegynder
07. juni 2005 - 10:31 #2
Nå men så må jeg jo til den helt store forklaring :-)

Mit database diagram ligger her: http://test.ibil.dk/db.gif

Det jeg laver er en fritekst søgning på eksempelvis %lift% der skal søges i følgende kolonner: hovedkategoridata.navn, underkategoridata.navn produktdata.navn og beskrivelse.vaerdie

De fundne resultater skal være ative of det skal deres hovedgruppe også være, og til sidst skal underkatspec.medtagesIOversigt også være true for de specifikationer der skal retuneres.
Avatar billede dr_chaos Nybegynder
07. juni 2005 - 11:53 #3
prøv med:
kunne du lave en række enkelt stående sql sætninger også benytte union imellem dem ?
Alle de inner joins bliver jo meget forvirrende.
Avatar billede dr_chaos Nybegynder
07. juni 2005 - 12:02 #4
altså noget med:
SELECT * FROM hovedkategoridata WHERE  hovedkategoridata.navn LIKE '%lift%' AND hovedkategoriData.aktiv = 1
UNION
SELECT * FROM  underkategoridata underkategori ON hovedkategoriData.hovedkatId = underkategori.hovedkatId INNER JOIN underkategoriData ON underkategori.underkatId = underkategoriData.underkatId WHERE underkategoriData.navn LIKE '%lift%' AND hovedkategoriData.aktiv = 1
Avatar billede dr_chaos Nybegynder
07. juni 2005 - 12:02 #5
Så du kører nogle enkelte sql sætninger og laver en union imellem dem
Avatar billede pnr Nybegynder
09. juni 2005 - 06:33 #6
Efter at have "nulleret" med sql-serveren og indexeret lidt hist og her køre min sql sætning super godt :-)

dr chaos: du får tak for dine kommetare, smid et svar så får du 10 point som tak for din indsats, hvis det er ok ?
Avatar billede dr_chaos Nybegynder
12. juni 2005 - 22:35 #7
det er helt fint :)
Avatar billede pnr Nybegynder
14. juni 2005 - 08:27 #8
:-)
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