Avatar billede melted Nybegynder
27. maj 2004 - 21:28 Der er 9 kommentarer

Hjælp til optimering af disse SQL sætninger

Jeg har for lang tid siden lavet noget SQL sætninger, som egentlig er meget u-optimerede. Derfor kunne jeg godt tænke mig at få nogle forslag fra nogle SQL-hajer, om hvordan jeg kan strikke nedenstående sætninger sammen, således at der kommer de samme ting ud af dem - bare meget mere performance-optimeret.

Her er de djævelske sætninger:

1)
"SELECT challengeID from challenges challenges inner join gallerier g1 on challenges.id1 = g1.id and g1.acceptvote=1 and g1.aktiv=1 AND NOT g1.userID = " & thisUserID & " inner join gallerier g2 on challenges.id2 = g2.id and g2.acceptvote=1 and g2.aktiv=1 AND NOT g2.userID = " & thisUserID & " where challenges.id2accept=1 and challenges.active=1 and challenges.EndDate > getdate() AND challengeID NOT IN (SELECT challengeID from challenges_usersVoted where challenges.challengeID = challenges_usersVoted.challengeID AND userID = " & thisUserID & ")" & nextOrder



2)
SELECT count(ChallengeID) FROM Challenges WHERE ID2Accept = 1 AND EndDate < getdate() AND ID1Votes <> ID2Votes AND ((ID1 = " & thisID & " AND ID1Votes > ID2Votes AND challenges.ID2 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND gallerier.acceptVote = 1)) OR (ID2 = " & thisID & " AND ID2Votes > ID1Votes AND challenges.ID1 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND gallerier.acceptVote = 1)))


3)
SELECT count(ChallengeID) FROM Challenges WHERE ID2Accept = 1 AND EndDate < getdate() AND ((ID1Votes > ID2Votes AND challenges.ID1 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1 AND userID = " &  session("UserID") & ")) OR (ID2Votes > ID1Votes AND challenges.ID2 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1 AND userID = " &  session("UserID") & "))) AND challenges.ID2 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1) AND challenges.ID1 IN (SELECT gallerier.ID FROM gallerier WHERE gallerier.aktiv = 1 AND acceptVote = 1)


Håber der er en haj der har styr nok på det og kan hjælpe :)
Avatar billede trer Nybegynder
27. maj 2004 - 23:33 #1
Prøv at læse de artikler jeg har skrevet om sql-performance tuning i artikelsektionen. Det giver dig grundlaget for at få sql'en optimeret.
Avatar billede melted Nybegynder
27. maj 2004 - 23:37 #2
Jeg vil hellere have noget her-og-nu hjælp...
Avatar billede skwat Praktikant
29. maj 2004 - 01:06 #3
Start med at lav dem om til stored procedures
Avatar billede trer Nybegynder
29. maj 2004 - 10:19 #4
Og læg indeks på alle kolonner du joiner på eller har where betingelser på.
Avatar billede melted Nybegynder
29. maj 2004 - 10:28 #5
Der er skam index på de kolonner og selv hvis jeg skal lave dem om til stored procedures, er jeg helt sikker på de kan optimeres ved skrive det meste om.
Avatar billede trer Nybegynder
29. maj 2004 - 11:20 #6
hmmm... jeg synes jeg har set dine sql'er før på eksperten, og mener også at jeg gav samme råd sidst; men skidt: Det er begrænset hvad du kan gøre med optimering når du benytter OR samt > og <. Det gør nemlig at indeks har begrænset virkning.

Du kan vinde lidt ved at skrive IN () statements om til EXISTS () - derved spares en implicit sortering.

Du skal prefixe samtlige tabeller med ejer  (typisk er ejeren dbo, så skal du altså bruge dbo.Challenges fremfor Challenges).

Men en generel omskrivning af sql'en kræver faktisk at man får forklaret hvad den skal gøre, præcist, hvad grundlaget er for de joins etc du har med, samt får et diagram over databasen.

Lidt hjælp er der - i Query Analyzer kan "Show Execution Plan" anvendes til at sammenligne effektiviteten forskellige SQL'er, det fungerer rigtig fint.

En anden ting; Hvis dine sql'er skal kaldes meget tit og data i de underliggende tabeller ændres meget sjældent kan du lagre SQL'erne som materialiserede views.

Et sådan view lagrer data fortolket så det er ekstremt hurtigt til udtræk. Prisen betaler man når man indsætter i tabellerne som viewet bruger - så skal hele viewet og samtlige data genfortolkes.
Avatar billede trer Nybegynder
29. maj 2004 - 11:25 #7
Oups: Materialiserede views er et Oracle udtryk - på SQL Server kaldes det "Indekserede views".  Du kan læse om kravene i Books Online under "Indexed views" og vurdere om din applikation / database kan acceptere de krav der stilles for at anvende indekserede views.
Avatar billede melted Nybegynder
29. maj 2004 - 14:18 #8
Jeg har også haft SQL sætningerne herinde før... Der skete bare ikke så meget sidst.

Du siger at hvis man bruger indexerede views, skal data genfortolkes når man indsætter i tabellerne, men er det så kun de kolonner der er indexerede, eller er det hele alle rækkerne der skal genfortolkes?
Avatar billede trer Nybegynder
30. maj 2004 - 01:45 #9
Et indekseret view kopierer reelt set de data viewet viser over i en skjult tabel - men jeg ved ikke hvor smart den kopiering foregår; om det er samtlige data der genkopieres eller om den kan "nøjes" med at kopiere de ændrede... Jeg har simpelthen ingen erfaring på SQL Server hvad det angår.

På Oracle har jeg bl.a. brugt det et sted hvor vi får opdateret data en gang i døgnet. Ovenpå de data ligger nogle views der tager 17-20 sekunder at opløse data (og det er på en stor grim unix boks). Når de materialiseres bliver tilgangstiden pludselig millisekunder - og så gør det ikke noget at det tager 20 sekunder at opdatere deres data en enkelt gang.
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