Avatar billede splatter Nybegynder
16. august 2001 - 22:31 Der er 7 kommentarer og
1 løsning

Optimering af kode/metode

Okay jeg har et (synes jeg selv) rimeligt langt spørgsmål... here goes...

Jeg er ved at skulle optimere på noget SQL / PL/SQL kode, og da jeg stort set ikke kender så meget til Oracle og dermed PL/SQL er jeg lidt i tvivl om hvilke muligheder jeg har...

Mit problem er at jeg har en tabel med eksempelvis ca. 6 millioner rækker hvor den ene af kolonnerne består af et tal (IP adresse) Jeg vil gerne behandle samtlige \"records\" med samme IP adresse med noget kode jeg har.
Lige nu foregår denne udvælgelse ved at der først konstrueres en cursor (hvis man kan sige sådan) indeholdende en række for hver unik forekomst af en IP adresse (\"SELECT DISTINCT... osv)
Herefter benyttes rækkerne fra denne cursor som WHERE betingelse (i en SELECT statement) til at danne en ny cursor kun med alle de rækker som indeholder noget med den pågældende IP. Således loop\'es der igennem for hver IP adresse.
Problemet er så at det tager enormt lang tid at foretage dette. Og jeg er ret sikker på at det er min SELECT nr 2 her som tager meget lang tid, da den jo skal piske samtlige 6 millioner rækker igennem for hver unik IP adresse.

Hvordan gøres dette hurtigere? (der er lavet index osv på IP kolonnen)

Jeg har en ide om at IP kolonnen skal sorteres f.eks stigende og at man dermed ikke er nødt til at løbe alle rækker igennem hver gang, men bare kan stoppe hver gang man når en ny IP... (dette ville også spare SELECT distinct tingen...)
Sorteringen af kolonnen kan jeg have ordnet allerede inden indsættelse i basen hvis det skal være, men hvordan får jeg skrevet noget PL/SQL kode som kan lave mit her ønskede gennemløb, som skal resultere i at man for hvert gennemløb får et \"recordset\" med alle ens IP adresser som man så kan udsætte for et indre loop... herefter næste recordset med IP adresser osv....

Jeg håber ikke at dette blev alt for kludret, selvom jeg godt kan se jeg har gentaget mig selv nogle gange osv.

På forhånd tak for hjælpen (og sig endelig til hvis jeg skal forsøge at forklare dele af dette bedre/ mere specifikt)
Avatar billede tmceu Praktikant
16. august 2001 - 23:28 #1
Jeg er ikke helt sikker på at jeg har forstået det korrekt, men jeg prøver lige alligevel :-)

Du har en tabel med en række ip adresser, og for hver ip adresse skal den foretage en yderligere analyse af alle poster med samme ip adresse ?

Jeg bruger normalt cursors uden de store bekymringer, men du har ret, det koster alt fra næsten ingenting til meget i performance. Er den kode du skal have kørt for hver ip adresse (indre løkke) ren SQL ?
Avatar billede splatter Nybegynder
17. august 2001 - 00:01 #2
Du har forstået det korrekt... og den indre løkke er ren PL/SQL
Og performance er meget dårlig, og det er den ydre løkke der koster meget. Det eneste der sker i den indre er at der bliver pillet nogle oplysninger ud fra de poster med samme IP og sat ind i to andre tabeller (og umiddelbart kan jeg ikke se at der er så meget at ændre her..)
Problemet er at processen tager adskillige timer ved f.eks \"bare\" 6 millioner rækker.
Avatar billede tmceu Praktikant
17. august 2001 - 00:04 #3
Jeg har et par ideer i ærmet, men skal bare i seng, ellers er jeg helt smadret igen i morgen tidlig :-) Vender tilbage i morgen eftermiddag/aften, hvis du ikke allerede har fået løst problemet inden da.
Avatar billede pnielsen Nybegynder
17. august 2001 - 00:15 #4
Det lyser som en rimelig dyr operation du er i gang med....

er du helt sikker på at indexer bliver brugt ?
Din select distinct tager ikke lang tid, hvis indexet er lagt på.. selvom du har 6 mil rækker. Det er lidt svært at sige hvor du har problemet uden at se koden. Kan du ikke lave en lille testcase ?

Ellers vil jeg råde dig til at kigge på dine sql\'er igen, og så sætte explain plan på. Den vil kunne fortælle dig step by step, hvor mange opslag og data der fortages/hentes i hvert step.

Evt kan du også bruge toad. Den kan hjælpe med det samme, og giver et godt overblik.

Oracle har også sit eget værktøj, der hedder sql Analyzer. Det følger med enterprise manager. Det er dog en noget større operation at installere for det her. Så hellere Toad!

http://www.quest.com/requests/?RequestDefID=49
Xpert Tuning
The Xpert Tuning module supplements Oracle tuning skills for developers, stepping up their application tuning capabilities. The Xpert Tuning module makes observations about a selected SQL statement and the underlying database environment, and then recommends several options to improve performance. The AutoTune feature further automates the tuning process by generating the SQL rewrites that offer the highest likelihood of improving your SQL statement.

Held og lykke.
Avatar billede teepee Nybegynder
17. august 2001 - 10:20 #5
Måske skulle du overveje at flytte behandlede rækker, så du holder antallet af rækker nede. Ellers synes jeg at din fremgangsmåde lyder dyr men rimelig. Må man spørge hvilke behandlinger du laver på subselecten? For hvis det blot er summeringer, tælling eller lignende kunne dette måske også klares i én sql sætning. Oracle har jo altså mulighed for både at lave procedure kald i SQL og har desuden lidt ekstra features ud over ansi standarden.
Avatar billede splatter Nybegynder
17. august 2001 - 10:43 #6
hmm.. ville have givet pnielsen 30 point for TOAD rådet... men det gik åbenbart galt og nu er spørgsmålet lukket...hmmmm.. men det er sådan set også lige meget... (længe siden jeg har brugt eksperten..)

Jeg kigger lidt på TOAD og vender muligvis tilbage med en testcase senere...

Forslag til løsninger er selvfølgeligt stadig yderst velkomne...
Avatar billede molan Nybegynder
21. august 2001 - 15:46 #7
Kan du ikke poste hele loop\'et, så man har en bedre ide om hvad der kan gøres.

Men kun 6 mil rækker og flere timer...det lugter af manglede brug af index (husk du skal ramme indexet rigtigt.

Send evt. en beskrivelse af indexet (all dem der er på tabellen).

Hvilken version af Oracle køre i?

Køre i cost based, så husk at se om analyze er kørt for nylig.

I øvrigt er TOAD et super værktøj, dog koster den også derefter.

En fuld TOAD med expert_tuning kost kassen.
Avatar billede molan Nybegynder
22. august 2001 - 09:42 #8
Jeg synes lige jeg vil bemærke at jeg har gjort noget linende med 5 millioner rækker på EN disk.

Det tager ikke mere en ca. 5 minutter, men skal naturligvis laves rigtigt.
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